在博問中(.net core怎麼實現郵件發送)知道了MailKit沒法使用阿里雲郵件推送服務發送郵件的問題,自已實測也遇到一樣的問題,而用本身搭建的郵件服務器沒這個問題。git
因而,向阿里雲提交了工單。。。在提供了TCP抓包數據後,阿里雲技術專員發現了問題所在:在認證經過後,MailKit發送了EHLO命令,而後才發送MAIL FROM命令,服務器在收到EHLO時會重置客戶端的認證狀態,因此後續的命令過來時,服務器認爲客戶端沒有認證,因而報錯「503 Bad sequence of commands」。github
知道了問題的緣由後,首先想到的解決方法是不讓MailKit在發送MAIL FROM命令以前發送EHLO命令。服務器
因而在github上籤出MailKit的源代碼,在 MailKit\Net\Smtp\SmtpClient.cs 中找到了下面的代碼:ui
if (host != "smtp.strato.de" && host != "smtp.sina.com") Ehlo (cancellationToken);
而且發現了對應這個問題的issue:EHLO after AUTH causes send failure with 5.7.0 even though authentication succeeded #162阿里雲
原來這是已知問題,MailKit暫時採用了臨時解決方法,因而咱們也依葫蘆畫瓢,加上了阿里雲郵件推送服務的SMTP服務器:spa
if (host != "smtp.strato.de" && host != "smtp.sina.com" && !host.Equals("smtp.dm.aliyun.com", StringComparison.OrdinalIgnoreCase)) Ehlo (cancellationToken);
接着經過如下命令本身編譯出MailKit.dll(在 MailKit\bin\Debug\netstandard1.3 文件夾中).net
git submodule update --init --recursive cd submodules\MimeKit\MimeKit dotnet restore cd ..\..\..\MailKit dotnet restore dotnet build
接着用這個 MailKit.dll 替換 .nuget\packages\MailKit\1.4.0\lib\netstandard1.3\MailKit.dll ,而後運行郵件發送程序,問題解決。rest
[更新1]code
MailKit 的做者已經修復了這個問題,詳見 Added another broken SMTP server to the listserver
[更新2]
MailKit 1.4.1 已修復這個問題。