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

时间:2010-03-06 02:05:20

标签: c# authentication smtp gmail 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>

以下代码段:

                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>

*编辑的编辑*

缺少的UsernamePassword值以及下面接受的响应让我想到了问题:Web.Config中的defaultCredentials必须是false。< / p>

6 个答案:

答案 0 :(得分:26)

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

<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>

然后你的代码就是:

           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的密码。

(抱歉,我不能将此作为评论添加。发布此帖时没有足够的代表。)