none
C# Асинхронная отправка писем RRS feed

  • Вопрос

  • Приветствую коллеги.
    Изучаю вопрос асинхронной отправки писем (C# .Net 4.0, VS2012, win7) используя SmtpClient. Для тестирования было выбрано 2 варианта:
    1. Используя метод SendAsync: в цикле было создано необходимое кол-во объектов SmtpClient с вызовом метода SendAsync. Метод обратного вызова освобождает ресурсы и считает кол-во срабатываний. После необходимого числа срабатываний вызывающий поток продолжает работу (синхронизация за счёт  ManualResetEvent).
    2. Используя ThreadingPool: в pool передаётся делегат, внутри которого создаётся SmtpClient и выполняется отправка сообщения синхронно. Освобождаем ресурсы, выводим информацию о свободных потоках объекта ThreadingPool, считаем кол-во срабатываний и сигнализируем в вызывающий поток.

    Ожидалось, что приложение будет отправлять множество писем одновременно, но этого не происходит. В обоих случаях письма отправляются... как будто парами. Между парами интервал секунды в 2-3. Между письмами в паре интервал около секунды.
    Порядок отправки писем произвольный, т.е. не совпадает с порядком добавления делегатов в пул потоков.
    При изменении SMTP сервера динамика сохраняется, время между парами и отдельными письмами изменяется (больше\меньше в зависимости от физического нахождения сервера).

    Вопрос как обычно: кто виноват и что делать?

    P.S. Возникает ощущение, что где-то стоит синхронизация отправки, которая не позволяет отправлять письма асинхронно.

    19 октября 2012 г. 9:50

Ответы

  • Привет.

    С логикой отправки у вас вроде все правильно.

    Попробуйте добавить в проект конфиг файл (Application Configuration File), в котором задать кол-во одновременных подключений так:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.net>
        <connectionManagement>
          <add address="*" maxconnection="1000"/>
        </connectionManagement>
        <defaultProxy enabled="false"/>
      </system.net>
    </configuration>


    Для связи [mail]

    • Помечено в качестве ответа Konstantin.Ogorodov 22 октября 2012 г. 16:02
    22 октября 2012 г. 8:17

Все ответы

  • Сервер SMTP свой собственный? Может все-таки он чудит?

    Из своего опыта работы с SmtpClient могу сказать, что (использовал синхронную отправку) письма (~10-20) отправлялись практически мгновенно (<<1 сек.).

    19 октября 2012 г. 11:14
  • Сервера:

    • Gmail - бесплатная учётка (для личного использования)
    • Mail.ru - бесплатная учётка (для личного использования)
    • Sendgrid - платный тариф.

    Ни на одном из серверов я не наблюдал одновременной отправки всей пачки.

    19 октября 2012 г. 14:09
  • Привет.

    С логикой отправки у вас вроде все правильно.

    Попробуйте добавить в проект конфиг файл (Application Configuration File), в котором задать кол-во одновременных подключений так:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.net>
        <connectionManagement>
          <add address="*" maxconnection="1000"/>
        </connectionManagement>
        <defaultProxy enabled="false"/>
      </system.net>
    </configuration>


    Для связи [mail]

    • Помечено в качестве ответа Konstantin.Ogorodov 22 октября 2012 г. 16:02
    22 октября 2012 г. 8:17
  • Помогло.
    Благодарю.
    22 октября 2012 г. 16:01