2012-03-30 97 views
0

我有一个ASP.NET 4.0 Web应用程序,人力资源团队用它将这些调查发送给员工。由于我们使用Google Apps,因此我试图通过Google Apps帐户发送这些调查电子邮件。通过Google Apps使用System.Net.Mail发送电子邮件定时发送

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

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

以及我的用户名和密码。

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

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

设置位于web.config中,并从那里读取。

现在我的问题..

hr团队选择多个用户发送调查。他们可以一次选择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) 

如果它来到这个国家,唯一的出路就是retart IIS。如果我重新启动IIS,它会在接下来的12个单元中再次正常工作。

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

回答

1

您不应将超时设置为零。

其默认值为100,000mS(100秒),请至少保留它。

+0

我认为设置超时= 0意味着无限等待?我错了吗? – 2012-03-30 22:30:02

0

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

TimeOut应该至少180秒。

谢谢。

1

System.Net.Mail只支持“Explicit SSL”。

显式SSL

System.Net.Mail只支持 “显式SSL”。显式SSL始于未加密的端口25,然后发出STARTDLS并切换到加密连接。参见RFC 2228

明确SLL会去是这样的:连接25 - >启动TLS(开始加密) - >身份验证 - >发送数据

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

隐式SSL

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

隐SLL会去是这样的:启动SSL(加密开始) - >连接 - >身份验证 - >发送数据

这不被视为一个错误,这是一个功能请求。 SMTP有两种类型的SSL认证,我们只支持一种(按设计) - 明确的SSL。

演示代码:

*

protected void Btn_SendMail_Click(object sender, EventArgs e) 
{ 
     try 
     { 
      var fromAddress = "[email protected]"; 
      var toAddress = "[email protected]"; 
      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; 
     } 
    } 

*

此代码工作没有任何错误!!!!

相关问题