前言
發送郵件的方式有很多種,比如通過.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郵箱的密碼需要使用授權碼