我正在使用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>
我使用以下方式覆盖了Write方法,使用我的日志目标(在我的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;在 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
我可以将此用作解决方法。但是这是怎么回事?为什么默认凭据会为空?
mailMessage.From = new MailAddress("myusername@mydomain.com");
)来查看是否是问题所在,但仍然抛出了相同的异常。 - 08Dc91wk