WedX - журнал о программировании и компьютерных науках

Отправка запланированной электронной почты с помощью Планировщика Azure / Postal / MVC

Мой проект размещен в Azure, и я хотел бы каждое утро отправлять электронное письмо пользователям, которые забыли выполнить определенные задачи в моем приложении.

У меня есть электронная почта (отправка по почте). Если я запустил саму функцию, электронные письма будут отправлены должным образом.

Я настроил планировщик Azure для запуска действия HTTP, метода получения, [https://www.example.com/Email/EmailReminder]. Запланированное задание считается успешным, но электронные письма не отправляются.

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

public void EmailReminder()
{
     var remCheckOuts = // query code here                                
     into grouped
     select new Reminder
     {
          /// populate viewmodel 
     });    

    // send emails
    foreach (var i in remCheckOuts)
    {
                string Full = i.Full;
                string FirstName = i.FirstName;
                var CheckOutCt = i.CheckOutCt;                   

                dynamic email = new Email("emReminder");
                email.FromAdd = "[email protected]";
                email.To = "[email protected]";
                email.NPFirstName = NPFirstName;
                email.CheckOutCt = CheckOutCt;
                email.Send();
      } 
}
19.01.2016

  • Правильно ли вы настроили исходящий SMTP-порт в web.config, как описано здесь? Подсказка - Azure не предоставляет вам чистый SMTP-сервер - вам понадобится сторонний поставщик, например SendGrid, или вы можете развернуть виртуальную машину, если хотите развернуть свою собственную. 19.01.2016
  • Да - электронные письма отправляются правильно, если просто запустите функцию, указанную выше. Однако планировщик, который я настроил для доступа к этой странице, работает успешно, но ничего не отправляет. Я знаю, что в моем коде не хватает чего-то, что ищет планировщик. Если он создает задание cron из вышеперечисленного, я не знаю, как это сделать ... 19.01.2016
  • Как вы определяете, что электронное письмо не вышло? Вы сказали, что задание показывает, что оно выполнялось в истории заданий, и когда вы нажимаете ссылку вручную, электронное письмо исчезает. Возможно, возникла проблема с аутентификацией? Если это так, возможно, вам помогут эти документы. 19.01.2016
  • Я настроен как получатель для тестирования, и сайт Azure показывает, что задание выполняется успешно. Я разберусь с этой проблемой аутентификации, возможно, это проблема. Для тестирования я отключил все требования аутентификации на своей стороне, но, возможно, мне что-то не хватает! 19.01.2016
  • Не могли бы вы уточнить - если я использую метод Планировщика Azure, нужно ли мне также настраивать веб-задание? 19.01.2016
  • Подход к веб-заданию, описанный Матиасом, является альтернативой использованию Scheduler. Вам не нужно делать и то, и другое. Я не буду пытаться убеждать вас так или иначе (поскольку это требует более глубокого анализа вашего общего решения), но любой из них должен суметь выполнить эту задачу. Одно из отличий (в пользу веб-задания) - это количество писем для отправки, поскольку вы можете достичь тайм-аута, описанного Матиасом. 19.01.2016
  • У меня возникла проблема с аутентификацией. Мой оригинальный сценарий отправляется сейчас. Спасибо. 20.01.2016

Ответы:


1

Я думаю, ваш лучший выбор - это веб-работа. Я предполагаю, что у вас уже есть веб-приложение, поэтому, если вы добавите веб-задание, в котором используется Webjob SDK, вы можете создать функцию с подписью:

public class Functions
{
    public static void ProcessTimer([TimerTrigger("0 0 9 1/1 * ? *", RunOnStartup = true)]
    TimerInfo info)
    {
        var remCheckOuts = // query code here                                
     into grouped
     select new Reminder
     {
          /// populate viewmodel 
     });    

    // send emails
    foreach (var i in remCheckOuts)
    {
                string Full = i.Full;
                string FirstName = i.FirstName;
                var CheckOutCt = i.CheckOutCt;                   

                dynamic email = new Email("emReminder");
                email.FromAdd = "[email protected]";
                email.To = "[email protected]";
                email.NPFirstName = NPFirstName;
                email.CheckOutCt = CheckOutCt;
                email.Send();
      } 
    }
}

Он использует TimerTrigger для срабатывания в заданное время (определяемое тегом CRON выражение), это намного проще, чем подход HTTP POST (в котором вам нужно будет время ожидания HTTP во внимание).

Если у вас возникли проблемы с выражениями CRON, проверьте CronMaker.

Для отправки электронной почты и следования примерам SDK WebJobs вы можете использовать расширение SendGrid в сочетании с очередью для разъединения, таким образом вы можете иметь несколько функций TimerTrigger (например, утреннюю почту, вечернюю почту для X, ночные электронные письма для Y, ежемесячные отчеты) и одну функцию, которая отправляет все письма:

public class MailNotification{
    public string From {get;set;}
    public string To {get;set;}
    public string Subject {get;set;}
    public string Body {get;set;}
}

