SMTP Email C#
▌Introduction
System.Net.Mail.SmtpClient.SendAsync(MailMessage, Object)
後面的Object物件在文件中的解釋為UserToken,可將使用者定義的物件傳遞至非同步作業完成時叫用的方法;換句話說,我們可以定義一個Callback(回呼)讓SMTP
Client做為送完信後的觸發代碼(事件)。
如在大量送信的服務中,我們採用非同步的方法,發信前建立一個UserToken並記錄發送前的狀態,發送後再透過回呼函式取得UserToken再更新最新狀態; 有助於第一時間查明哪些可能掉信以重送。
▌Implement
▋定義一個要送給回呼函式的狀態物件
public class SendAsyncState
{
public Byte[] Token { get; private set; }
public DateTime SendTime { get; private set; }
public SendAsyncState(Byte[] token)
{
this.Token = token;
this.SendTime = DateTime.Now;
}
}
▋定義一個回呼函式
protected virtual void SmtpClientSendCompleted(object sender, AsyncCompletedEventArgs e)
{
var smtpClient = (SmtpClient)sender;
var userAsyncState = (SendAsyncState)e.UserState;
smtpClient.SendCompleted -= SmtpClientSendCompleted;
//Do something...
}
▋設定加入回呼的SMTP Client並非同步寄信
public async Task SendEmailAsync(System.Net.Mail.MailMessage msg)
{
SmtpClient smtpClient = new SmtpClient();
#region 設定完成的Callback
smtpClient.SendCompleted += this.SmtpClientSendCompleted;
#endregion
#region 開始寄信
smtpClient.SendAsync(msg, new SendAsyncState(myToken));
#endregion
}
沒有留言:
張貼留言