2014-01-17 9 views
2

Я пытаюсь отправить почту пользователю с помощью SMTP. Я могу отправлять почту, когда пользователь нажимает кнопку отправки, но для получения успешного сообщения пользователю требуется слишком много секунд, и пользователь может нажимать кнопку несколько раз неосознанно, если это займет так много времени. Без этого метода sendmail(), когда пользователь нажимает кнопку отправки, он принимает меньше секунды, но с этим 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

Поскольку процесс может быть по своей сути медленным; вызов 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); 
    } 
} 

(Вы можете достичь того же эффекта, используя более новые рамки задач, если вы хотите)

Вы должны знать, что каких-либо исключений внутри порожденной нити не может (легко) обрабатываться вызывающим потоком, то есть потоком, в котором выполняется страница. Вы должны реализовать некоторую форму ведения журнала внутри метода SendMail для регистрации любых исключений.

1

Я была такая же проблема при использовании Send(), хотя каждая электронная почта принимает до 20 секунд для меня: /. После общения взад-вперед с хостинг-провайдером (тот же самый для облачного веб-сервера и почтового сервера) мне все равно не повезло.

Я исследовал в течение 2 дней и, наконец, натолкнулся на сноску в документации на SendGrid.com, в которой упоминалось, что некоторые хостинг-провайдеры ограничивают/дросселируют SMTP-порт 25.

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

я изменил другой SMTP порт 587 и время снизился с 20 секунд до менее чем за одну секунду на электронную почту.

Возможно, попробуйте это.

Смежные вопросы