使用Azure Scheduler / Postal / MVC发送预定电子邮件

时间:2016-01-19 18:43:31

标签: c# asp.net-mvc azure postal

我的项目托管在Azure上,我希望每天早上向忘记在我的应用程序中完成某些任务的用户发送电子邮件。

我建立了电子邮件(使用Postal发送)。如果我自己运行该功能,电子邮件将按预期发送。

我已将Azure调度程序配置为运行HTTPs操作,get方法,[https://www.example.com/Email/EmailReminder]。预定的作业报告成功,但没有电子邮件发出。

我以前没必要这样做,所以我怀疑我的功能>之间缺少链接调度工作。我已经搜索了如何设置它的代码示例,但我还没有找到解决方案。什么是调度程序期望我不给它?

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline as unis

h = 11
data = {'d':12, 'f':0.22, 'h':11, 'G':250}

HA = np.linspace(data['d']*data['f'], h, 50)
FA = (data['G'] * ((np.arcsin((data['d']*data['f'])/(2*HA)))))+np.random.normal(scale=1, size=len(HA))

app = unis(HA, FA, s=2)
HA2 = np.linspace(np.min(HA), np.max(HA), 1000)
plt.plot(HA, FA, 'ro')
plt.plot(HA2, app(HA2))

2 个答案:

答案 0 :(得分:5)

我认为你最好的选择是Webjob。我假设你已经有了一个Web应用程序,所以如果添加一个使用Webjob SDK的Webjob,你可以使用签名创建一个函数:

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 = "test@test.com";
                email.To = "test2@test2.com";
                email.NPFirstName = NPFirstName;
                email.CheckOutCt = CheckOutCt;
                email.Send();
      } 
    }
}

它使用TimerTrigger在给定时间触发(由CRON expression定义),它比HTTP POST方法(在其中需要考虑HTTP超时)要简单得多

如果您在使用CRON表达式时遇到问题,请检查CronMaker

对于电子邮件发送和关注WebJobs SDK示例,您可以使用SendGrid extension与队列配对解耦,这样您就可以拥有多个TimerTrigger功能(例如,Morning邮件) ,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 = "test2@test2.com",
                From = "test@test.com",
                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 = "test2@test2.com",
                From = "test@test.com",
                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)
    {
        ;
    }
}

答案 1 :(得分:1)

关于为什么Azure Scheduler没有发送我的电子邮件的问题,这是在Azure门户中解决的身份验证问题。

马蒂亚斯的回答也是正确的,我将来的方向也将继续。