2014-01-17 123 views
2

我想用SMTP发送邮件给用户。当用户点击发送按钮时,我可以发送邮件,但是向用户发送成功消息需要将近7秒的时间,而且用户可能会在不知情的情况下多次点击该按钮。如果没有这个方法,当用户点击提交按钮时,它会花费不到一秒钟的时间,但是这个sendmail()需要花费将近7秒。这个问题可能是什么原因?使用smtp发送邮件太慢

 string from = ConfigurationManager.AppSettings.Get("From"); 
     string pwd = ConfigurationManager.AppSettings.Get("Password"); 
     string Client= ConfigurationManager.AppSettings.Get("client"); 
     string port = ConfigurationManager.AppSettings.Get("port"); 
     string toMail = ConfigurationManager.AppSettings.Get("toaddress"); 

     NetworkCredential loginInfo = new NetworkCredential(from,pwd); 
     MailMessage msg = new MailMessage(); 
     SmtpClient smtpClient = new SmtpClient(client, int.Parse(port)); 

     msg.From = new MailAddress(from); 
     msg.To.Add(new MailAddress(toMail)); 
     msg.Subject = "Test Subject"; 
     msg.Body = "Test Mail" 



     msg.IsBodyHtml = true; 

     smtpClient.EnableSsl = true; 
     smtpClient.UseDefaultCredentials = false; 
     smtpClient.Credentials = loginInfo; 
     smtpClient.Send(msg); 

回答

1

因为这个过程本来就很慢;对发送(msg)的调用将通过邮件服务器进行身份验证,然后验证并发送电子邮件 - 这不会在几毫秒内发生。

我将推出一个新的线程来发送邮件: -

public static void SendMail(MailMessage message) 
{ 
    var thread = new Thread(() => Mailer.SendMailThread(message)); 
    thread.Start(); 
} 

// note - ConfigWrapper just wraps app.config settings 
private static void SendMailThread(MailMessage message) 
{ 
    using (var server = new SmtpClient(ConfigWrapper.MailServer)) 
    { 
     server.Credentials = new NetworkCredential(ConfigWrapper.MailUser, ConfigWrapper.MailPassword); 
     server.Send(message); 
    } 
} 

(你可以使用较新的任务框架内实现同样的事情,如果你愿意的话)

你应该知道的任何异常在生成的线程内部不能(很容易)由调用线程(即页面运行的线程)处理。您应该在SendMail方法内部实现某种形式的日志记录以记录任何异常。

1

我同时使用发送(),尽管每个邮件占用了​​20秒,我有同样的问题。在与托管服务提供商(与云服务器和邮件服务器相同)聊天之后,我仍然没有运气。

我研究了2天,终于在SendGrid.com的文档中看到一个脚注,提到一些主机提供商限制/节流SMTP端口25

https://sendgrid.com/docs/Integrate/index.html

我变到另一个SMTP端口587和时间的推移,从20秒降低到小于每电子邮件第二。

也许试试。