C#使用SmtpClient发送邮件

原理: 

  例如A使用163邮箱发送邮件给B(qq邮箱)。首先A会把邮件通过SMTP(Simple Mail Transfer Protocol)协议传输到163的Smtp服务器上,163的Smtp服务器会根据B的邮箱账号,把邮件通过Smtp协议发给QQ邮箱的Smtp服务器。QQ的Smtp服务器接收到邮件消息后会将之存储在QQ邮箱的邮件存储设备上。当B登陆QQ邮箱后,如果有新邮件,POP3服务器就会从QQ邮箱的邮件存储设备上读出邮件并通过POP3/IMAP服务发送给邮件客户端的B。

  原理图

  

 

使用的对象
      smtpClient类:允许应用程序使用简单邮件传输协议 (SMTP) 发送电子邮件。

      MailAddress类:MailAddress类表示电子邮件的地址。该类结合SmtpClient类或MailMessage类使用,其实例存储了电子邮件的地址信息。  

      MailMessage 类:MailMessage类是.NET Framework中管理邮件的专用类,表示可以使用SmtpClient类发送的电子邮件。MailMessage 类的实例表示一个电子邮件的所有内容,并用SmtpClient类来传输到SMTP服务器。若要指定电子邮件的发件人、收件人和内容,可以使用 MailMessage类的关联属性。 

      NetworkCredential类:为基于密码的身份验证方案(如基本、简要、NTLM 和 Kerberos 身份验证)提供凭据。

C#邮件传输主要用到了

SmtpClient 和MailMessage 类。
SmtpClient类是客户端类,客户端的Send方法实现了发送邮件的功能。Send方法的参数是MailMessage对象。
MailMessage类是邮件信息类,通过From属性可以设置发送者。To属性设置接受者。CC抄送者。
Subject 标题;Body、内容。

