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

我正在使用NLog将日志作为带有自定义邮件目标的电子邮件发送。 我从我的office365帐户发送设置为我的web.config(我的主项目)中的默认设置,如下所示:

       

我用我的日志目标(在我的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服务器需要安全连接或客户端未经过身份validation。 服务器响应是:5.7.57 SMTP; 客户端未通过身份validation,无法在MAIL FROM期间发送匿名邮件

我有四倍检查凭证,他们是正确的。 有谁知道还有什么可能导致这个例外?

更新:事实certificateCredentialCache.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 

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

感谢这篇文章,我能够解决我们的问题。 我们通过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脚本通过SMTP自动发送电子邮件的人们使用Office 365。

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

 smtpClient.UseDefaultCredentials = true; 

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

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

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

 SmtpClient client = new SmtpClient(SMTPSettings.Url, SMTPSettings.Port); client.Credentials = new System.Net.NetworkCredential(SMTPSettings.UserName, SMTPSettings.Password, SMTPSettings.Domain); 

我有同样的问题,它对我有用的是使用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);