C#使用SmtpClient发送邮件

摘要:
QQ的Smtp服务器接收到邮件消息后会将之存储在QQ邮箱的邮件存储设备上。原理图使用的对象:smtpClient类:允许应用程序使用简单邮件传输协议发送电子邮件。MailAddress类:MailAddress类表示电子邮件的地址。  MailMessage类:MailMessage类是.NETFramework中管理邮件的专用类,表示可以使用SmtpClient类发送的电子邮件。若要指定电子邮件的发件人、收件人和内容,可以使用MailMessage类的关联属性。SmtpClient类是客户端类,客户端的Send方法实现了发送邮件的功能。

原理: 

例如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。

原理图

C#使用SmtpClient发送邮件第1张

使用的对象
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 classSmtpEmailHelper
    {
        #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>
        publicSmtpEmailHelper()
        {
        }
        /// <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, stringmailTo)
        {
            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 = newSystem.Net.Mail.MailMessage();
            mailMessage.From = newMailAddress(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 inattachments)
                {
                    if (!string.IsNullOrWhiteSpace(attachment) &&System.IO.File.Exists(attachment))
                    {
                        //建立邮件附件类的一个对象,语法格式为System.Net.Mail.Attachment(文件名,文件格式)  
                        var AttFile = newAttachment(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(newMailAddress(to));
                }
            }
            if (null !=mailCC)
            {
                foreach (var cc in mailCC.Where(m => !string.IsNullOrWhiteSpace(m)))
                {
                    mailMessage.CC.Add(newMailAddress(cc));
                }
            }
            if (null !=bccs)
            {
                foreach (var bcc in bccs.Where(m => !string.IsNullOrWhiteSpace(m)))
                {
                    mailMessage.Bcc.Add(newMailAddress(bcc));
                }
            }
            //创建Smtp客户端
            SmtpClient client = newSmtpClient();
            client.Credentials = newSystem.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

免责声明:文章转载自《C#使用SmtpClient发送邮件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇dotnet 判断程序当前使用管理员运行降低权使用普通权限运行proxysql 系列 ~ 高可用架构下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在C#中利用SharpZipLib进行文件的压缩和解压缩收藏

我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net(http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx)下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手。只好耐下心来,慢慢的研究,总算找到了门路。...

android的几种“通知”方式简单实现(Notification&amp;amp;NotificationManager)

  关于通知Notification相信大家都不陌生了,平时上QQ的时候有消息来了或者有收到了短信,手机顶部就会显示有新消息什么的,就类似这种。今天就稍微记录下几种Notification的用法。3.0以前的通知和3.0以后的通知是有些区别的。话不多说,直接上代码。   1、新建一个android项目     我新建项目的 minSdkVersion="1...

从为知笔记收费说起

很早写的一片 日志,分享下: 今天得知为知笔记收费的消息,我便随即补上了一年的vip,一年只需要50元,折算到每一天的价格只有1毛3,从这样的价格上看,为知笔记团队的处境有多艰难以及作这个决定的无奈与坚定。 是的,中国互联网的免费时代 已经一去不复返了,从各大“云”的关闭到音乐、影视剧版权的风生水起,最后是神器快播的被告——是的,快播并不是因为传播A片倒...

GeeTest 极验验证

 前台Html页面 <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> <script src="http://static.geetest.com/static/tools/gt.js"></script>...

封装两个简单的Jquery组件

Jquery给我们提供了很大的方便,我们把他看成是一个公共库,以致在这个公共库上延伸出了很多Jquery插件;在项目过程中,有些插件总是不那么令人满意; 主要说两个项目用途: 1、 遮罩层,跟一般的遮罩层不一样,我需要实现的是对某一个元素进行局部遮罩; 2、 冒泡提示,网上有很多,我需要的只是一种在页面指定位置弹出来的一个静止定位的div而已;两个就自己了...

commons-pool2 实现 sftp 连接池

简介 ssh 默认的连接数量有限,当大量请求连接 ssh 时会概率性连接失败甚至直接失败,因此需要对连接池化,当然如果不要求实时的话可以用生产者消费者。 了解 commons-pool2 依赖 <dependency> <groupId>org.apache.commons</groupId> <a...