2013-08-29 1 views
2

Je veux envoyer un courriel à 5 ​​comptes de messagerie différents, mon problème est dans le code suivant chaque fois que j'active cette ligne de code qui a "---- > cette ligne "ça marche bien mais quand je désactive ces lignes ça envoie cinq email à un compte mail et rien aux autres.envoyer un courriel de l'hôte de messagerie à cinq différents comptes de messagerie en utilisant C#

Est-ce que quelqu'un sait quel est le problème avec mon code?

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

Ceci est clairement un problème avec la façon dont vous envoyez les mails et non avec ces lignes. – tnw

+0

quel est le problème? pourriez-vous me donner un indice s'il vous plait? – user2730833

+0

Le problème est clairement indiqué: "il envoie cinq email à un compte email et rien à d'autres" –

Répondre

2

Vous stockez la mailMessage en tant que propriété du formulaire et l'adresse devient changé par un autre thread avant qu'il ne soit réellement envoyé. L'ajout du MessageBox permet à un fil de finir avant qu'un autre ne commence. Il suffit de changer sentMail pour créer une nouvelle MailMessage au lieu de réutiliser l'existant et vous devriez être bien:

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

merci beaucoup. Il a résolu le problème. mais maintenant il envoie des emails en même temps pendant que je définis Thread.Sleep (2000); J'ai besoin qu'il envoie un email à chaque compte de messagerie avec un retard. quand j'ai vérifié mes différents comptes de courrier électronique, j'ai vu qu'ils étaient tous envoyés en même temps. alors que ce n'était pas un problème quand j'ai utilisé l'ancien code avec ces lignes activées. une idée pourquoi? – user2730833

+0

Eh bien c'est seulement un délai de 2 secondes, donc il peut ne pas être perceptible. Cela peut être une fonction du serveur SMTP et/ou POP que vous utilisez - le serveur SMTP peut ne pas envoyer de courrier au moment précis où il reçoit les données SMTP. L'email n'est pas conçu pour être instantané. –

+0

Je teste plus long Tread.Sleep (5000); mais le résultat est le même qu'avant. Connaissez-vous une autre fonction du serveur SMPT ou POP qui peut le résoudre? merci – user2730833

1

Vous réutilisez l'objet mailMessage. Je soupçonne que les lignes que vous avez commentées ralentissent suffisamment le traitement pour que les 5 messages distincts soient envoyés correctement/le fil complet. Quand ils ne sont pas là, vous obtenez le comportement étrange que les threads accèdent au même objet.

Allait nettoyer le code ici, mais @D_Stanley vous a couvert.

+1

Pour ajouter à la réponse de @ Matthew, faites simplement de 'mailMessage' une variable locale dans la fonction. Pourquoi est-ce une variable de classe, de toute façon? –

Questions connexes