Отправка электронной почты с помощью System.Net.Mail через Службы Google. - PullRequest
0 голосов
/ 30 марта 2012

У меня есть веб-приложение ASP.NET 4.0, которое команда HR использует для отправки опросов сотрудникам.Поскольку мы используем Службы Google, я пытаюсь отправить эти электронные письма с опросом через учетную запись Служб Google.

Я использовал следующие параметры для отправки электронных писем.

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)

Если он приходит в это состояние, единственный способвыход для повторного запуска IIS.Если я перезапущу IIS, он снова начнет нормально работать в течение следующих 12 с лишним.

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

Ответы [ 3 ]

1 голос
/ 18 марта 2013

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 будет выглядеть примерно так: Запустить SSL (запустить шифрование) -> Подключиться -> Аутентифицировать -> отправить данные

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

Демонстрационный код:

*

protected void Btn_SendMail_Click(object sender, EventArgs e)
{
        try
        {
          var fromAddress = "xyz@gmail.com";
          var toAddress = "abc@gmail.com";
            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;
        }
    }

*

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

1 голос
/ 30 марта 2012

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

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

0 голосов
/ 11 декабря 2012

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

Время ожидания должно быть не менее 180 секунд.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...