2013-08-29 2 views
2

Я хочу отправить электронное письмо на 5 разных учетных записей электронной почты, моя проблема заключается в следующем коде всякий раз, когда я активирую эту строку кода, которая имеет «---- > эта строка «он отлично работает, но когда я деактивирую эту строку, он отправляет пять сообщений электронной почты на одну учетную запись электронной почты и ничего другим.отправка электронной почты с почтового узла на пять разных учетных записей электронной почты с помощью C#

Кто-нибудь знает, что не так с моим кодом?

namespace WindowsFormsApplication9 
{ 
    public partial class Form1 : Form 
    { 
     Thread t = null; 
     MailMessage mailMessage; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      //textBox1 is recipients email addresses 
      String[] to = textBox1.Text.Split(';'); 

      foreach (String s in to) 
      { 
       Object[] array = new Object[2]; 
       array[0] = (textBox4.Text.ToString()); 
       array[1] = (s.ToString()); 
       // MessageBox.Show(s.ToString()); -----> this line 
       t = new Thread(sentEmail); 
       t.Start(array); 
       //MessageBox.Show("from: " + array[0].ToString()); -----> this line 
       // MessageBox.Show("to: " + array[1].ToString()); ----->this line 
       Thread.Sleep(50); 


      }  

     } 


     void sentEmail(Object array) 
     { 
      Object[] o = array as Object[]; 
      SmtpClient client = new SmtpClient(); 
      client.EnableSsl = true; 
      client.Host = "smtp.gmail.com"; 
      client.Port = 587; 
      client.Credentials = new NetworkCredential(textBox4.Text, textBox5.Text); 
      mailMessage = new MailMessage(new MailAddress(o[0].ToString()), new MailAddress(o[1].ToString())); 
      mailMessage.Body = textBox3.Text; 
      mailMessage.Subject = textBox2.Text; 
      client.Send(mailMessage); 


     } 



    } 
} 
+0

Это явно проблема с тем, как вы отправляете почту, а не с этими строками. – tnw

+0

В чем проблема? не могли бы вы дать мне подсказку, пожалуйста? – user2730833

+0

В проблеме четко указано: «он отправляет пять сообщений электронной почты на одну учетную запись электронной почты и ничего другим» –

ответ

2

Вы хранение mailMessage как свойство формы, а также адрес становится изменен другим потоком, прежде чем он на самом деле послал. Добавление MessageBox позволяет завершить одну нить, начиная с другой. Просто измените sentMail создать новый MailMessage вместо использования уже существующего, и вы должны быть в порядке:

public partial class Form1 : Form 
{ 
    Thread t = null; 
    //MailMessage mailMessage; <-- take out this line 

    void sentEmail(Object array) 
    { 
     Object[] o = array as Object[]; 
     SmtpClient client = new SmtpClient(); 
     client.EnableSsl = true; 
     client.Host = "smtp.gmail.com"; 
     client.Port = 587; 
     client.Credentials = new NetworkCredential(textBox4.Text, textBox5.Text); 
     MailMessage mailMessage = new MailMessage(new MailAddress(o[0].ToString()), new MailAddress(o[1].ToString())); // <-- don't use the Form property 
     mailMessage.Body = textBox3.Text; 
     mailMessage.Subject = textBox2.Text; 
     client.Send(mailMessage); 


    } 
+0

благодарит много. Он решил проблему. но теперь он отправляет письма одновременно, в то время как я определяю Thread.Sleep (2000); Мне нужно, чтобы он отправил электронную почту на каждую учетную запись электронной почты с задержкой. когда я проверял разные учетные записи электронной почты, я видел, что все они отправляются одновременно. в то время как это не было проблемой, когда я использовал старый код с теми линиями, которые были активированы. любая идея почему? – user2730833

+0

Ну, это всего лишь 2-секундная задержка, поэтому это может быть не заметно. Это может быть функцией сервера SMTP и/или POP, который вы используете, - SMTP-сервер не может отправлять почту в то время, когда он получает данные SMTP. Электронная почта не предназначена для мгновенной работы. –

+0

Я тестирую более длинный Tread.Sleep (5000); но результат такой же, как и раньше. Знаете ли вы какую-либо другую функцию SMPT или POP-сервера, которая может ее решить? спасибо – user2730833

1

Вы повторно использовать mailMessage объект. Я подозреваю, что строки, которые вы прокомментировали, замедляют обработку, достаточную для правильного отправки 5 отдельных сообщений/завершение потока. Когда их нет, вы получаете странное поведение, когда потоки обращаются к одному и тому же объекту.

Собирался очистить код здесь, но @D_Stanley вас охватывает.

+1

Чтобы добавить к ответу от Матфея, просто сделайте 'mailMessage' локальной переменной в этой функции. Почему же это переменная класса? –