尝试通过 Office 365 发送电子邮件时出现 SMTP 5.7.57 错误

Posted

技术标签:

【中文标题】尝试通过 Office 365 发送电子邮件时出现 SMTP 5.7.57 错误【英文标题】:SMTP 5.7.57 error when trying to send email via Office 365 【发布时间】:2016-06-15 13:53:32 【问题描述】:

我正在尝试设置一些代码以通过 Office 365's authenticated SMTP service 发送电子邮件:

var _mailServer = new SmtpClient();
_mailServer.UseDefaultCredentials = false;
_mailServer.Credentials = new NetworkCredential("test.user@mydomain.com", "password");
_mailServer.Host = "smtp.office365.com";
_mailServer.TargetName = "STARTTLS/smtp.office365.com"; // same behaviour if this lien is removed
_mailServer.Port = 587;
_mailServer.EnableSsl = true;

var eml = new MailMessage();
eml.Sender = new MailAddress("test.user@mydomain.com");
eml.From = eml.Sender;
eml.to = new MailAddress("test.recipient@anotherdomain.com");
eml.Subject = "Test message";
eml.Body = "Test message body";

_mailServer.Send(eml);

这似乎不起作用,我看到了一个异常:

SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.7.57 SMTP;在 MAIL FROM 期间,客户端未通过身份验证发送匿名邮件 在 System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from) 在 System.Net.Mail.SmtpTransport.SendMail(MailAddress 发件人,MailAddressCollection 收件人,String deliveryNotify,SmtpFailedRecipientException& 异常) 在 System.Net.Mail.SmtpClient.Send(MailMessage 消息)

我试过enabling network tracing,似乎建立了安全通信(例如,我在日志中看到“STARTTLS”命令的一行,后来日志中有一行“远程证书已验证为用户有效。”,并且以下 Send()Receive() 数据不能作为纯文本读取,并且似乎不包含任何 TLS/SSH 恐慌)

我可以使用相同的电子邮件地址和密码登录http://portal.office.com/ 并使用 Outlook 电子邮件网络邮件发送和阅读电子邮件,那么以编程方式发送电子邮件时可能导致身份验证失败的原因是什么?

有没有办法额外调试加密流?

【问题讨论】:

eml.From = eml.Sender; 中指定的地址是否与您要连接的帐户的电子邮件地址相同?如果您将From字段中指定的电子邮件地址更改为帐户的电子邮件地址,电子邮件是否发送成功?如果是这样,则可能是 SMTP 配置为无法发送看似来自不同帐户的电子邮件。 如果只设置了From,而没有指定Sender,它仍然会失败。在所有情况下,From 匹配 NetworkCredentials 在这种情况下我没有想法,否则你的代码看起来很好。如果您确实找到了解决方案,可以在这里发布吗?我有兴趣找出原因。 Client was not authenticated to send anonymous mail during MAIL FROM 表示您正在尝试发送匿名邮件,这意味着它无法识别您的From 地址。 @jstedfast 为什么当我可以使用它登录 Office 365 时它无法识别发件人? 【参考方案1】:

就我而言,在我尝试了所有这些建议后没有运气,我联系了 Microsoft 支持,他们的建议是简单地更改密码。

这解决了我的问题。

请注意密码没有过期,因为我成功登录了office365,但是重置解决了问题。

经验教训:不要相信 Office 365 密码到期日期,在我的情况下,密码将在 1-2 个月后到期,但它不起作用。 这导致我在我的代码中进行了调查,但经过很长时间后,我才意识到问题出在 Office365 密码“损坏”或“过早过期”。

不要忘记每 3 个月“刷新”一次密码。

【讨论】:

【参考方案2】:

为了帮助调试,请尝试暂时切换到 MailKit 并使用如下代码 sn-p:

using System;

using MailKit.Net.Smtp;
using MailKit.Security;
using MailKit;
using MimeKit;

namespace TestClient 
    class Program
    
        public static void Main (string[] args)
        
            var message = new MimeMessage ();
            message.From.Add (new MailboxAddress ("", "test.user@mydomain.com"));
            message.To.Add (new MailboxAddress ("", "test.recipient@anotherdomain.com"));
            message.Subject = "Test message";

            message.Body = new TextPart ("plain")  Text = "This is the message body." ;

            using (var client = new SmtpClient (new ProtocolLogger ("smtp.log"))) 
                client.Connect ("smtp.office365.com", 587, SecureSocketOptions.StartTls);

                client.Authenticate ("test.user@mydomain.com", "password");

                client.Send (message);
                client.Disconnect (true);
            
        
    

这会将整个事务记录到一个名为“smtp.log”的文件中,然后您可以通读该文件并查看可能出现问题的地方。

请注意,smtp.log 可能包含一个 AUTH LOGIN 命令,后跟一些 base64 编码的命令(这些是您的用户/密码),因此如果您共享日志,请务必清除这些行。

我希望这与您在 System.Net.Mail 中看到的错误相同,但它会帮助您了解发生了什么。

