国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#使用系統方法發送異步郵件完整實例

2019-10-29 21:24:33
字體:
來源:轉載
供稿:網友

本文實例講述了C#使用系統方法發送異步郵件。分享給大家供大家參考,具體如下:

項目背景:

最近在對幾年前的一個項目進行重構,發現發送郵件功能需要一定的時間來處理,而由于發送是同步的因此導致在發送郵件時無法執行后續的操作

實際上發送郵件后只需要將發送結果寫入系統日志即可對其他業務沒有任何影響,因此決定將發送郵件操作更改為異步的

由于使用的是C#的郵件類庫,而C#本身已經提供了異步發送的功能即只需要將Send方法更改為SendAsync即可,更改方法名并不難但發送后再寫入日志就有點難了

因為項目中發送郵件是單獨的組件,所以我不可能在發送郵件類庫中直接添加寫入日志操作(不在同一個類庫,網絡和MSDN上的例子都是同一組件下)

但C#可以使用委托將方法作為參數來傳遞的,因此我就可以在發送郵件的方法中添加一個回調方法,在異步發送郵件后再執行回調方法即可

完整代碼:

/****************************************************************** * 創建人:HTL * 說明:C# 發送異步郵件Demo *******************************************************************/using System;using System.Net.Mail;namespace SendAsyncEmailTest{  class Program  {    const string dateFormat = "yyyy-MM-dd :HH:mm:ss:ffffff";    static void Main(string[] args)    {      Console.WriteLine("開始異步發送郵件,時間:" + DateTime.Now.ToString(dateFormat));      new MailHelper().SendAsync("Send Async Email Test", "This is Send Async Email Test", "huangyuan413026@163.com", emailCompleted);      Console.WriteLine("郵件正在異步發送,時間:" + DateTime.Now.ToString(dateFormat));      Console.ReadKey();      Console.WriteLine();    }    /// <summary>    /// 郵件發送后的回調方法    /// </summary>    /// <param name="message"></param>    static void emailCompleted(string message)    {      //延時1秒      System.Threading.Thread.Sleep(1000);      Console.WriteLine();      Console.WriteLine("郵件發送結果:/r/n" + (message == "true" ? "郵件發送成功" : "郵件發送失敗") + ",時間:" + DateTime.Now.ToString(dateFormat));      //寫入日志    }  }  /// <summary>  /// 發送郵件類  /// </summary>  public class MailHelper  {    public delegate int MethodDelegate(int x, int y);    private readonly int smtpPort = 25;    readonly string SmtpServer = "smtp.baidu.com";    private readonly string UserName = "support@baidu.com";    readonly string Pwd = "baidu.com";    private readonly string AuthorName = "BaiDu";    public string Subject { get; set; }    public string Body { get; set; }    public string Tos { get; set; }    public bool EnableSsl { get; set; }    MailMessage GetClient    {      get      {        if (string.IsNullOrEmpty(Tos)) return null;        MailMessage mailMessage = new MailMessage();        //多個接收者        foreach (string _str in Tos.Split(','))        {          mailMessage.To.Add(_str);        }        mailMessage.From = new System.Net.Mail.MailAddress(UserName, AuthorName);        mailMessage.Subject = Subject;        mailMessage.Body = Body;        mailMessage.IsBodyHtml = true;        mailMessage.BodyEncoding = System.Text.Encoding.UTF8;        mailMessage.SubjectEncoding = System.Text.Encoding.UTF8;        mailMessage.Priority = System.Net.Mail.MailPriority.High;        return mailMessage;      }    }    SmtpClient GetSmtpClient    {      get      {        return new SmtpClient        {          UseDefaultCredentials = false,          Credentials = new System.Net.NetworkCredential(UserName, Pwd),          DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,          Host = SmtpServer,          Port = smtpPort,          EnableSsl = EnableSsl,        };      }    }    //回調方法    Action<string> actionSendCompletedCallback = null;    ///// <summary>    ///// 使用異步發送郵件    ///// </summary>    ///// <param name="subject">主題</param>    ///// <param name="body">內容</param>    ///// <param name="to">接收者,以,分隔多個接收者</param>    //// <param name="_actinCompletedCallback">郵件發送后的回調方法</param>    ///// <returns></returns>    public void SendAsync(string subject, string body, string to, Action<string> _actinCompletedCallback)    {      if (string.IsNullOrEmpty(to)) return;      Tos = to;      SmtpClient smtpClient = GetSmtpClient;      MailMessage mailMessage = GetClient;      if (smtpClient == null || mailMessage == null) return;      Subject = subject;      Body = body;      EnableSsl = false;      //發送郵件回調方法      actionSendCompletedCallback = _actinCompletedCallback;      smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);      try      {        smtpClient.SendAsync(mailMessage, "true");//異步發送郵件,如果回調方法中參數不為"true"則表示發送失敗      }      catch (Exception e)      {        throw new Exception(e.Message);      }      finally      {        smtpClient = null;        mailMessage = null;      }    }    /// <summary>    /// 異步操作完成后執行回調方法    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e)    {      //同一組件下不需要回調方法,直接在此寫入日志即可      //寫入日志      //return;      if (actionSendCompletedCallback == null) return;      string message = string.Empty;      if (e.Cancelled)      {        message = "異步操作取消";      }      else if (e.Error != null)      {        message = (string.Format("UserState:{0},Message:{1}", (string)e.UserState, e.Error.ToString()));      }      else        message = (string)e.UserState;      //執行回調方法      actionSendCompletedCallback(message);    }  }}

運行效果圖如下:

C#,系統方法,發送,異步,郵件

 


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九龙城区| 巴青县| 河南省| 深圳市| 大足县| 博白县| 灵山县| 翁源县| 德清县| 建德市| 五大连池市| 苍溪县| 台东市| 青海省| 新安县| 韩城市| 乳源| 三河市| 高邮市| 横峰县| 永新县| 延川县| 全州县| 旅游| 福泉市| 子洲县| 定兴县| 哈巴河县| 雷波县| 广水市| 洛宁县| 六枝特区| 田阳县| 遂昌县| 峨眉山市| 贡觉县| 婺源县| 民丰县| 永昌县| 马尔康县| 来凤县|