无法使用mailkit将电子邮件发送到yahoo

时间:2019-09-16 16:33:13

标签: yahoo mailkit

我正在创建一个向客户发送电子邮件(定价,订单,发票等)的系统。但是由于最终收到的电子邮件数量过多,我们在尝试通过gmail或任何其他邮件客户端发送邮件时遇到了限制。而且由于这些都是针对客户的电子邮件,因此使用批量发送客户端并不理想。

因此,我创建了一个使用mailkit和其他工具的系统,可以从我们自己的服务器发送电子邮件,而无需设置中继或电子邮件服务器进行发送。除yahoo之外,这对所有人(Gmail,Outlook等)都适用。由于某些原因,当我连接并且mailkit尝试切换到STL(通过startstl)时,yahoo发送垃圾邮件,而mail kit失败。

我已启用所有ssl和tsl协议。而且我总是有ServerCertificateValidationCallback返回true。实际上ServerCertificateValidationCallback甚至都不会被调用。

引发的错误始于: 调用SSPI失败,请参阅内部异常

然后 收到的消息意外或格式错误。

如果我尝试连接到其他任何SMTP端口465或587,则系统只会挂起。

这一切都发生在连接之前,即在发送电子邮件之前。因此,这不是DKIM问题。并且SPF记录已正确设置。我们没有反向DNS设置,因为我们计划从具有不同IP的多台服务器进行发送。

我不知道为什么雅虎这么难。

尝试与MailKit通讯,尝试允许所有TLS和SSL连接。试图找到任何YAHOO支持。

using (var client = new SmtpClient())
{
    client.LocalDomain = "MyDomain";

    // right now we don't care about all SSL certificates (in case the server supports STARTTLS)
    client.ServerCertificateValidationCallback = (s, c, h, e) => {
        return true;
    };
    client.SslProtocols = System.Security.Authentication.SslProtocols.Tls11 |
    System.Security.Authentication.SslProtocols.Tls12 |
    System.Security.Authentication.SslProtocols.Tls |
    System.Security.Authentication.SslProtocols.Ssl3 |
    System.Security.Authentication.SslProtocols.Ssl2;
    client.CheckCertificateRevocation = false;

    client.Connect("mta6.am0.yahoodns.net", 25, false); //<--- fails here

    client.Send("test", fromMailBoxAddress, recipientsEmailBoxAddresses);

    client.Disconnect(true);
}

2 个答案:

答案 0 :(得分:0)

如果要禁用client.Connect("mta6.am0.yahoodns.net", 25, SecureSocketOptions.None);,请使用STARTTLS,或者使用工作正常的client.Connect("smtp.mail.yahoo.com", 587, SecureSocketOptions.Auto);

不确定从何处获得“ mta6.am0.yahoodns.net”,但我什至无法正常连接该地址。​​

答案 1 :(得分:0)

要回答您的问题,我可能会有一个想法,为什么Yahoo这么难-可能是您的消息构造。验证您的MimeMessage是否具有与“发件人”和“发件人”地址相同的电子邮件地址。确保您的ReplyTo仅包含发件人电子邮件地址。 我在ReplyTo中同时拥有发件人和收件人的电子邮件地址,而Yahoo对此并不满意。而且,当然,您正在使用Yahoo App密码进行身份验证。完成这两项更改后,雅虎就成功发送了电子邮件。

设置

client.SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
client.DeliveryStatusNotificationType = mail.DeliveryStatusNotificationType.Full;
await client.ConnectAsync("smtp.mail.yahoo.com", 587, SecureSocketOptions.StartTls);
await client.AuthenticateAsync(yourEmailAddress@yahoo.com, yourYahooAppPassword);
await client.SendAsync(Message);
await client.DisconnectAsync(true);

研究

错误消息的构建违反了Yahoo的许多政策之一。这仅是通过Yahoo在SMTP中发生的。通过Gmail和Outlook的SMTP可以正常工作。我一直将简单的MailMessage与MimeMessage消息构造进行比较。 MailMessage已发送,MimeMessage失败,我不断收到 550请求失败;每次使用我的MimeMessage都会收到来自Yahoo的邮箱不可用回复。我通过使用ProtocolLogger进行了验证。我的发件人为空,这是一个问题,并且我的ReplyTo中有收件人。如果仅将发件人添加到ReplyTo,它仍然会抛出相同的550错误。我必须确保发件人是ReplyTo中的 only 电子邮件。

希望这会有所帮助。