使用Azure WebJobs发送不同类型的电子邮件

时间:2015-11-26 16:01:42

标签: c# azure email azure-webjobs azure-webjobssdk

我正在寻找有关如何使用Azure WebJobs处理排队和发送不同类型电子邮件的能力的建议。

在发送电子邮件之前,需要做一些业务逻辑来撰写,填充然后发送。所以说我有10种不同类型的电子邮件

2封电子邮件示例

1)预订确认后,我想要

var note = new BookingConfirmNotification() { BookingId = 2 } 
SomeWayToQueue.Add(note)

2)或当我需要提醒用户做某事时

var reminder = new ReminderNotification() { UserId = 3 }
SomeWayToQueue.Add(reminder, TimeSpan.FromDays(1)

使用WebJob上的QueueTrigger为每种不同类型的电子邮件创建队列是否更好?或者有更好的方法吗?

更新

所以我认为你可以用不同的强类型类添加不同的函数/方法来触发不同的方法,但这似乎不起作用。

public void SendAccountVerificationEmail(
        [QueueTrigger(WebJobHelper.EmailProcessorQueueName)] 
        AccountVerificationEmailTask task, TextWriter log)
    {
        log.WriteLine("START: SendAccountVerificationEmail: " + task.UserId);

        const string template = "AccountVerification.cshtml";
        const string key = "account-verification";

        PrepareAndSend(user.Email, "Account confirmation", template, key, task, typeof(AccountVerificationEmailTask));

        log.WriteLine("END: SendAccountVerificationEmail: " + task.UserId);
    }

    public void SendForgottonPasswordEmail(
        [QueueTrigger(WebJobHelper.EmailProcessorQueueName)] 
        ForgottonPasswordEmailTask task, TextWriter log)
    {
        const string template = "ForgottonPassword.cshtml";
        const string key = "forgotton-password";

        PrepareAndSend(user.Email, "Forgotton password", template, key, task, typeof(ForgottonPasswordEmailTask));
    }

这不起作用 - 将消息添加到队列

时会随机触发不同的方法

如何使用WebJobs实现类似的功能?

2 个答案:

答案 0 :(得分:2)

你是说“compose / populate”逻辑有点沉重,这就是你想要排队的原因吗?什么进程/实体正在创建这些“发送电子邮件”任务?

我可以看到你有一个Azure Queue,其中电子邮件请求排队。假设您正在使用WebJobs SDK(如果您正在处理Azure存储队列等,则应该是这样),您可以使用一个函数来监视发送消息的队列。 WebJobs SDK Extensions包含 SendGrid电子邮件绑定。您可以看到一个与您所描述的内容相近的示例here。此示例基于传入的队列消息发送电子邮件。以这种方式使用SDK,您将获得自动重试支持,毒物队列处理等。

答案 1 :(得分:0)

关于您更新的问题。当多个消费者使用队列时,他们将“循环”,这意味着消息在所有可用的消费者之间分配。这解释了为什么这些方法似乎是随机发射的。

要考虑的事情。您可能希望反转内容并使用队列来捕获用户的交互。

在背后,您可以执行一项或多项操作。

例如。

_bus.Send(new BookingCreatedEvent{Ref="SomeRef", Customer="SomeCustomer"});

_bus.Send(new BookingCancelledEvent{Ref="SomeRef");

这样做的好处是您可以选择在消费方面做什么。现在您想要发送电子邮件,但如果您还要登录数据库或将记录发送到您的CRM,该怎么办?

如果切换到Azure Service Bus主题/订阅,则可以为同一事件提供多个处理程序。

  public static void SendBookingConfirmation([ServiceBusTrigger("BookingCreated","SendConfirmation")] BookingCreatedEvent bookingDetails)
    {
        // lookup customer details from booking details 
        // send email to customer
    }

  public static void UpdateBookingHistory([ServiceBusTrigger("BookingCreated","UpdateBookingHistory")] BookingCreatedEvent bookingDetails)
    {
        // save booking details to CRM
    }