1. 程式人生 > >郵件 事務失敗 伺服器響應為 DT SPM 163 smtp

郵件 事務失敗 伺服器響應為 DT SPM 163 smtp

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                       

幾年前我做的一個專案,日發郵件最高峰時幾十萬。自以為對郵件傳送方面已經有了一定認識,所以近期機緣巧合之下,又有專案需要傳送郵件,不禁自信滿滿,暗自慶幸能不手到擒來乎?

不想老革命遇到新問題。我原先的郵件傳送機制,是生成eml檔案,然後扔到windows自帶的smtp伺服器的pickup目錄下,系統即自動傳送(見拙作:郵件傳送一點心得)。

但今時今日,這些好像都是老皇曆了。IIS7預設並沒有SMTP,如果作業系統是server,還可以通過新增功能加上去,但WIN7就不行了。偏偏,我們的系統就部署在WIN7下。

我第一個應對之道是看WIN7能不能裝那個自帶的SMTP,結果是不行,死活沒找到。

第二個辦法是裝個第三方的SMTP,找來找去,找到一個叫做什麼FREE SMTP的,裝上去以後,開啟看,好像忒簡單了點。根本沒有啥PICK目錄的,應該是隻能通過程式碼,搞什麼幾次握手之類的方法來進行呼叫。我很煩這個東西。

最後,決定還是直接使用smtp.163.com。網上例子比比皆是。

public interface IEmail{    bool Send(EmailParam param);    string Mess { get; }}public class EmailParam{    public string From { get; set; }    public string To { get; set; }//接收人;多個郵箱用分號隔開    public
string CC { get; set; }//抄送;多個郵箱用分號隔開    public string Subject { get; set; }//標題    public string Body { get; set; }//郵件正文}public class Sender : IEmail{    SmtpClient client;    public Sender()    {        // <add key="eml_host" value="smtp.163.com"/>        // <add key="eml_account" value="chendaqu"/>        // <add key="eml_pwd" value="1234abcd"/>        string host = ConfigurationManager.AppSettings["eml_host"];        string account = ConfigurationManager.AppSettings["eml_account"];        string pwd = ConfigurationManager.AppSettings["eml_pwd"];        client = new SmtpClient();        client.Host = host;        client.UseDefaultCredentials = false;        client.DeliveryMethod = SmtpDeliveryMethod.Network;        client.Credentials = new System.Net.NetworkCredential(account,pwd);        client.Port = 25;    }    public string Mess { get; set; }    public bool Send(EmailParam param)    {        MailMessage mail = new MailMessage();        mail.From = new MailAddress(param.From);        getCollection(mail.To,param.To);        getCollection(mail.CC, param.CC);        mail.Subject = param.Subject;        mail.Body = param.Body;        mail.SubjectEncoding = Encoding.UTF8;        mail.BodyEncoding = Encoding.UTF8;        mail.Priority = MailPriority.Normal;        mail.IsBodyHtml = true;        mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;        try        {            client.Send(mail);        }        catch(Exception ex)        {            Mess = ex.Message;            return false;        }        return true;    }    MailAddressCollection getCollection(MailAddressCollection collection,string arstring)    {        if (!String.IsNullOrEmpty(arstring))        {            string[] ar = arstring.Split(';');            foreach (string item in ar)            {                if (String.IsNullOrEmpty(item)) continue;                collection.Add(item);            }        }        return collection;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

使用單元測試進行呼叫:

[TestMethod()]public void SendTest(){    IEmail sender = new Sender();    bool ok = sender.Send(new EmailParam()    {        Subject = "郵件測試7",        Body = "Hello World!",        From = "[email protected]",        To = "[email protected];[email protected]",    });    Assert.AreEqual(true, ok);}
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

結果剛開始非常順利,都能收到郵件;但該單元測試運行了幾次以後,就傳送失敗了。提示:

錯誤:郵件:事務失敗。 伺服器響應為:DT:SPM 163 smtp11,D8CowACXNqusR1pYQe3vGA--.16469S2 1482311598,please see http://mail.163.com/help/help_spam_16.htm?ip=219.136.75.223&hostid=smtp11&time=1482311598
   
  • 1

開始時以為是因為163郵箱的反垃圾郵件機制,猛查資料,結果一無所獲。焦慮攻心之下,我第二天居然感冒了。後來才知道是QQ郵箱的發垃圾郵件機制所致。同一個傳送請求中,有一個地址失敗,其他的都失敗了,所以稱為“事務”?

後來就是莫名其妙地好了,可能是郵件內容有所變化,QQ又認為它不是垃圾了。靠。

注:
我這個163郵箱,開啟了客戶端授權,未清楚對應對反垃圾機制是否有用,好像不開啟這個客戶端授權也能傳送。開啟了這個客戶端授權後,程式碼中的密碼要使用這個客戶端授權密碼,而不是登入郵箱的密碼。
這裡寫圖片描述

==================================
以上就是垃圾。這個問題等於沒解決。163的SMTP一言不合就將你的郵件當成垃圾郵件,直到第二天才解封。但是很奇怪,採用foxmail作為客戶端來發送同樣的郵件,卻沒有問題,說到底還是程式碼的問題?(outlook沒試過,估計也不會有問題)

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述