Электронная почта с использованием System.Net.Mail через Google Apps Время ожидания

У меня есть веб-приложение ASP.NET 4.0, которое отдел кадров использует для рассылки опросов сотрудникам. Поскольку мы используем 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 с лишним.

В чем может быть проблема? Пожалуйста помоги.


person Chris Job    schedule 30.03.2012    source источник


Ответы (3)


Вы не должны устанавливать таймаут равным нулю.

Его значение по умолчанию - 100 000 мс (100 секунд), попробуйте оставить его как минимум.

person Magnus Johansson    schedule 30.03.2012
comment
Я думал, что установка тайм-аута = 0 означает ждать бесконечно? Я ошибся? - person Chris Job; 31.03.2012

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). Не существует официального RFC, охватывающего неявный SSL.

Неявный SLL будет выглядеть примерно так: Start SSL (start encryption) -> Connect -> Authenticate -> send data

Это не считается ошибкой, это запрос функции. Существует два типа SSL-аутентификации для SMTP, и мы поддерживаем только один (по задумке) - явный 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;
        }
    }

*

Этот код работает без ошибок !!!!

person Manoj Bansal    schedule 18.03.2013

Крис, TimeOut заставляет приложение ASP.NET ждать выполнения запроса перед автоматическим завершением работы. Итак, если вы укажете timeOut равным нулю, ASP.NET не будет ждать выполнения запроса и выдаст ошибку по истечении времени ожидания операции.

TimeOut должен быть не менее 180 секунд.

Спасибо.

person Naren    schedule 11.12.2012