Время ожидания SmtpClient.Send (MailMessage) с большим списком скрытых копий - C #

Давний читатель, впервые спрашивающий.

Я получаю тайм-аут при отправке электронной почты 110 получателям BCC.

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

Я могу отлично подготовить MailMessage, но когда я вызываю SmtpClient.Send (), время ожидания истекает, даже с порогом в 10 минут. Когда получателей меньше, метод Send () по-прежнему занимает много времени (5-7 минут), но завершается успешно. Это происходит независимо от размера сообщения или вложений, даже без вложений.

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

Моя хостинговая компания в тупике, они слепо клянутся, что все в порядке.

Вы знаете участника StmpClient или MailMessage, которого я могу настроить, чтобы почтовый сервер не делал этого? Или, возможно (даже лучше), как настройка на почтовом сервере Parallels HSPhere, чтобы остановить это действие?

Спасибо заранее.

Образец кода

bool SendEmail(string[] emailAddresses)
{
    MailMessage message = new MailMessage();
    SmtpClient smtp = new SmtpClient("mail.myServer.org");
    message.From = new MailAddress("[email protected]", "Display name");
    message.To.Add("[email protected]");

    foreach (string recipient in emailAddresses)
    {
        // ABout 110 recipients
        message.Bcc.Add(recipient);
    }

    message.Subject = "Whatever";
    message.ReplyTo = new MailAddress("[email protected]");
    smtp.Credentials = new NetworkCredential(message.From.Address, "whatever");

    try
    {
        message.Body = "A few hundred bytes";
        smtp.Timeout = 300000; // 10 mins
        smtp.Send(message);
    }
    catch (Exception ex)
    {
        // Report here
    }

    return true;
}

person Daniel Clarke    schedule 03.05.2012    source источник
comment
Если вы используете свой стандартный почтовый клиент (например, клиент веб-почты поставщика услуг Интернета) для отправки сообщения с множеством адресов BCC, займет ли это столько же времени?   -  person Jim Mischel    schedule 03.05.2012
comment
Джим, я никогда не замечал этого, но я никогда раньше не посылал так много. В следующий раз, когда я сделаю объявление, я воспользуюсь веб-почтой хостинга со списком BCC из 110 пунктов и сравню. Отличное предложение, спасибо.   -  person Daniel Clarke    schedule 03.05.2012
comment
smtp.Timeout = 300000; // 10 мин. это 5 минут, а не 10.   -  person Bilal Halayqa    schedule 25.10.2017


Ответы (1)


Решением этого вопроса является проверка DNS. Мой сервер исходящей электронной почты взял каждый адрес из списка получателей и попытался найти в DNS запись MX для своего домена.
Для 110 адресов было несколько десятков разных доменов, и этот поиск занял много времени. Он сделал это While-U-Wait, и либо мой браузер отказался от ожидания на веб-сервере, либо веб-сервер отказался от ожидания на почтовом сервере (сейчас не могу вспомнить, какой именно).

С тех пор мой провайдер отключил эту опцию.

Дождавшись подтверждения проблемы, я решил ее следующим образом. Вместо того, чтобы отправлять одно электронное письмо 110 получателям, я сохранил детали того, что я хотел отправить, в двух таблицах - одна строка для тела, другая 110 строк для получателей. Затем другая страница ASP опрашивала эту таблицу, выбирая за раз по 10 сообщений электронной почты в очереди, отправляла их и распечатывала HTML-код, чтобы обновить себя через несколько секунд. Создав свои строки на одной странице, я щелкнул страницу отправки и подождал несколько минут, пока она будет собрана. Общее время такое же, возможно, больше, но меньшие партии не означали, что тайм-аут не истек.

Надеюсь, это поможет следующему человеку.

person Daniel Clarke    schedule 26.06.2015