我正在使用 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
我可以将此作为一种变通方法。但这是怎么回事呢?为什么默认凭据会是空的?
在第三方托管提供商上进行此集成时,还需要提供域名。
SmtpClient client = new SmtpClient(SMTPSettings.Url, SMTPSettings.Port);
client.Credentials = new System.Net.NetworkCredential(SMTPSettings.UserName, SMTPSettings.Password, SMTPSettings.Domain);
尽管我在答案更新中提到的解决方法确实有效,但我对手动获取这些值并不满意。对我来说,解决办法是拆除线路
smtpClient.UseDefaultCredentials = true;
来自我发布的原始代码。事实证明,smtpClient
是用我在web中设置的默认凭据初始化的。config,上面删除的行正在用CredentialCache.DefaultCredentials
中的空字符串覆盖它们。我仍然不知道为什么<code>CredentialCache。DefaultCredentials</code>为空,或者应该从web填充时为空。配置,但这是我问题的根源。
如果有人对此有任何进一步的见解,请发布更好的答案!
多亏了这个帖子,我才得以解决我们的问题。我们将邮箱从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。
这仅适用于(smtp.office365.com)smtp。
我目前拥有的代码是: 我试图发送到的电子邮件地址托管在Office 365的Outlook上。我们可能需要稍后更改特定地址,但它们可能配置相同。 但是,每当我尝试运行命令时,都会收到同样的错误,错误的全文是: 我已经尝试了一些不同的方法,比如在25到587之间切换端口,将主机更改为office365的,或者将和切换为true或false。但是我总是看到同样的错误。我还遗漏了什么吗?
我有一个java程序(从谷歌复制的)可以使用office365 SMTP发送电子邮件,它作为一个独立的java程序运行良好,但当我在web应用程序的中将这个java程序部署为jar文件,并从JSP调用该方法时,它抛出了以下错误: 有人能分享一下他们对这个问题的看法吗。java代码:
我必须用我的网络应用程序发送邮件。给定下面显示< code >的代码,SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器响应是: 5.7.57 SMTP;客户端在邮件发送过程中未通过身份验证发送匿名邮件。 帮我找到一个合适的解决方案。非常感谢。 代码:
我正在编写一个Rust应用程序,它将通过启用了SMTP功能的Exchange服务器发送电子邮件。根据微软的网页,需要的设置是: 服务器地址smtp.office365.com 端口587 已启用StartTLS 邮件帐户登录凭据 网络邮件服务的POP/IMAP设置证实了这一点。 这是我的代码(带有一些审查): 当我编译和运行代码时,它给了我这个错误: 错误(永久(响应{代码:代码{严重性:Perm
我正在用asp发送outlook电子邮件。净c#。 当我运行这个程序时,我在(smtp.Send(fromAddress,toAddress,subject,body);)上遇到了一个错误我在网上搜索,试图解决问题,但什么也没找到。请帮忙。我真的很感激。