最近用C#的SmtpClient發送電子郵件碰到這個錯誤:
正在處理錯誤。 服務器響應為:4.7.1 Service unavailable - try again later
換了其他的SMTP服務器,沒有問題,唯獨客戶使用的這個服務器會報異常。
使用Foxmail也可以正常發送郵件,但是C#寫程序,就不能發送。
非常好奇,到底是哪里出了問題。於是下載了Wireshark,跟蹤了端口為25的TCP數據包(Filter處填:tcp port 25)。
點擊Start開始捕捉數據包。
從圖里可以發現這個服務器非常奇葩的會拒絕一次SMTP協議里的MAIL FROM指令,從而造成異常,再試一次就好了。
然而C#的SmtpClient類我們沒法更改(System.dll),於是谷歌找到了System.Net.Mail.SmtpClient的mono實現,復制了下來,增加了一次登錄時錯誤451的判斷,然后重新發送一次去掉了@和域名的,只保留用戶名的MAIL FROM信息,就可以成功發送了。
從Github的SmtpClient源碼中,還知道了一個叫做MailKit的開源發送郵件代碼,地址是 https://github.com/jstedfast/MailKit
這個功能比SmtpClient強大很多,但是我的程序都已經完成了,就不再花時間去改了,有時間可以再研究這個軟件。
GitHub 的System.Net.Mail源碼在這里:https://github.com/mono/mono/tree/master/mcs/class/System/System.Net.Mail