【问题标题】:GMail + C# + Web.Config: Send Mail Works Programmatically, Throws Exception Using Web.Config ValuesGMail + C# + Web.Config:以编程方式发送邮件,使用 Web.Config 值引发异常
【发布时间】:2011-01-24 08:48:31
【问题描述】:

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

还有如下代码sn-p:

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

是的,“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>

* EDIT 的 EDIT *

缺少的UsernamePassword 值以及下面接受的响应提示我解决了这个问题:Web.Config 中的defaultCredentials 必须是false

【问题讨论】:

    标签: c# authentication smtp gmail web-config


    【解决方案1】:

    我不熟悉这种工作方式,但在 web.config 中 defaultCredentials 为 true,您在以编程方式执行时将其设置为 false 有区别吗?

    【讨论】:

    • 尝试取消注释 UseDefaultCredentials,设置为 true 或 false 无效。请记住,在上面失败的示例中,该行已被注释掉。
    • 您的 UseDefaultCredentials 线索让我能够识别问题:Web.Config 中的 defaultCredentials 必须为 false。谢谢!
    【解决方案2】:

    在 Web 配置文件中定义邮件设置时,无法指定是否应使用 SSL/安全连接。

    我很确定这就是您收到错误的原因。

    解决这个问题的一种方法是创建您自己的邮件发送包装器,然后在您的应用程序中使用它,但您可能已经掌握了 :)

    使用 .net 会员控制时会变得更加复杂,例如忘记密码、创建用户等。 解决这个问题的一种方法是覆盖 SendingMail 事件,然后设置 邮件客户端的 EnableSSL 属性为 true。

    希望能帮到你:)

    【讨论】:

    • 啊,我可能误解了你的问题 :) 但很好,你成功了。
    【解决方案3】:

    我认为这部分应该是 像这样

    【讨论】:

    • 很高兴听到你的回答
    • 观察力不错。我在想那里的违规行为可能是个问题。我尝试了两种方式,它按预期工作。由于我确实希望显示友好名称,因此我将使用友好名称 格式。
    【解决方案4】:

    对于最终来到这里的谷歌员工,正确的做法是:

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

    【讨论】:

    • 是的。 from 属性的 html 格式转义码很重要。您似乎不能只在该属性中输入电子邮件地址。
    • 这是唯一对我有用的解决方案....将 mailSettings 添加到 web 配置中就可以了。谢谢+1
    【解决方案5】:

    如果您使用两步验证,请不要忘记生成应用程序专用密码并使用该密码,而不是您用于登录 Gmail 的密码。

    (抱歉,我无法将其添加为评论。发布时没有足够的代表。)

    【讨论】:

      【解决方案6】:

      这是一个非常适合我的配置:

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

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-08
        • 2010-11-22
        • 2012-02-07
        • 2011-01-16
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        • 2010-09-21
        相关资源
        最近更新 更多