郵件 事務失敗 伺服器響應為 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沒試過,估計也不會有問題)