使用.net 內置的SmtpClient來實現郵件的發送


  前言  

  發送郵件的方式有很多種,比如通過.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;
            }
        }
    }
}
View Code

 

  四、可能出現的異常

  1.System.Net.Mail.SmtpException:“操作已超時。”

  這個異常可能是郵件服務器的ip與端口出錯

  2.System.Net.Mail.SmtpException:“參數或變量中有語法錯誤。服務器響應為:mail from address must be same as authorization user”

  這個異常一般是郵件發送者的賬號與密碼設置錯誤,這里再次提示一下,qq郵箱的密碼需要使用授權碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM