GMail + C#+ Web.Config:以编程方式发送邮件,使用Web.Config值引发异常

Bob*_*man 18 c# authentication gmail smtp web-config

鉴于以下部分Web.Config:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="Network" from="SomeWebsite Admin &lt;someuser@gmail.com&gt;">
            <network host="smtp.gmail.com" port="587" defaultCredentials="true" userName="someuser@gmail.com" password="somepassword" />
        </smtp>
    </mailSettings>
</system.net>
Run Code Online (Sandbox Code Playgroud)

以下代码片段:

                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 );
Run Code Online (Sandbox Code Playgroud)

以上工作正常,但注释程序覆盖,如下所示:

                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 );
Run Code Online (Sandbox Code Playgroud)

失败了:

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                              "}
Run Code Online (Sandbox Code Playgroud)

是的,"了解更多"之后的空白确实存在,它让事情变得更加有趣.事实上,我不能硬编码这些价值观,因为它们从开发变为内部分期变为现实.所以我想知道为什么它似乎无法使用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>
Run Code Online (Sandbox Code Playgroud)

*编辑编辑*

下面的缺失UsernamePassword值以及接受的响应让我想到了这个问题:defaultCredentials在Web.Config中必须如此false.

lam*_*tor 27

对于最终在这里结束的谷歌,正确的做法是:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="Network" from="SomeWebsite Admin &lt;someuser@gmail.com&gt;">
            <network host="smtp.gmail.com" port="587" enableSsl="true" defaultCredentials="false" userName="someuser@gmail.com" password="somepassword" />
        </smtp>
    </mailSettings>
</system.net>
Run Code Online (Sandbox Code Playgroud)

然后你的代码就是:

           smtp   = new SmtpClient();
           smtp.Send( mailMessage );
Run Code Online (Sandbox Code Playgroud)


Pha*_*bus 8

我不熟悉这种方式,但是在web.config中,defaultCredentials为true,你以编程方式将它设置为false是不同的?