Jed*_*Jed 14 asp.net-mvc smtpclient
在我的MVC4应用程序中,我使用它SmtpClient
通过Gmail的smtp.gmail.com
SMTP服务器发送电子邮件.
我已使用以下设置配置了我的Web.Config文件:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network">
<network enableSsl="true"
defaultCredentials="false"
host="smtp.gmail.com"
port="587"
userName="xxMyUserNamexx@gmail.com"
password="xxMyPasswordxx" />
</smtp>
</mailSettings>
</system.net>
Run Code Online (Sandbox Code Playgroud)
使用SmtpClient并发送电子邮件消息的方法如下所示:
public void SendMail(string fromDisplayName, string fromEmailAddress, string toEmailAddress, string subject, string body)
{
MailAddress from = new MailAddress(fromEmailAddress, fromDisplayName);
MailAddress to = new MailAddress(toEmailAddress);
MailMessage mailMessage = new MailMessage(from, to);
mailMessage.Body = body;
mailMessage.Subject = subject;
SmtpClient client = new SmtpClient();
//client.UseDefaultCredentials = false;
client.Send(mailMessage);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码按预期工作,很好.令我困惑的是注释行client.UseDefaultCredentials = false;
- 如果我要取消注释该行,我将收到一条异常消息,指出:
SMTP服务器需要安全连接或客户端未经过身份验证.服务器响应为:5.5.1需要身份验证.
更重要的是,如果我将UseDefaultCredentials
属性设置为true
或者false
,我仍然会收到异常消息.我避免异常消息的唯一方法是完全删除该行.
这种行为是否正常?你能解释我收到异常消息的原因吗?
Dav*_*ych 24
那么为什么我明确地将属性设置为false会抛出异常?
原因是因为setter UseDefaultCredentials
将Credentials
属性设置为null(如果将其设置为false),或者将其设置为CredentialCache.DefaultNetworkCredentials
属性(如果设置为true).该DefaultNetworkCredentials
属性由MSDN定义为:
DefaultNetworkCredentials返回的凭据表示运行应用程序的当前安全上下文的身份验证凭据.对于客户端应用程序,这些应用程序通常是运行应用程序的用户的Windows凭据(用户名,密码和域).对于ASP.NET应用程序,默认网络凭据是登录用户或被模拟用户的用户凭据.
当您设置UseDefaultCredentials
为true时,它正在使用您的IIS用户,并且我假设您的IIS用户与您正在使用的任何SMTP服务器的帐户没有相同的身份验证凭据.设置UseDefaultCredentials
为false null输出已设置的凭据.所以无论哪种方式,你都会遇到这个错误.
以下是UseDefaultCredentials
使用dotPeek的setter :
set
{
if (this.InCall)
{
throw new InvalidOperationException(
SR.GetString("SmtpInvalidOperationDuringSend"));
}
this.transport.Credentials = value
? (ICredentialsByHost) CredentialCache.DefaultNetworkCredentials
: (ICredentialsByHost) null;
}
Run Code Online (Sandbox Code Playgroud)
Jas*_*era 15
我得到了同样的信息,这让我发疯了.读完这个帖子后,我意识到订单在设置我的凭据时很重要.这有效:
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential(smtpSettings.Username, smtpSettings.Password);
Run Code Online (Sandbox Code Playgroud)
虽然这会产生您描述的错误:
client.Credentials = new NetworkCredential(smtpSettings.Username, smtpSettings.Password);
client.UseDefaultCredentials = false;
Run Code Online (Sandbox Code Playgroud)
对于遇到同样问题的其他人来说,这只是一个FYI.
归档时间: |
|
查看次数: |
18640 次 |
最近记录: |