【问题标题】:Email using System.Net.Mail through Google Apps Timing out通过 Google Apps 使用 System.Net.Mail 的电子邮件超时
【发布时间】:2012-03-30 17:16:33
【问题描述】:

我有一个 ASP.NET 4.0 Web 应用程序,HR 团队使用它来向员工发送调查。由于我们使用的是 Google Apps,因此我正在尝试通过 Google Apps 帐户发送这些调查电子邮件。

我使用以下设置发送电子邮件。

Host - smtp.gmail.com
Port - 587
EnableSsl=true

连同我的用户名和密码。

这是发送电子邮件的代码。

using (SmtpClient smtp = new SmtpClient())
                {
                    smtp.Timeout = 0;
                    smtp.Send(message);
                }

设置在 web.config 中并从那里读取。

现在我的问题..

人力资源团队选择多个用户向其发送调查。他们一次只能选择 1 个或最多 100 个来发送调查。由于每个调查链接都必须不同,因此我迭代用户列表并通过电子邮件发送给他们。

现在在应用程序发送最多 12 封电子邮件后,它不再发送。它尝试发送的下一封电子邮件会引发错误。

Message = The operation has timed out.
Status Code =GeneralFailure
Stack Trace =   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at ABC.Business.Mail.SendMail(MailMessage message, String& errorMessage)

然后,如果我再次重试,它会引发错误

Message = Failure sending mail.
Status Code =GeneralFailure
Stack Trace =   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at ABC.Business.Mail.SendMail(MailMessage message, String& errorMessage)

如果它进入这种状态,唯一的出路是重新启动 IIS。如果我重新启动 IIS,它会在接下来的 12 次中再次正常工作。

可能是什么问题?请帮忙。

【问题讨论】:

    标签: asp.net email gmail smtpclient


    【解决方案1】:

    您不应将超时设置为零。

    它的默认值是 100,000mS(100 秒),请尽量保持在这个值。

    【讨论】:

    • 我认为设置 timeout=0 意味着无限等待?我错了吗?
    【解决方案2】:

    System.Net.Mail 仅支持“显式 SSL”。

    显式 SSL

    System.Net.Mail 仅支持“显式 SSL”。显式 SSL 在端口 25 上以未加密状态启动,然后发出 STARTDLS 并切换到加密连接。请参阅 RFC 2228。

    显式 SLL 类似于:25 日连接 -> StartTLS(开始加密)-> 验证 -> 发送数据

    如果 SMTP 服务器从一开始就期望 SSL/TLS 连接,那么这将不起作用。

    隐式 SSL

    无法将隐式 SSL (SMTPS) 与 System.Net.Mail 一起使用。隐式 SSL 将整个连接包装在 SSL 层中。将使用特定端口(端口 465 很常见)。没有涵盖隐式 SSL 的正式 RFC。

    隐式 SLL 类似于:启动 SSL(开始加密)-> 连接 -> 验证 -> 发送数据

    这不被认为是一个错误,它是一个功能请求。 SMTP 有两种类型的 SSL 身份验证,我们只支持一种(根据设计)——显式 SSL。

    演示代码:

    *

    protected void Btn_SendMail_Click(object sender, EventArgs e)
    {
            try
            {
              var fromAddress = "xyz@gmail.com";
              var toAddress = "abc@gmail.com";
                const string fromPassword = "xxxxxxxx";
                string subject = "Sending Demonstration";
                string body = "From: " + txtFrom.Text + "\n";            
               var smtp = new System.Net.Mail.SmtpClient();
               {
                    smtp.Host = "smtp.gmail.com";
                    smtp.Port = 25;
                    smtp.EnableSsl = true;
                    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
                }
                smtp.Send(fromAddress, toAddress, subject, body);
                Response.Write("<script language=javascript> alert('send')</script>");
            }
            catch (Exception ex)
            {            
                txtBody.Text = ex.Message;
            }
        }
    

    *

    此代码运行正常!!!!

    【讨论】:

      【解决方案3】:

      Chris,TimeOut 使 ASP.NET 应用程序在自动关闭之前等待请求执行。因此,如果将 timeOut 设置为零,ASP.NET 将不会等待请求执行,并且会在操作超时时抛出错误。

      TimeOut 至少应为 180 秒。

      谢谢。

      【讨论】:

        猜你喜欢
        • 2011-06-08
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 2020-12-15
        • 2013-08-15
        • 2011-02-02
        相关资源
        最近更新 更多