在 Office365 上使用默认 SMTP 凭据的异常 - 客户端未通过身份验证以在 MAIL FROM 期间发送匿名邮件
Exception using default SMTP credentials on Office365 - Client was not authenticated to send anonymous mail during MAIL FROM
我正在使用 NLog 通过自定义邮件目标将日志作为电子邮件发送。我从我的 office365 帐户发送,该帐户在我的 web.config(我的主要项目)中设置为默认帐户,如下所示:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="myusername@mydomain.com">
<network defaultCredentials="false" host="smtp.office365.com" port="587" userName="myusername@mydomain.com" password="mypassword" enableSsl="true" />
</smtp>
</mailSettings>
</system.net>
我用我的日志目标(在我的 NLog 实现包中)覆盖了 Write 方法,如下所示:
protected override void Write(LogEventInfo logEvent)
{
try
{
using (var mail = new MailMessage())
{
this.SetupMailMessage(mail, logEvent, this.Layout.Render(logEvent));
using (SmtpClient smtpClient = new SmtpClient())
{
smtpClient.UseDefaultCredentials = true;
smtpClient.Send(mail);
}
}
}
catch (Exception exception)
{
throw new NLogRuntimeException("An error occurred when sending a log mail message.", exception);
}
}
当系统尝试从此帐户发送邮件时,会抛出以下 System.Net.Mail.SmtpException
:
SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.7.57 SMTP;在 MAIL FROM
期间客户端未通过身份验证以发送匿名邮件
我已经四次检查了凭据,它们是正确的。有谁知道还有什么可能导致此异常?
更新: 结果 CredentialCache.DefaultCredentials 属性 充满了空字符串。然而,当我使用下面的代码手动提取设置时,我可以从 web.config 中获取设置。
SmtpSection settings = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
smtpClient.Credentials = new NetworkCredential(settings.Network.UserName, settings.Network.Password);
smtpClient.Host = settings.Network.Host;
smtpClient.Port = settings.Network.Port;
smtpClient.EnableSsl = settings.Network.EnableSsl;
var creds = CredentialCache.DefaultCredentials; // Is empty
我可以使用它作为解决方法。但是什么给了?为什么默认凭据为空?
虽然我在答案更新中提到的解决方法确实有效,但我对手动获取这些值并不满意。我的解决方案是 删除行
smtpClient.UseDefaultCredentials = true;
来自我 post 编辑的原始代码。事实证明,smtpClient
是使用我在 web.config 中设置的默认凭据初始化的,上面删除的行用 CredentialCache.DefaultCredentials
中的空字符串覆盖了它们。我仍然不知道为什么 CredentialCache.DefaultCredentials
是空的,或者什么时候应该从 web.config 填充它,但这是我问题的根源。
如果有人对此有任何进一步的了解,请post一个更好的答案!
在第三方托管服务提供商上进行此集成时,您还需要提供域名。
SmtpClient client = new SmtpClient(SMTPSettings.Url, SMTPSettings.Port);
client.Credentials = new System.Net.NetworkCredential(SMTPSettings.UserName, SMTPSettings.Password, SMTPSettings.Domain);
多亏了这个 post,我才能够解决我们的问题。我们将邮箱从 Rackspace 的混合设置迁移到 O365。用于发送的邮箱以前不是 Exchange 帐户,而是在迁移后成为一个。
mySmtpClient = New SmtpClient("smtp.office365.com")
mySmtpClient.Port = 587
mySmtpClient.EnableSsl = True
mySmtpClient.Credentials = New System.Net.NetworkCredential("email@domain.com", "password", "domain.com")
mySmtpClient.Send(Msg)
之前的设置不需要我们提供端口或启用 ssl,甚至不需要将域放在凭据参数中。希望这对那些必须使用 VB 脚本通过 Office 365 通过 SMTP 自动发送电子邮件的人有所帮助。
我有同样的问题,对我有用的是使用 System.Security.SecureString 来放置密码而不是字符串,例如:
System.Security.SecureString psw = new System.Security.SecureString();
string PasswordGmail = "XXXXXX";
foreach (char item in PasswordGmail.ToCharArray())
{
psw.AppendChar(item);
}
client.Credentials = new System.Net.NetworkCredential("XXXX@xxx.com", psw);
我正在使用 NLog 通过自定义邮件目标将日志作为电子邮件发送。我从我的 office365 帐户发送,该帐户在我的 web.config(我的主要项目)中设置为默认帐户,如下所示:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="myusername@mydomain.com">
<network defaultCredentials="false" host="smtp.office365.com" port="587" userName="myusername@mydomain.com" password="mypassword" enableSsl="true" />
</smtp>
</mailSettings>
</system.net>
我用我的日志目标(在我的 NLog 实现包中)覆盖了 Write 方法,如下所示:
protected override void Write(LogEventInfo logEvent)
{
try
{
using (var mail = new MailMessage())
{
this.SetupMailMessage(mail, logEvent, this.Layout.Render(logEvent));
using (SmtpClient smtpClient = new SmtpClient())
{
smtpClient.UseDefaultCredentials = true;
smtpClient.Send(mail);
}
}
}
catch (Exception exception)
{
throw new NLogRuntimeException("An error occurred when sending a log mail message.", exception);
}
}
当系统尝试从此帐户发送邮件时,会抛出以下 System.Net.Mail.SmtpException
:
SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.7.57 SMTP;在 MAIL FROM
期间客户端未通过身份验证以发送匿名邮件我已经四次检查了凭据,它们是正确的。有谁知道还有什么可能导致此异常?
更新: 结果 CredentialCache.DefaultCredentials 属性 充满了空字符串。然而,当我使用下面的代码手动提取设置时,我可以从 web.config 中获取设置。
SmtpSection settings = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
smtpClient.Credentials = new NetworkCredential(settings.Network.UserName, settings.Network.Password);
smtpClient.Host = settings.Network.Host;
smtpClient.Port = settings.Network.Port;
smtpClient.EnableSsl = settings.Network.EnableSsl;
var creds = CredentialCache.DefaultCredentials; // Is empty
我可以使用它作为解决方法。但是什么给了?为什么默认凭据为空?
虽然我在答案更新中提到的解决方法确实有效,但我对手动获取这些值并不满意。我的解决方案是 删除行
smtpClient.UseDefaultCredentials = true;
来自我 post 编辑的原始代码。事实证明,smtpClient
是使用我在 web.config 中设置的默认凭据初始化的,上面删除的行用 CredentialCache.DefaultCredentials
中的空字符串覆盖了它们。我仍然不知道为什么 CredentialCache.DefaultCredentials
是空的,或者什么时候应该从 web.config 填充它,但这是我问题的根源。
如果有人对此有任何进一步的了解,请post一个更好的答案!
在第三方托管服务提供商上进行此集成时,您还需要提供域名。
SmtpClient client = new SmtpClient(SMTPSettings.Url, SMTPSettings.Port);
client.Credentials = new System.Net.NetworkCredential(SMTPSettings.UserName, SMTPSettings.Password, SMTPSettings.Domain);
多亏了这个 post,我才能够解决我们的问题。我们将邮箱从 Rackspace 的混合设置迁移到 O365。用于发送的邮箱以前不是 Exchange 帐户,而是在迁移后成为一个。
mySmtpClient = New SmtpClient("smtp.office365.com")
mySmtpClient.Port = 587
mySmtpClient.EnableSsl = True
mySmtpClient.Credentials = New System.Net.NetworkCredential("email@domain.com", "password", "domain.com")
mySmtpClient.Send(Msg)
之前的设置不需要我们提供端口或启用 ssl,甚至不需要将域放在凭据参数中。希望这对那些必须使用 VB 脚本通过 Office 365 通过 SMTP 自动发送电子邮件的人有所帮助。
我有同样的问题,对我有用的是使用 System.Security.SecureString 来放置密码而不是字符串,例如:
System.Security.SecureString psw = new System.Security.SecureString();
string PasswordGmail = "XXXXXX";
foreach (char item in PasswordGmail.ToCharArray())
{
psw.AppendChar(item);
}
client.Credentials = new System.Net.NetworkCredential("XXXX@xxx.com", psw);