前言
发送邮件的方式有很多种,比如通过.net框架内置的SmtpClient来实现邮件发送,使用开源项目LumiSoft.Net等,这里就讲一下如何使用System.Net.Mail命名空间下的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。
原理图
二、前置工作
1.准备两个测试用的邮箱(这里使用qq邮箱)
2.为邮箱开启POP3/SMTP服务 和 IMAP / SMTP服务(qq邮箱 需要在设置->账户下开启)
三、开始coding
1.创建MailMessage对象来编辑邮件正文,并指明发送者和接收者
2.创建SmtpClient对象来发送邮件,需要指明邮件发送者的的账号和密码(qq邮箱要使用授权码)
3.示例代码

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Mail; using System.Security; using System.Text; using System.Threading.Tasks; namespace MailTest { class Program { static void Main(string[] args) { string fromMail = "27***7200@qq.com"; string toMail = "137***126@qq.com"; SendMail(fromMail, toMail); Console.WriteLine("ok!"); Console.ReadKey(); } static void SendMail(string fromMail, string toMail) { MailMessage mailMessage = new MailMessage { //发件人 From = new MailAddress(fromMail) }; //收件人 可以添加多个收件人 mailMessage.To.Add(new MailAddress(toMail)); //mailMessage.CC 获取包含此电子邮件的抄送(CC)收件人的地址集合 //邮件主题 mailMessage.SubjectEncoding = Encoding.UTF8; mailMessage.Subject = "Hello"; //邮件正文 mailMessage.BodyEncoding = Encoding.UTF8; mailMessage.Body = "<p style='color:red;font-size:14px;'>邮件测试</p>"; //如果要发送html格式的消息,需要设置这个属性 mailMessage.IsBodyHtml = true; //邮件内容即消息正文中中显示图片 //需要为图片指明src='cid:idname(资源id)' AlternateView htmlBody = AlternateView.CreateAlternateViewFromString("<img src='cid:zfp'/>", null, "text/html"); //然后在LinkedResource加入文件的绝对地址,和ContentType 例如image/gif,text/html...与http请求的响应报文中的ContentType一致 LinkedResource lr = new LinkedResource("1.gif", "image/gif"); //绑定上文中指定的idname lr.ContentId = "zfp"; //添加链接资源 htmlBody.LinkedResources.Add(lr); mailMessage.AlternateViews.Add(htmlBody); //发送附件 指明附件的绝对地址 Attachment attachment = new Attachment("1.txt"); mailMessage.Attachments.Add(attachment); //创建邮件发送客户端 try { //这里使用qq邮箱 需要在设置->账户下开启POP3/SMTP服务 和 IMAP / SMTP服务 //qq邮箱的发件服务器smtp.qq.com 端口25 SmtpClient sendClient = new SmtpClient("smtp.qq.com", 25) { //指定邮箱账号和密码 //在第三方客户端登陆qq邮箱时,密码是授权码 //登陆qq邮箱在设置->账户下可以生成授权码 Credentials = new NetworkCredential(fromMail, "xmxyldrmtvnrddfe") }; //指定如何发送电子邮件 sendClient.DeliveryMethod = SmtpDeliveryMethod.Network; //指定使用使用安全套接字ssl加密的链接 sendClient.EnableSsl = true; sendClient.Send(mailMessage); } catch { throw; } } } }
四、可能出现的异常
1.System.Net.Mail.SmtpException:“操作已超时。”
这个异常可能是邮件服务器的ip与端口出错
2.System.Net.Mail.SmtpException:“参数或变量中有语法错误。服务器响应为:mail from address must be same as authorization user”
这个异常一般是邮件发送者的账号与密码设置错误,这里再次提示一下,qq邮箱的密码需要使用授权码