当前位置: 首页 > 知识库问答 >
问题:

在Office365上使用默认SMTP凭据时出现异常-客户端未通过身份验证,无法在mail FROM期间发送匿名邮件

郦何平
2023-03-14

我正在使用 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实现包中)覆盖写方法,如下所示:

    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;客户端未通过身份验证以在邮件发件人期间发送匿名邮件

我已经四次检查了凭证,它们是正确的。有人知道还有什么可能导致这个异常吗?

更新:结果是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

我可以将此作为一种变通方法。但这是怎么回事呢?为什么默认凭据会是空的?

共有3个答案

邵文乐
2023-03-14

在第三方托管提供商上进行此集成时,还需要提供域名。

SmtpClient client = new SmtpClient(SMTPSettings.Url, SMTPSettings.Port);
client.Credentials = new System.Net.NetworkCredential(SMTPSettings.UserName, SMTPSettings.Password, SMTPSettings.Domain);
姬捷
2023-03-14

尽管我在答案更新中提到的解决方法确实有效,但我对手动获取这些值并不满意。对我来说,解决办法是拆除线路

smtpClient.UseDefaultCredentials = true;

来自我发布的原始代码。事实证明,smtpClient是用我在web中设置的默认凭据初始化的。config,上面删除的行正在用CredentialCache.DefaultCredentials中的空字符串覆盖它们。我仍然不知道为什么<code>CredentialCache。DefaultCredentials</code>为空,或者应该从web填充时为空。配置,但这是我问题的根源。

如果有人对此有任何进一步的见解,请发布更好的答案!

凤扬
2023-03-14

多亏了这个帖子,我才得以解决我们的问题。我们将邮箱从Rackspace的混合设置迁移到O365。用于发送的邮箱以前不是Exchange帐户,但在迁移后变为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脚本工作自动化电子邮件通过SMTP与Office 365。

 类似资料: