在Office365上使用默认SMTP凭据的例外 - 客户端未经过身份验证,无法在MAIL FROM期间发送匿名邮件

Iva*_*van 11 c# email authentication smtp office365

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

我用我的日志目标(在我的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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

当系统尝试从此帐户发送邮件时,将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
Run Code Online (Sandbox Code Playgroud)

我可以使用它作为解决方法.但是给出了什么?为什么默认凭据为空?

小智 10

感谢这篇文章,我能够解决我们的问题.我们通过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)
Run Code Online (Sandbox Code Playgroud)

以前的设置不要求我们提供端口或启用ssl甚至将域放在凭证参数中.希望这有助于那些必须使用VB脚本通过SMTP自动发送电子邮件的人们使用Office 365.


Iva*_*van 7

虽然我在答案更新中提到的解决方法确实有效,但我对手动获取这些值感到不满意.我的解决方案是删除该行

smtpClient.UseDefaultCredentials = true;
Run Code Online (Sandbox Code Playgroud)

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

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