Отсылка электронных писем из Windows Azure приложений

| Воскресенье, 16 июня, 2013

Метки: ASP.NET MVC, Windows Azure Комментарии: 0

Пользователь купил подписку и нужно отправить ему e-mail с благодарностью. Или подписка заканчивается и нужно отправить email c предупреждением и ссылкой на продление подписки. Когда процесс покупки завершен оправляем письмо с подтверждением. Это все общие сценарии практически для любого веб-приложения, когда необходимо отправлять e-mail.

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

E-mail сервисы для Windows Azure

Итак, у Windows Azure нет встроенного почтового сервера. И для этого есть причины. Допустим, разработчик размещает приложение в Windows Azure. Это приложение будет доступно по IP-адресу, который принадлежал ранее кому-то еще. Это общая платформа, так что возможно все. И если этот адрес использовался для рассылки спама, то наверняка доставшийся ip-адрес может находиться в черных списках многих спам-фильтров.

Отсутствие почтового сервера – это "хорошая защита", но отправлять письма все таки надо. Если есть собственный SMTP-сервер, можно просто настроить приложение .NET, размещенное на Windows Azure, для использования этого сервера. Также, есть много сторонних SMTP-сервисов, например Yandex, который позволяет бесплатно настраивать почту для домена. Из зарубежных можно посоветовать SendGrid, который является партнером Microsoft и официально поддерживается как сервис Windows Azure для отправки e-mail сообщений. Клиенты Windows Azure получают специальное предложение оправлять 25 тысяч писем в месяц бесплатно.

Асинхронные операции

Далее покажем отсылку email-сообщений и построение масштабируемого, устойчивого к ошибкам приложения. Это будет сделано с применением асинхронных операций. Ajax тут ни при чем. Просто будет показан пример слабосвязанного приложения.

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

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

Покажите мне код!

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

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

[HttpPost]
public ActionResult Register(RegistrationModel model)
{
   if (ModelState.IsValid)
   {
       // ... здесь сохраняем пользователя в базу данных ...
 
       // сериализуем модель
       var serializer = new JavaScriptSerializer();
       var modelAsString = serializer.Serialize(model);
 
       // сохраняем сообщение в очередь emailconfirmation
       var account = CloudStorageAccount.
                   FromConfigurationSetting("StorageConnection");
       var queueClient = account.CreateCloudQueueClient();
       var queue = queueClient.GetQueueReference("emailconfirmation");
       queue.CreateIfNotExist();
 
       queue.AddMessage(new CloudQueueMessage(modelAsString));
 
       return RedirectToAction("Thanks");
   }
   return View(model);
}

Как видно из кода, работать с очередями не очень сложно. Нужно просто ввести данные в сообщение и передать это сообщение в очередь. В коде выше модель RegistrationModel сериализована в JSON-строку. Сообщение очереди может содержать бинарные или текстовые данные не более 64 килобайт.

Комментарии
Никто еще не оставил здесь комментарий.
Войдите, чтобы написать комментарий , или воспользуйтесь формой ниже.
 

Copyright © CodeHint.ru 2013-2019