C# 服務器發送郵件失敗


  郵件發送相關端口

  首先說下郵件發送的端口:25/465/587

  25端口

  25端口是為SMTP協議服務開放的,是這三個端口中最老的一個。25端口也稱為消息中繼端口,因為這個端口經常被惡意利用,所以現在這個端口主要用於郵件服務器之間的消息轉發,而且現在國內的雲服務器如阿里雲騰訊雲等等都是默認禁用25端口的。

  465端口

  465端口是為SMTPS(SMTP-over-SSL)協議服務開放的,而SMTPS是SMTP協議基於SSL安全協議之上的一種變種協議,它繼承了SSL安全協議的非對稱加密的高度安全可靠性,可防止郵件泄露,SMTP與SMTPS的關系類似HTTP與HTTPS的關系。465端口並未被IETF認可,因此那些嚴格准招Internet標准的公司可能也沒有認可,但是在國內環境被作為25端口的替代端口。

  587端口

  587端口是郵件客戶端向郵件服務器提交消息的推薦端口,是STARTTLS協議的,屬於TLS通訊協議,也稱為消息提交端口。客戶端通過587端口提交消息,然后服務器之間通過25端口轉發,這是一個理想模式。

  

 

  問題

    如下面發郵件的代碼  

    string host = "smtp.exmail.qq.com";//qq郵箱
    int port = 25;//25 465 587
    string from = "123456@qq.com";
    string to = "456789@qq.com";
    string userName = "123456@qq.com";
    string password = "123456";

    MailMessage message = new MailMessage();
    message.From = new MailAddress(from);
    message.To.Add(new MailAddress(to));
    message.Body = "test body";
    message.Subject = "test subject";
    message.IsBodyHtml = true;
    message.SubjectEncoding = Encoding.UTF8;

    SmtpClient client = new SmtpClient(host, port);
    client.UseDefaultCredentials = true;
    client.Credentials = new NetworkCredential(userName, password);
    client.Send(message);

  上面發郵件使用的是System.Net.Mail,如果使用的本地環境,是可以發送郵件的,可如果部署到服務器上,特別是雲服務器,可能郵件就發不出來了,這個很可能是因為25端口被禁用,所以需要開啟服務器的25端口(阿里雲騰訊雲等25端口開啟要申請),而網上推薦使用465端口,但是System.Net.Mail貌似不支持465端口,可能與上面說的465端口未被IETF認可有關吧。

  System.Net.Mail不支持465端口不表示465端口不可用,如果是.net framework,可以使用System.Web.Mail來使用465端口,如果是.net core,可以使用MailKit,不僅支持465,還支持25和587端口,可以使用nuget安裝MailKit    

    string host = "smtp.exmail.qq.com";//qq郵箱
    int port = 465;//25 465 587
    string from = "123456@qq.com";
    string to = "456789@qq.com";
    string userName = "123456@qq.com";
    string password = "123456";
    
    var message = new MimeMessage();
    message.From.Add(new MailboxAddress(from));
    message.To.AddRange(new MailboxAddress[] { new MailboxAddress(to) });
    message.Subject = "test subject";
    var entity = new TextPart(TextFormat.Html)
    {
        Text = "test body"
    };
    SmtpClient client = new SmtpClient();
    client.Connect(host, port, port == 465);//465端口是ssl端口
    client.Authenticate(userName, password);
    client.Send(message);
    client.Disconnect(true);

  


免責聲明!

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



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