2018年6月8日 星期五

[SMTP] SMTP Client 使用非同步寄信的完成回呼功能


 SMTP   Email   C#  


Introduction


System.Net.Mail.SmtpClient組件中有一個非同步的送信方法:

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();
         //忽略如何設定SMTP Client,可參考MSDN

         #region 設定完成的Callback
         smtpClient.SendCompleted += this.SmtpClientSendCompleted;
         #endregion

          #region 開始寄信
          smtpClient.SendAsync(msg, new SendAsyncState(myToken));
          #endregion
}




沒有留言:

張貼留言