2012-01-09 71 views
0

我正在嘗試構建一個從我的網站發送簡訊的系統。我如何得到郵件通過SmtpClient C#發送的事件

我正在構建它作爲控制檯應用程序,然後我將從Windows調度程序每天執行。

我想在系統中進行一些日誌記錄,所以我添加了最簡單的日誌「功能」。

郵件發送正常,但我想在郵件發送時寫入日誌。問題是我不知道如何在發送郵件或郵件未發送時從SmtpClient獲取事件。

public void SendMails(List<Agent> agents, string logfilename) 
{ 
    foreach (Agent agent in agents) 
    { 
     MailMessage mail = new MailMessage(); 
     mail..... 

     SmtpClient client = new SmtpClient(); 
     client..... 

     try 
     { 
      client.Send(mail); 
      WriteLog(logfilename, "Sent mail to: " + mail.To[0].Address); 
     } 
     catch (SmtpException smtpexception) 
     { 
      WriteLog(logfilename, "SMTP EXCEPTION: " + smtpexception.Message); 
     } 
     catch (Exception e) 
     { 
      WriteLog(logfilename, "EXCEPTION: " + e.Message); 
     } 
    } 
} 

public void WriteLog(string filename, string message) 
{ 
    TextWriter tw = new StreamWriter(@"c:\MailLogs\" + filename + ".txt"); 
    tw.WriteLine(message); 
    tw.Close(); 
} 

所以,我該如何更改代碼,這樣我就可以寫日誌後,這個程序實際上知道郵件是否發送或不...

回答

1

如果執行行client.Send(mail);這是不異步,它不會拋出一個異常,這意味着郵件已經發送。

無論它是否已發送,您將無法看到,因爲它是由您的smtp服務器處理的,據我所知SmtpClient不支持該事件。

+0

是的,但郵件將排隊在smtp服務器上,程序結束之前可能會拋出任何異常,因爲例外被延遲。我試着用幾個地址進行測試,併發送了所有的郵件,但並不是所有的日誌文件都被寫入了。 – Jesper 2012-01-09 12:02:51

+0

我無法看到所有的日誌行是如何寫入的,原因是「發送郵件到:」日誌行不會執行的唯一方式是如果拋出異常並且不應該發送郵件。您是否正在使用多個線程,並且在WriteLog方法中發生錯誤?嘗試將其寫入控制檯/調試而不是文件,並查看是否輸出所有郵件。 – 2012-01-09 12:15:55

+0

如果我在主方法的末尾添加Console.ReadLine(),並讓它坐在那裏等待。所有行都寫入。如果沒有,即使郵件被髮送,似乎最後一些日誌也沒有被寫入......這就是事實。 – Jesper 2012-01-09 12:18:14

0

SmtpClient sc = new SmtpClient();

sc.SendCompleted + = new SendCompletedEventHandler(SendAsyncCallback);

0

你的代碼現在正在這麼做。如果WriteLog()確實寫入Sent Email to...,則意味着郵件已經被髮送。