public class Functions
{
    public static void MorningMail([TimerTrigger("0 0 9 1/1 * ? *", RunOnStartup = true)]
    TimerInfo info, [Queue]("mail") ICollector<MailNotification> mails)
    {
        var remCheckOuts = // query code here                                
     into grouped
     select new Reminder
     {
          /// populate viewmodel 
     });    

    // send emails
    foreach (var i in remCheckOuts)
    {
            mails.Add(new MailNotification(){
                To = "[email protected]",
                From = "[email protected]",
                Subject = "Whatever Subject you want",
                Body = "construct the body here"
            }); 

      } 
    }

    public static void EveningMail([TimerTrigger("0 0 18 1/1 * ? *", RunOnStartup = true)]
    TimerInfo info, [Queue]("mail") ICollector<MailNotification> mails)
    {
        var remCheckOuts = // query code here                                
     into grouped
     select new Reminder
     {
          /// populate viewmodel 
     });    

    // send emails
    foreach (var i in remCheckOuts)
    {
            mails.Add(new MailNotification(){
                To = "[email protected]",
                From = "[email protected]",
                Subject = "Whatever Subject you want",
                Body = "construct the body here"
            }); 

      } 
    }

    public static void SendMails([QueueTrigger(@"mails")] MailNotification order,
        [SendGrid(
            To = "{To}",
            From = "{From}",
            Subject = "{Subject}",
            Text = "{Body}")]
        SendGridMessage message)
    {
        ;
    }
}
19.01.2016
  • Обратной стороной этого подхода является то, что веб-задание должно быть всегда включено, тогда как планировщик может запускать задание только в запланированное время. Перед выбором следует провести анализ затрат и выгод. См. Также: azure.microsoft. ru / en-us / documentation / articles / 19.01.2016
  • Это правда, если веб-приложение уже работает Always On, оно не требует дополнительных затрат. У Планировщика есть техническая проблема с обработкой тайм-аута HTTP, он попытается повторно запустить задание, если вы не измените стратегию повторных попыток, что является непростой задачей и может быть достигнуто только с помощью Management API. 19.01.2016
  • Интересно. Любая ссылка с более подробной информацией? Также я думаю, что вопрос OP не столько о планировщике, сколько об используемой библиотеке электронной почты. 19.01.2016
  • У меня есть ощущение, что я добавлю несколько таких напоминаний по электронной почте в свое приложение. Я хочу что-то, что будет надежно работать. Правильно ли я понимаю, что мне нужно будет преобразовать свою электронную почту в работу CRON? Как мне преобразовать свою функцию выше в задание CRON или файл, загружаемый в планировщик? Для меня это в новинку. 19.01.2016
  • Я просто попробовал запустить приведенный выше код в 1145 по тихоокеанскому стандартному времени, и ничего не вышло. Есть ли что-то еще, что мне нужно добавить в свой проект, чтобы вызвать это? 19.01.2016
  • Показанный мной пример кода должен выполняться в WebJob. Веб-задание похоже на фонового работника, который живет в вашем веб-приложении, это в основном консольное приложение. Вы можете развернуть его, загрузив файл .Exe, полученный путем компиляции консольного приложения или посредством непрерывной интеграции из репозитория. Вот полное Быстрое начало работы с Веб-вакансии. 19.01.2016
  • Я смущен. Нужно ли мне поместить эту веб-задачу в отдельный проект? Я видел эту статью, но похоже, что учетная запись хранения и т. Д. - это больше, чем мне нужно, чтобы просто отправить это электронное письмо? 19.01.2016
  • Как предположил Мэтт, Azure не отправляет почту. Вам потребуется внешний SMTP-сервис (Sendgrid, MailGun, AmazonSES). У вас есть 2 возможных варианта планирования работы: 1-Продолжайте использовать Планировщик Azure и отправляйте почту с помощью внешнего SMTP, но вы должны иметь в виду, что Планировщик будет ждать 30 секунд, если вам потребуется больше 30 секунд, чтобы сделать все. ваша отправка, Планировщик не удастся и попытается снова запустить действие, что может быть не очень хорошо. 2-Используйте веб-задания, это может показаться более устрашающим, но это тот тип сценариев, для которого они были созданы. 19.01.2016
  • Я обнаружил, что у меня возникла проблема с аутентификацией в моем сценарии выше. Но я думаю, что ваш сценарий будет моим лучшим решением в долгосрочной перспективе. Указывает на оба!?! :) 20.01.2016
  • @Daniela - Матиас, безусловно, заработал положительные баллы (спасибо!), Но если вашу проблему с аутентификацией легко объяснить, добавьте ее в качестве ответа (и примите), чтобы другие могли получить пользу. 20.01.2016

  • 2

    Что касается моего вопроса о том, почему Планировщик Azure не отправлял мои электронные письма, это была проблема с аутентификацией, которая была решена на портале Azure.

    Ответ Матиаса тоже был правильным, и направление, в котором я буду двигаться в будущем.

    19.01.2016
    Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

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

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]