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

时间:2016-03-02 15:44:16

标签: c# email smtp office365 smtpclient

我尝试设置一些代码以通过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 []命令,String from)
    在System.Net.Mail.SmtpTransport.SendMail(MailAddress sender,MailAddressCollection recipients,String deliveryNotify,SmtpFailedRecipientException& exception)
    在System.Net.Mail.SmtpClient.Send(MailMessage消息)

我已经尝试了enabling network tracing并且似​​乎建立了安全通信(例如,我在日志中看到" STARTTLS"命令中的一行,后来在那里&#39 ;日志中的sa行"远程证书已被用户验证为有效。",并且以下Send()Receive()数据无法作为纯文本读取,并且不会&# 39; t似乎包含任何TLS / SSH恐慌)

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

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

10 个答案:

答案 0 :(得分:4)

在我的情况下,在我没有运气的情况下尝试了所有这些建议之后,我联系了Microsoft支持,他们的建议只是更改密码。

这解决了我的问题。

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

获得的经验:不信任Office 365密码到期日期,在我的情况下,密码将在1-2个月后过期,但它不起作用。 这导致我在我的代码中进行调查,并且只有在很长一段时间后才意识到问题出在Office365密码中,而且#34;已损坏&#34;或者&#34;过早地过期&#34;。

不要忘记每3个月去一次&#34;刷新&#34;密码。

答案 1 :(得分:3)

为了帮助调试,请尝试暂时切换到MailKit并使用以下代码段:

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()

了解这会如​​何改变您所看到的错误。

答案 2 :(得分:3)

请确保您使用该帐户的实际office365电子邮件地址。您可以通过单击Outlook365中的配置文件按钮找到它。我一直在进行身份验证,直到我意识到我尝试用于身份验证的电子邮件地址不是实际的邮箱电子邮件帐户。实际的帐户电子邮件可能采用以下格式:account@company.onmicrosoft.com。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

请检查下面我测试过的使用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)
        {

        }

enter image description here 端口(587)被定义用于消息提交。虽然端口587并不强制要求STARTTLS,但是端口587的使用在认识到客户端和服务器之间的通信的SSL / TLS加密是一个重要的安全和隐私问题的同时变得流行。

答案 5 :(得分:1)

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

  • 转到该用户邮箱的交换机设置并访问邮件委派
  • 发送为下,移除 NT AUTHORITY \ SELF ,然后添加用户的帐户。

这为用户提供了代表自己发送电子邮件的权限。从理论上来说, NT AUTHORITY \ SELF 应该做同样的事情,但由于某些原因不起作用。

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

我遇到了这个问题,因为有人在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

答案 8 :(得分:0)

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

更改

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

为此

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

答案 9 :(得分:0)

在我的情况下,密码已过期。我只是重置了密码,然后它又开始工作了