在博问中(.net core怎么实现邮件发送)知道了MailKit无法使用阿里云邮件推送服务发送邮件的问题,自已实测也遇到同样的问题,而用自己搭建的邮件服务器没这个问题。
于是,向阿里云提交了工单。。。在提供了TCP抓包数据后,阿里云技术专员发现了问题所在:在认证通过后,MailKit发送了EHLO命令,然后才发送MAIL FROM命令,服务器在收到EHLO时会重置客户端的认证状态,所以后续的命令过来时,服务器认为客户端没有认证,于是报错“503 Bad sequence of commands”。
知道了问题的原因后,首先想到的解决方法是不让MailKit在发送MAIL FROM命令之前发送EHLO命令。
于是在github上签出MailKit的源代码,在 MailKit\Net\Smtp\SmtpClient.cs 中找到了下面的代码:
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服务器:
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 文件夹中)
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 ,然后运行邮件发送程序,问题解决。
[更新1]
MailKit 的作者已经修复了这个问题,详见 Added another broken SMTP server to the list
[更新2]
MailKit 1.4.1 已修复这个问题。 |