我正在尝试使用SMTP向用户发送邮件。我可以在用户点击发送按钮时发送邮件,但是花费将近7秒钟来向用户发送成功消息太长,并且用户可能会在不知不觉中多次点击按钮,如果花费这么长时间。如果用户单击提交按钮时没有此sendmail()
方法,则需要不到一秒的时间,但使用此sendmail()
时,它需要花费大约7秒的时间。这个问题可能是什么原因?
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);
答案 0 :(得分:2)
因为这个过程本来就很慢;对Send(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);
}
}
(如果您愿意,可以使用较新的Task框架实现相同的目的)
您应该知道,生成的线程中的任何异常都不能(轻松)由调用线程(即页面运行的线程)处理。您应该在SendMail方法中实现某种形式的日志记录来记录任何异常。
答案 1 :(得分:1)
答案 2 :(得分:1)
使用Send()时遇到了同样的问题,尽管每封电子邮件对我来说最多需要20秒:/。与托管服务提供商(云网络服务器和邮件服务器相同)来回聊天后,我仍然没有运气。
我研究了2天,最后在SendGrid.com的文档中发现了一个脚注,其中提到某些托管服务提供商限制/限制 SMTP端口25 。
(https://sendgrid.com/docs/Integrate/index.html)
我更改为其他 SMTP端口587 ,时间从20秒降至每封电子邮件不到一秒。
也许试试。