C#使用系统方法发送异步邮件完整实例

本文实例讲述了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#窗体操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#程序设计之线程使用技巧总结》、《C#操作Excel技巧总结》、《C#中XML文件操作技巧汇总》、《C#数据结构与算法教程》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程》

希望本文所述对大家C#程序设计有所帮助。

(0)

相关推荐

  • C#实现发送邮件的三种方法

    本文实例讲述了C#实现发送邮件的三种方法.分享给大家供大家参考.具体方法分析如下: 一.问题: 最近公司由于一个R&I项目的需要,用户要求在购买产品或出货等一些环节,需要发送邮件提醒或者说每周一让系统自动采集数据发送一封E-mail,因此我也就找来相关资料,写了一个Demo分享给大家,大家共同学习学习. 二.实现代码: 通过.Net FrameWork 2.0下提供的"System.Net.Mail"可以轻松的实现,本文列举了3种途径来发送: 1.通过Localhost: 2.

  • c#调用qq邮箱smtp发送邮件修改版代码分享

    复制代码 代码如下: try            {                MailMessage mm = new MailMessage();                MailAddress Fromma = new MailAddress("xxxx@qq.com");                MailAddress Toma = new MailAddress("MMMMMMM@qq.com", null);              

  • C#使用smtp发送带附件的邮件实现方法

    本文实例讲述了C#使用smtp发送带附件的邮件实现方法.可直接将string类型结果保存为附件.分享给大家供大家参考.具体分析如下: 该方式直接保存为HTML文件,也可以是文本文件,其它格式效果不是很好 复制代码 代码如下: MailMessage mmsg = new MailMessage(); mmsg.Subject = "邮件标题"; mmsg.Body = "邮件内容"; mmsg.To.Add("accept@qq.com");//

  • c#利用system.net发送html格式邮件

    复制代码 代码如下: using System;using System.Text;using System.Net;using System.Net.Mail;using System.Net.Mime; namespace LeeStudio.Basic{/// <summary>/// 邮件发送类/// </summary>public class SendEmail{private MailMessage mailMessage = new MailMessage(); /

  • C#.NET采用HTML模板发送电子邮件完整实例

    本文实例讲述了C#.NET采用HTML模板发送电子邮件的方法,是非常实用的技巧.分享给大家供大家参考.具体方法如下: 要使用html模板进行发送邮件,需要准备以下几项工作: 1)HTML模板 2)替换函数(替换模板中绑定的变量) 3)邮件函数(发送邮件) 一.HTML模板 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm

  • C# 邮件发送和接收实现代码

    邮件发送 方法一:使用System.Web.Mail命名空间(此方法我测试没有成功过)  复制代码 代码如下: #region 发送邮件:此方法失败 protected void SendFailed() { System.Web.Mail.MailMessage mail = new System.Web.Mail.MailMessage(); mail.From = "test@ gmail.com"; mail.To = " test@ gmail.com "

  • C#中发送邮件代码

    始找的代码只能发送无SMTP验证的邮件,但现在很多EMAIL发送时都需要验证,后来查找了下MSDN的帮助,找到了发送验证的代码,贴出来希望对大家有所帮助! 复制代码 代码如下: public static int sendmail(string to, string body,string subject) { try { int nContain = 0; ///添加发件人地址 string from = "你的发送EMAIL"; MailMessage mailMsg = new

  • c#实现服务器性能监控并发送邮件保存日志

    客户端代码 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.ServiceProcess;using System.Text;using System.Threading;using System.Management;using System.Configurat

  • c# SendMail发送邮件实例代码

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Net;using System.Net.Mail;using System.Text; namespace Common{    /// <summary>    /// 基于system.net.mail发送邮件,支持附件    /// </summary>    public class NetSendMail    {        p

  • C#实现SMTP邮件发送程序实例

    通常来说邮件发送功能在网站应用程序中经常会用到,包括大家经常看到的博客,在添加评论后,系统会自动发送邮件通知到我邮箱的,把系统发送邮件的功能整理了下,本文展示了一个客户端Demo,希望对有需要的朋友有所帮助.运行效果如下图所示: 核心代码如下: 复制代码 代码如下: using System; using System.Net; using System.Net.Mail; using System.Text; namespace HC.Email {     /// <summary>   

  • C#使用MailAddress类发送html格式邮件的实例代码

    1.首先引入命名空间using System.Net.Mail;2.将发送的邮件的功能封装成一个类,该类中包含了发送邮件的基本功能:收件人(多人),抄送(多人),发送人,主题,邮件正文,附件等,封装的Email类如下: 复制代码 代码如下: public class Email    {        /// <summary>        /// 发送者        /// </summary>        public string mailFrom { get; set

随机推荐