Отправка электронной почты через ограничение SMTP

Я поддерживаю веб-сайт для небольшой организации с примерно 100-120 членами.

Каждый месяц мы отправляем электронное письмо с уведомлением наших членов по темам, которые мы рассмотрим на предстоящих встречах.

Я пытаюсь использовать наш веб-сайт, чтобы дать нам способ отправить эти электронные письма, но наш сайт ASP Hosting имеет определенный лимит в 50 писем в час.

Теоретически, я полагаю, я мог бы поставить поток спать в течение 1 минуты после вызова SmtpClient.Send(MailMessage) с помощью Thread.Sleep(60000), например:

public const int ONE_MINUTE = 60000;

public String SiteEmailAddress { get; set; }
public String SiteMailServer { get; set; }
public String SiteMailUserId { get; set; }
public String SiteMailPwd { get; set; }

public void BulkEmail(String emailMessage) {
    using (var msg = new MailMessage()) {
        msg.From = new MailAddress(SiteMailAddress);
        msg.Body = emailMessage;
        msg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
        using (var server = new SmtpClient(SiteMailServer, 25)) {
            server.Credentials = new NetworkCredential(SiteMailUserId, SiteMailPwd);
            foreach (var person in Personnel.GetActiveMembers()) {
                var msgTo = person.PersonalEmail;
                if (!String.IsNullOrEmpty(msgTo)) {
                    msg.To.Clear();
                    msg.To.Add(new MailAddress(msgTo, person.FullName));
                    server.Send(msg);
                    System.Threading.Thread.Sleep(ONE_MINUTE);
                }
            }
        }
    }
}

Это либо заставило бы наш сайт казаться мертвым более часа, пока это бежало, или это, скорее всего, потерпит неудачу.

Какое простое решение для этого?

+1
24 мар. '16 в 21:35
источник поделиться
5 ответов

Основываясь на вашем случае, я бы предложил несколько решений:
1- Запланируйте задачу для запуска каждые 1,2 минуты, например, и эта задача вызовет метод отправителя электронной почты и не будет использовать Sleep.
Пример планирования задач на веб-сайте asp.net: http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
Лучший способ запуска запланированных задач
http://hangfire.io/

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

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

+2
24 мар. '16 в 21:48
источник

Не используйте свой веб-сервер для отправки писем.

Позвольте API отправки почты обработать его для вас. Это не то место, где можно рекомендовать определенный продукт, поэтому я этого не сделаю.


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

+2
24 мар. '16 в 21:40
источник

Если вы решите отправить электронные письма с вашего веб-сервера, вы можете использовать Фоновые задачи в ASP.NET. Скотт Гензельман хорошо написал об этом. , Вы можете заставить его обрабатывать 50 за один раз, а затем ждать оставшегося часа, прежде чем продолжить или подождать 72 секунды между каждым электронным письмом, чтобы вы отправляли максимум 50 часов.

+1
24 мар. '16 в 21:45
источник

Прежде всего создавая фоновый поток и укладывая его в сон, он никоим образом не убивает приложение. Он просто возьмет поток из пула потоков и заблокирует его до завершения операции, а затем удалит его.

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

Я бы рекомендовал использовать внешний API, чтобы он мог обрабатывать вас.

0
24 мар. '16 в 22:48
источник

Мы используем sendgrid для отправки электронных писем для нашего сайта, у которого есть бесплатный ежемесячный лимит в 12 000 https://sendgrid.com/free, возможно, это более простая альтернатива?

0
24 мар. '16 в 21:39
источник

Посмотрите другие вопросы по меткам или Задайте вопрос