鉴于Web.Config
中的以下部分:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="SomeWebsite Admin <someuser@gmail.com>">
<network host="smtp.gmail.com" port="587" defaultCredentials="true" userName="someuser@gmail.com" password="somepassword" />
</smtp>
</mailSettings>
</system.net>
以下代码段:
smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.Port = 587;
smtp.EnableSsl = true;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential( "someuser@gmail.com", "somepassword" );
smtp.Send( mailMessage );
以上工作正常,但注释了程序化覆盖,如下:
smtp = new SmtpClient();
//smtp.Host = "smtp.gmail.com";
//smtp.Port = 587;
smtp.EnableSsl = true;
//smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
//smtp.UseDefaultCredentials = false;
//smtp.Credentials = new NetworkCredential( "someuser@gmail.com", "somepassword" );
smtp.Send( mailMessage );
失败了:
System.Net.Mail.SmtpException: {"The SMTP server requires a secure connection or the
client was not authenticated. The server response was: 5.5.1 Authentication Required.
Learn more at "}
是的,“了解更多”之后的空白确实存在,这让事情变得更加有趣。事实上,我不能硬编码这些价值观,因为它们从开发变为内部分期变为现实。所以我想知道为什么它似乎无法使用Web.Config
默认值。我想我错过了一个关键的东西 - 或其他?
*编辑*
以下是一些更多信息,查看我的smtp
对象的值(除了EnableSSL = true之外没有编程覆盖):
Host = smtp.gmail.com (makes sense -- proves I'm actually editing the right Web.Config...
DeliveryMethod = Network
Port = 587
Credentials.UserName = <blank> (Problem???)
Credentials.Password = <blank> (Problem???)
Credentials.Domain = <blank>
*编辑的编辑*
缺少的Username
和Password
值以及下面接受的响应让我想到了问题:Web.Config中的defaultCredentials
必须是false
。< / p>
答案 0 :(得分:26)
对于最终在这里结束的谷歌来说,正确的方法是:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="SomeWebsite Admin <someuser@gmail.com>">
<network host="smtp.gmail.com" port="587" enableSsl="true" defaultCredentials="false" userName="someuser@gmail.com" password="somepassword" />
</smtp>
</mailSettings>
</system.net>
然后你的代码就是:
smtp = new SmtpClient();
smtp.Send( mailMessage );
答案 1 :(得分:8)
我不习惯以这种方式工作,但是在web.config中,defaultCredentials为true,你以编程方式将它设置为false是不同的?
答案 2 :(得分:2)
我认为这部分应该是 &lt; smtp deliveryMethod =“Network”from =“SomeWebsite Admin&lt; someuser@gmail.com>”&gt; 像这样 &lt; smtp deliveryMethod =“Network”from =“someuser@gmail.com”&gt;
答案 3 :(得分:2)
这是一个非常适合我的配置:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="my-email@gmail.com">
<network defaultCredentials="false" host="smtp.gmail.com" port="587" userName="my-username" password="my-password"/>
</smtp>
</mailSettings>
</system.net>
无法将SSL参数添加到网络标记。 您必须从代码中设置它:
var smtpClient = new SmtpClient();
smtpClient.EnableSsl = true;
smtpClient.Send(message);
如果您不想使用外部smtp发送电子邮件,可以将其配置为使用localhost并使用PaperCut(http://papercut.codeplex.com/)等桌面电子邮件接收器。 这是实现该目的的配置:
<system.net>
<mailSettings>
<smtp>
<network host="127.0.0.1" port="25" />
</smtp>
</mailSettings>
</system.net>
希望这有帮助!
答案 4 :(得分:1)
在Web配置文件中定义邮件设置时,无法指定是否应使用SSL / Secure连接。
我很确定这就是你收到错误的原因。
解决这个问题的一种方法是创建自己的邮件发送包装器,然后在你的应用程序中使用它,但你可能已经得到了:)
使用.net会员控件时会变得更复杂,比如忘记密码,创建用户等。 解决这个问题的方法是覆盖SendingMail事件,然后设置 mailclient的EnableSSL属性为true。
我希望我能够提供帮助:)
答案 5 :(得分:1)
如果您使用的是两步验证,请不要忘记生成应用程序专用密码并使用该密码,而不是用于登录Gmail的密码。
(抱歉,我不能将此作为评论添加。发布此帖时没有足够的代表。)