解決.NET Core中MailKit沒法使用阿里雲郵件推送服務的問題

在博問中(.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 已修復這個問題。

相關文章
相關標籤/搜索