Временные проблемы с отправкой электронной почты с ASP.NET - PullRequest
9 голосов
/ 07 сентября 2010

Я ненавижу просто публиковать здесь трассировку стека, но у меня нет идей ... Мое приложение отправляет электронные письма для различных задач на веб-сайте, и в 90% случаев проблем нет. Однако каждый раз ASP.NET выдает странное исключение, которое, похоже, связано с подключением к почтовому серверу (я использую бизнес-серверы Google для электронной почты). Ошибка слишком общая для отладки, поэтому трассировка стека приведена ниже. Мое приложение перехватывает исключение и записывает общий ответ «повторите попытку через 5 минут».

Я озадачен этой ошибкой, потому что:

  • Электронная почта Google, как правило, очень надежна (она отправляется с моего домена, а не с gmail.com).
  • Объемы очень низкие, поэтому это не должно быть проблемой загрузки / рассылки спама.
  • Ошибка очень общая.
  • Повторная попытка в течение 5 минут почти всегда позволяет отправить сообщение без проблем, при этом ни один из параметров (получатель, тема, тело) не изменился.

Есть идеи? Единственные нерешенные вопросы, о которых я могу думать, это то, что:

  1. Отправка электронной почты происходит синхронно. Это то, что я на самом деле хочу, чтобы я отвечал пользователю сообщением о состоянии успеха / неудачи.
  2. Я использую Amazon EC2 в качестве сервера, если это имеет какое-либо отношение к делу.

код:

    public static void SendMail(String from, String to, String subject, String body, bool IsHtml)
    {
        MailMessage m = new MailMessage(from, to, subject, body);
        m.IsBodyHtml = IsHtml;

        SmtpClient smtpClient = new SmtpClient();
        smtpClient.EnableSsl = true;
        smtpClient.Send(m);
    }

Исключение:

System.Net.Mail.SmtpException: Error in processing. The server response was: 4.3.0 Mail server temporarily rejected message. m6sm2190005vcx.24
at System.Net.Mail.DataStopCommand.CheckResponse(SmtpStatusCode statusCode, String serverResponse)
at System.Net.Mail.DataStopCommand.Send(SmtpConnection conn)
at System.Net.Mail.SmtpConnection.OnClose(Object sender, EventArgs args)
at System.Net.ClosableStream.Close()
at System.Net.Mail.MailWriter.Close()
at System.Net.Mail.SmtpClient.Send(MailMessage message)

Ответы [ 2 ]

6 голосов
/ 07 сентября 2010

В прошлом я работал с системами массовой рассылки. Полученное вами сообщение об исключительной ситуации является полностью описательным: SMTP-сервер временно не принимает почту. Это может быть связано с рядом условий:

  1. Сервер занят
  2. Вы отправляете слишком много писем слишком быстро (это может сделать вас похожим на спамера)
  3. Общие ошибки

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

0 голосов
/ 07 сентября 2010

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

Возможно, вы даже можете использовать локальный сервер STMPS, который использует GoogleMail в качестве сервера ретрансляции.В этом случае вы можете использовать встроенную функциональность pickupdirectory вместо того, чтобы писать ее самостоятельно.

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