2013-08-29 2 views
2
나는 5 개 개의 다른 이메일 계정으로 이메일을 전송 할

를 사용하여 다섯 가지의 이메일 계정에 g 메일 호스트에서 이메일을 보낼 때마다 활성 I "이 코드의 그 라인 ---- >이 줄 "잘 작동하지만 그 줄을 비활성화하면 하나의 전자 메일 계정에 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을 추가하면 하나의 스레드가 완료되고 다른 스레드가 시작될 수 있습니다. 그냥 새로운 MailMessage를 만드는 대신 기존의 것을 재사용하는 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

. 내가 주석 처리 한 행은 처리 속도가 느려서 5 개의 별개의 메시지가 올바르게 전송되거나 스레드가 완료되었다고 의심됩니다. 스레드가 존재하지 않을 때 스레드가 동일한 개체에 액세스 할 때 이상한 동작을 얻고 있습니다.

여기에 코드를 정리하려고했지만, @D_Stanley 당신이 덮여있다.

+1

@ Matthew의 답변에 덧붙이면, 단지'mailMessage'를 함수의 지역 변수로 만드십시오. 그것은 어쨌든 왜 클래스 변수입니까? –