C# 尝试通过Office 365发送电子邮件时发生SMTP 5.7.57错误
我正在尝试设置一些代码,以便通过以下方式发送电子邮件: 这似乎不起作用,我看到了一个例外: SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器响应为:5.7.57 SMTP;在从C# 尝试通过Office 365发送电子邮件时发生SMTP 5.7.57错误,c#,email,smtp,office365,smtpclient,C#,Email,Smtp,Office365,Smtpclient,我正在尝试设置一些代码,以便通过以下方式发送电子邮件: 这似乎不起作用,我看到了一个例外: SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器响应为:5.7.57 SMTP;在从 在System.Net.Mail.MailCommand.Send(SmtpConnection conn,Byte[]命令,String from) 在System.Net.Mail.SmtpTransport.SendMail(MailAddress发件人、MailAddressCollection收件人
在System.Net.Mail.MailCommand.Send(SmtpConnection conn,Byte[]命令,String from)
在System.Net.Mail.SmtpTransport.SendMail(MailAddress发件人、MailAddressCollection收件人、String deliveryNotify、SmtpFailedRecipientException和exception)
在System.Net.Mail.SmtpClient.Send(邮件消息)上 我试过了,似乎建立了安全通信(例如,我在日志中看到一行“STARTTLS”命令,后来在日志中有一行“远程证书已由用户验证为有效”,以及下面的
Send()
和Receive()
数据不能作为纯文本读取,并且似乎不包含任何TLS/SSH字符)
我可以使用相同的电子邮件地址和密码登录并使用Outlook电子邮件web mail发送和阅读电子邮件,那么,在以编程方式发送电子邮件时,是什么原因导致身份验证失败
是否有其他方法来调试加密流?要帮助调试,请尝试临时切换到并使用以下代码段:
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编码的命令(这些是您的用户/pass),因此如果共享日志,请确保清除这些行
我希望这与您在System.Net.Mail中看到的错误相同,但它将帮助您了解发生了什么
假设失败(我预计会失败),尝试更改为SecureSocketOptions.None
和/或尝试注释掉Authenticate()
查看这将如何更改您看到的错误。请检查我测试过的使用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,但587端口的使用在认识到客户端和服务器之间通信的SSL/TLS加密是一个重要的安全和隐私问题的同时变得流行起来。我们通过将邮箱(从地址)从“共享”转换为“常规”来实现我们的工作。在此更改之前,当我们从Gmail迁移到Office 365时,我的应用程序停止发送电子邮件。除了将主机设置为
smtp.office365.com
之外,不需要其他代码更改。请确保您使用的是帐户的实际office365电子邮件地址。您可以通过点击Outlook365中的profile按钮找到它。我一直在努力进行身份验证,直到我意识到我试图用于身份验证的电子邮件地址不是实际的邮箱电子邮件帐户。实际帐户电子邮件的形式可能为:account@company.onmicrosoft.com.在我的例子中,我的问题与代码无关,而是与Exchange邮箱有关。不知道为什么,但这解决了我的问题:
- 转到该用户邮箱的exchange设置并访问邮件委派
- 在“发送方式”下,删除NT AUTHORITY\SELF,然后添加用户帐户
来源:就我而言,在我尝试了所有这些建议之后,我没有运气,就联系了Microsoft支持人员,他们的建议是简单地更改密码 这解决了我的问题 请注意,密码没有过期,因为我成功登录了office365,但是重置解决了问题 经验教训:不要相信Office 365密码过期日期,在我的情况下,密码将在1-2个月后过期,但它不起作用。 这导致我在我的代码中进行了调查,直到很长一段时间后我才意识到问题出在“损坏”或“过早过期”的Office365密码中
不要忘记每3个月“刷新”一次密码。您需要更改凭据功能。以下是您需要进行的替换: 改变
-*_mailServer.Credentials = new NetworkCredential("test.user@mydomain.com", "password");*
为此
-*_mailServer.Credentials = new NetworkCredential("test.user@mydomain.com", "password", "domain");*
在我的例子中,密码已过期。我刚刚重置了密码,它又开始工作了。在开发过程中,我使用自己的域电子邮件帐户在测试时遇到了相同的错误。对我来说,这个问题似乎与在我的帐户上启用的MFA(多因素身份验证)有关。切换到没有MFA的帐户解决了这个问题。我有这个问题,因为有人在Azure中启用了安全默认设置。 这将禁用SMTP/基本身份验证。文档中有明确的说明,但错误消息并不明显,您必须访问该帐户才能找到答案 每个帐户都可以启用它。
是
eml.From=eml.Sender中指定的地址代码>与您连接的帐户的电子邮件地址相同?如果您将From
字段中指定的电子邮件地址更改为帐户的电子邮件地址,电子邮件发送是否成功?如果是这样,则可能是SMTP配置为无法发送看起来来自不同帐户的电子邮件。如果仅设置了来自
的,并且未指定发件人
,则仍会失败。在所有情况下,From的都与NetworkCredentials
匹配,在这种情况下,我没有主意了,因为否则您的代码看起来很好。如果你找到了解决方案,你能把它贴在这里吗?是
-*_mailServer.Credentials = new NetworkCredential("test.user@mydomain.com", "password", "domain");*