假设它失败(我希望它会失败),尝试更改为 SecureSocketOptions.None 和/或尝试注释掉 Authenticate()

看看这会如何改变你看到的错误。

【讨论】:

我的 asp.net C# Web 应用程序无法识别 MimeMessage() 方法或“使用 MimeKit;” 您需要先添加对 MimeKit/MailKit nuget 包的引用。【参考方案3】:

确保您为帐户使用的是实际的 office365 电子邮件地址。您可以通过单击 Outlook365 中的配置文件按钮找到它。我与身份验证作斗争,直到我意识到我试图用于身份验证的电子邮件地址不是实际的邮箱电子邮件帐户。实际帐户电子邮件的格式可能为:account@company.onmicrosoft.com。

【讨论】:

【参考方案4】:

我们通过将邮箱(来自地址)从“共享”转换为“常规”来实现我们的工作。在此更改之前,当我们从 Gmail 迁移到 Office 365 时,我的应用程序会停止发送电子邮件。除了将主机设置为 smtp.office365.com 之外,不需要进行其他代码更改。

【讨论】:

这对我也有用。不知道为什么会有所不同。 这也是我的问题!谢谢分享。【参考方案5】:

请检查以下我已测试使用 Exchange Online 发送电子邮件的代码:

        MailMessage msg = new MailMessage();
        msg.To.Add(new MailAddress("YourEmail@hotmail.com", "XXXX"));
        msg.From = new MailAddress("XXX@msdnofficedev.onmicrosoft.com", "XXX");
        msg.Subject = "This is a Test Mail";
        msg.Body = "This is a test message using Exchange OnLine";
        msg.IsBodyhtml = true;

        SmtpClient client = new SmtpClient();
        client.UseDefaultCredentials = false;
        client.Credentials = new System.Net.NetworkCredential("XXX@msdnofficedev.onmicrosoft.com", "YourPassword");
        client.Port = 587; // You can use Port 25 if 587 is blocked
        client.Host = "smtp.office365.com";
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.EnableSsl = true;
        try
        
            client.Send(msg);

        
        catch (Exception ex)
        

        

为消息提交定义了端口 (587)。尽管端口 587 不强制要求 STARTTLS,但在意识到客户端和服务器之间的通信的 SSL/TLS 加密是一个重要的安全和隐私问题的同时,端口 587 的使用变得流行。

【讨论】:

此代码对我不起作用 - 这意味着它与凭据有关,这让我感到困惑,因为我可以使用相同的凭据登录 portal.office.com 没有问题。是否需要在邮箱上启用某些东西才能允许 SMTP 邮件?【参考方案6】:

就我而言,我的问题与代码无关,而是与 Exchange 邮箱有关。不知道为什么,但这解决了我的问题:

转到该用户邮箱的交换设置并访问邮件委托 在 Send As 下,删除 NT AUTHORITY\SELF,然后添加用户帐户。

这授予用户代表他自己发送电子邮件的权限。理论上 NT AUTHORITY\SELF 应该做同样的事情,但由于某种原因不起作用。

来源:http://edudotnet.blogspot.com.mt/2014/02/smtp-microsoft-office-365-net-smtp.html

【讨论】:

我喜欢这个解决方案,但不确定我们是否可以为整个组织做到这一点。【参考方案7】:

我在测试时遇到了同样的错误,在开发期间使用我自己的域电子邮件帐户。对我来说,这个问题似乎与我帐户上启用的 MFA(多因素身份验证)有关。切换到没有 MFA 的帐户解决了这个问题。

【讨论】:

【参考方案8】:

我遇到了这个问题,因为有人在 Azure 中启用了安全默认值。 这将禁用 SMTP/基本身份验证。文档中有明确说明,但错误消息并不明显,您必须有权访问该帐户才能找到。

https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/concept-fundamentals-security-defaults

可以为每个帐户启用它。 https://docs.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission

【讨论】:

【参考方案9】:

您需要更改凭证功能。这是您需要进行的替换:

改变

-*_mailServer.Credentials = new NetworkCredential("test.user@mydomain.com", "password");*

为此

-*_mailServer.Credentials = new NetworkCredential("test.user@mydomain.com", "password", "domain");*

【讨论】:

【参考方案10】:

在我的情况下,密码已过期。我刚刚重置密码并再次开始工作

【讨论】:

以上是关于尝试通过 Office 365 发送电子邮件时出现 SMTP 5.7.57 错误的主要内容,如果未能解决你的问题,请参考以下文章

smtpclient.send 在尝试通过 Office 365 发送电子邮件时挂起

如何设置outlook office365邮箱的中继

通过 Exchange Online (Office 365) 使用 System.Net.Mail 发送 SMTP 电子邮件

使用带有 Laravel 的 Outlook / Office365 发送电子邮件 - 无法在 SMTP 服务器上进行身份验证

无法通过 Hostgator 中的 Office365 使用 PHP (phpmailer) 发送邮件。如何解决这个问题?

无法使用 office365 设置发送 SMTP 邮件