C# 發送郵件總結(SMTP)


一、要使用程序來發送郵件,以下幾個信息必不可少

Smtp服務器:發送郵件的服務器,如常見的smtp.163.com、smtp.qq.com,不同的服務商,發送郵件的服務器也不相同
賬號:發送郵件的郵箱賬號
密碼:郵箱密碼或授權碼(注:當你在程序中使用郵箱密碼進行發郵件,發現無法發送等問題,就要考慮郵箱是否開啟了SMTP權限,是不是需 要使用授權碼進行發郵件,像qq、163郵箱,這些郵箱是需要先開啟SMTP發送郵件的權限,當開啟后,會產生一個授權碼,這時第三方就可以使用郵件賬號加授權碼來實現發送郵件功能)
端口:默認端口25 加密端口一般是 465端口,如果不對,請自行百度查詢

二、為什么要加密發送郵件

阿里雲為了反垃圾郵件,25端口是封掉的,也就是說,如果你要使用阿里服務器發送郵件,25端口是走不通的,必須使用其他端口發送郵件,
這個時候就要用到加密端口發送郵件。如果你的項目有發送郵件的功能,且在測試服務器上發郵件是正常的,部署到阿里雲之后就不行了,
這個時候就要想到是不是服務器端口的問題。

三、郵件發送限制

 1、發送的郵件,可能會被接收方的郵件系統當做垃圾郵件攔截。
 2、程序發送郵件的速度很快的,如果在短時間內發送大量郵件,可能會被當前郵箱所在服務器攔截(郵件發送頻率太高)具體限制詳情,要 咨詢郵件服務器的管理人員。
 3、單個郵箱單日發送大量郵件,很有可能發送失敗,理論上每個郵箱所在服務器都會有單日發送郵件數量的限制,具體限制是多少,要咨詢 郵件服務器的管理人員。

四、發送郵件的函數

1、基於System.Net.Mail.MailMessage 發送郵件

    /// <summary>
    /// 發送郵件
    /// </summary>
    /// <param name="email">收件人郵箱</param>
    /// <param name="title">標題</param>
    /// <param name="content">發送內容</param>
    /// <returns></returns>
    public static bool SendEmail(string email,string title,string content)
    {
        string _smtpServer = "smtp.163.com";   //SMTP服務器
        string _userName = "test@163.com";   //郵箱
        string _pwd = "test";   //密碼或授權碼

        if(_smtpServer == "" || _userName == "" || _pwd == "") {
            return false;
        }
        
        using(System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage()) {
            /*   
           * msg.To.Add("b@b.com");可以發送給多人   
           */
            msg.To.Add(email);  //設置收件人

            /*  
            * msg.CC.Add("c@c.com");   
            * msg.CC.Add("c@c.com");可以抄送給多人   
            */

            /* 3個參數分別是 發件人地址(可以隨便寫),發件人姓名,編碼*/
            msg.From = new MailAddress(_userName,_userName,System.Text.Encoding.UTF8);


            msg.Subject = title; //郵件標題   
            msg.SubjectEncoding = System.Text.Encoding.UTF8; //郵件標題編碼   
            msg.Body = content;  //郵件內容   
            msg.BodyEncoding = System.Text.Encoding.UTF8;//郵件內容編碼   
            msg.IsBodyHtml = true; //是否是HTML郵件   
            msg.Priority = MailPriority.Normal; //郵件優先級

            SmtpClient client = new SmtpClient(_smtpServer,587); //郵件服務器地址及端口號
            client.EnableSsl = true; //ssl加密發送
            client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
            client.Credentials = new System.Net.NetworkCredential(_userName,_pwd); //郵箱賬號  密碼
            client.Timeout = 6000;  //6秒超時

            try {
                client.Send(msg);  //發送郵件

                client.Dispose();  //釋放資源
                return true;
            } catch(System.Net.Mail.SmtpException ex) {
                return false;
            }
        }
    }

缺點:最近發現該方法不支持163郵箱加密發送,為此在網上找了很久,最終發現System.Net.Mail只支持顯式SSL(ExplicitSSL),但是不支持隱式SSL(Implicit SSL),所以會造成163郵箱發送超時的問題,其他郵箱可能也有同樣的問題,需要自行測試,如碰到163郵箱加密發送發送超時問題,可以使用下面的發送郵件函數來解決。

2、基於System.Web.Mail 發送郵件(用於解決163郵箱加密發送超時問題,該函數微軟已棄用,如果不是特殊情況,不推薦使用該函數)

    /// <summary>
    /// 發送郵件
    /// </summary>
    /// <param name="emails">收件人的郵箱</param>
    /// <param name="title">郵件標題</param>
    /// <param name="content">郵件內容(支持Html)</param>
    public static bool SendEmailBack(List<string> emails,string title,string content)
    {
        string _smtpServer = "smtp.163.com";    //發郵件smtp服務器名稱              
        string _userEmail = "test@163.com"; //發送人郵箱地址               
        string _pwd = "test";               //發郵件郵箱的密碼或授權碼

        System.Web.Mail.MailMessage _msg = new System.Web.Mail.MailMessage();
        //郵件主題
        _msg.Subject = title;
        _msg.BodyFormat = System.Web.Mail.MailFormat.Html;
        //郵件正文
        _msg.Body = content;
        //正文編碼
        _msg.BodyEncoding = Encoding.UTF8;
        //優先級
        _msg.Priority = System.Web.Mail.MailPriority.Normal;
        //發件者郵箱地址
        _msg.From = _userEmail;
        //收件人收箱地址
        string _toEmail = "";
        emails.ForEach(s => { _toEmail += s + ","; });

        //_msg.Cc = _toEmail.TrimEnd(',');   //抄送
        _msg.To = _toEmail.TrimEnd(',');   //收件人
        
        _msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate","1");
        //用戶名
        _msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername",_userEmail);
        //密碼
        _msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword",_pwd);
        //端口
        _msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport",465);
        //是否ssl
        _msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl",true);
        //Smtp服務器
        System.Web.Mail.SmtpMail.SmtpServer = _smtpServer;

        try {
            System.Web.Mail.SmtpMail.Send(_msg);
            return true;
        } catch(SmtpException e) {
            return false;
        }
    }

總結:

163郵箱使用SSL端口發送時出現異常:操作超時,查了好久,發現是因為:System.Net.Mail只支持顯式SSL(ExplicitSSL),但是不支持隱式SSL(Implicit SSL),此問題似乎可以用System.Web.Mail或Cdosys.dll解決,System.Web.Mail 測試下來是可以使用的,Cdosys.dll沒有用過。
顯式SSL通過25端口連接 -> StartTLS(開始加密)-> 驗證 -> 發送數據
隱式SSLStartSSL(開始加密) -> 連接 -> 驗證 -> 發送數據

以上內容僅為個人見解

總結摘抄自:https://zhaoqi.vip/3123403799.html 感興趣的同學可以看一下


免責聲明!

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



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