注意:SmtpClient 的用户名和MailMessage 的发送者要保持一致。
要引用 System.Net.Mail

    /// <summary>
    /// 发送邮件类
    /// </summary>
    public class SmtpEmailHelper
    {
        #region Properties

        /// <summary>
        /// 发送邮箱全地址
        /// </summary>
        public string SmtpUserName { get; set; }

        /// <summary>
        /// 发送邮箱显示名
        /// </summary>
        public string SmtpDisplayName { get; set; }

        /// <summary>
        /// 发送邮箱密码
        /// </summary>
        public string SmtpPassWord { get; set; }

        /// <summary>
        /// 邮箱服务器地址
        /// </summary>
        public string SmtpServer { get; set; }

        /// <summary>
        /// 邮箱服务器端口
        /// </summary>
        public int SmtpPort { get; set; }

        /// <summary>
        /// 是否ssl加密
        /// </summary>
        public bool SmtpEnableSsl { get; set; }

        #endregion

        /// <summary>
        /// 
        /// </summary>
        public SmtpEmailHelper()
        {
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="userName">发送邮箱全地址</param>
        /// <param name="passWord">发送邮箱密码</param>
        /// <param name="displayName">发送邮箱显示名</param>
        /// <param name="server">邮箱服务器地址</param>
        /// <param name="port">邮箱服务器端口</param>
        /// <param name="enableSsl">是否ssl加密</param>
        public SmtpEmailHelper(string userName, string passWord, string displayName, string server, int port, bool enableSsl = true) : this()
        {
            this.SmtpUserName = userName;
            this.SmtpPassWord = passWord;
            this.SmtpDisplayName = displayName;
            this.SmtpServer = server;
            this.SmtpPort = port;
            this.SmtpEnableSsl = enableSsl;
        }

        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="subject">主题</param>
        /// <param name="body">内容消息正文</param>
        /// <param name="mailTo">收件人</param>
        /// <returns></returns>
        public bool Send(string subject, string body, string mailTo)
        {
            string[] arrMailTo = new string[] { mailTo };
            string[] attachments = null;
            MailPriority priority = MailPriority.Normal;
            return Send(subject, body, arrMailTo, null, attachments, null, System.Text.Encoding.UTF8, priority, true);
        }

        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="subject">主题</param>
        /// <param name="body">内容消息正文</param>
        /// <param name="mailTo">收件人</param>
        /// <param name="attachments">附件</param>
        /// <returns></returns>
        public bool Send(string subject, string body, string mailTo, string[] attachments)
        {
            string[] arrMailTo = new string[] { mailTo };
            MailPriority priority = MailPriority.Normal;
            return Send(subject, body, arrMailTo, null, attachments, null, System.Text.Encoding.UTF8, priority, true);
        }

        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="subject">主题</param>
        /// <param name="body">内容消息正文</param>
        /// <param name="mailTo">收件人</param>
        /// <param name="mailCC">抄送人</param>
        /// <param name="attachments">附件</param>
        /// <returns></returns>
        public bool Send(string subject, string body, string mailTo, string[] mailCC, string[] attachments)
        {
            string[] arrMailTo = new string[] { mailTo };
            MailPriority priority = MailPriority.Normal;
            return Send(subject, body, arrMailTo, mailCC, attachments, null, System.Text.Encoding.UTF8, priority, true);
        }

        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="subject">主题</param>
        /// <param name="body">内容消息正文</param>
        /// <param name="mailTo">收件人</param>
        /// <param name="attachments">附件</param>
        /// <param name="priority">邮件优先级</param>
        /// <returns></returns>
        public bool Send(string subject, string body, string[] mailTo, string[] attachments, MailPriority priority = MailPriority.Normal)
        {
            return Send(subject, body, mailTo,null, attachments, null, System.Text.Encoding.UTF8, priority, true);
        }

        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="subject">主题</param>
        /// <param name="body">内容消息正文</param>
        /// <param name="mailTo">收件人</param>
        /// <param name="mailCC">抄送人</param>
        /// <param name="attachments">附件</param>
        /// <param name="bccs">密件抄送地址</param>
        /// <param name="bodyEncoding">编码</param>
        /// <param name="priority">邮件优先级</param>
        /// <param name="IsBodyHtml">是否是HTML邮件</param>
        /// <returns></returns>
        public bool Send(string subject, string body,string[]  mailTo,string[] mailCC,string[] attachments, string[] bccs, System.Text.Encoding bodyEncoding, MailPriority priority = MailPriority.Normal, bool IsBodyHtml = true )
        {
            //创建Email实体
            System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage();
            mailMessage.From = new MailAddress(SmtpUserName, SmtpDisplayName,bodyEncoding);
            mailMessage.Subject = subject;
            mailMessage.SubjectEncoding = bodyEncoding;//邮件标题编码
            mailMessage.Body = body;
            mailMessage.BodyEncoding = bodyEncoding;//邮件内容编码
            mailMessage.IsBodyHtml = true;//是否是HTML邮件
            mailMessage.Priority = priority;//邮件优先级

            //插入附件
            if (attachments != null)
            {
                foreach (var attachment in attachments)
                {
                    if (!string.IsNullOrWhiteSpace(attachment) && System.IO.File.Exists(attachment))
                    {
                        //建立邮件附件类的一个对象,语法格式为System.Net.Mail.Attachment(文件名,文件格式)  
                        var AttFile = new Attachment(attachment, System.Net.Mime.MediaTypeNames.Application.Octet);
                        AttFile.Name = System.IO.Path.GetFileName(attachment);
                        AttFile.NameEncoding = bodyEncoding;
                        // MIME协议下的一个对象,用以设置附件的创建时间,修改时间以及读取时间
                        System.Net.Mime.ContentDisposition disposition = AttFile.ContentDisposition;
                        disposition.CreationDate = System.IO.File.GetCreationTime(attachment);
                        disposition.ModificationDate = System.IO.File.GetLastWriteTime(attachment);
                        disposition.ReadDate = System.IO.File.GetLastAccessTime(attachment);
                        mailMessage.Attachments.Add(AttFile);
                    }
                }
            }

            //插入收件人地址,抄送地址和密件抄送地址
            if (null != mailTo)
            {
                foreach (var to in mailTo.Where(m => !string.IsNullOrWhiteSpace(m)))
                {
                    mailMessage.To.Add(new MailAddress(to));
                }
            }
            if (null != mailCC)
            {
                foreach (var cc in mailCC.Where(m => !string.IsNullOrWhiteSpace(m)))
                {
                    mailMessage.CC.Add(new MailAddress(cc));
                }
            }
            if (null != bccs)
            {
                foreach (var bcc in bccs.Where(m => !string.IsNullOrWhiteSpace(m)))
                {
                    mailMessage.Bcc.Add(new MailAddress(bcc));
                }
            }
            

            //创建Smtp客户端
            SmtpClient client = new SmtpClient();
            client.Credentials = new System.Net.NetworkCredential(SmtpUserName, SmtpPassWord);
            //上述写你的邮箱和密码
            client.Port = SmtpPort; //使用的端口
            client.Host = SmtpServer;
            client.EnableSsl = SmtpEnableSsl; //经过ssl加密.
            object userState = mailMessage;
            try
            {
                //发送邮件
                client.Send(mailMessage);
                //client.SendAsync(mailMessage);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

    }
View Code

 



posted @ 2018-06-14 13:37  bxzjzg  阅读(1492)  评论(1编辑  收藏  举报