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

本文关键字:同类型 电子邮件 Azure WebJobs 使用 | 更新日期: 2023-09-27 18:24:48

我正在寻找关于如何使用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实现类似的功能?

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

您是说"compose/popuple"逻辑有点重,这就是为什么要对其进行排队?创建这些"发送电子邮件"任务的流程/实体是什么?

我可以看到你有一个Azure队列,在那里电子邮件请求被排队。假设你正在使用WebJobs SDK(如果你正在处理Azure存储队列等,你应该使用),你可以有一个功能来监控发送消息的队列。WebJobs SDK扩展包括SendGrid电子邮件绑定。你可以看到一个与你在这里描述的内容相近的例子。此示例根据传入队列消息发送电子邮件。以这种方式使用SDK,您将获得自动重试支持、中毒队列处理等。

关于您的最新问题。当多个使用者使用一个队列时,他们将"循环",这意味着消息分布在所有可用的使用者之间。这就解释了为什么这些方法看起来是随机发射的。

值得思考的事情。您可能想要颠倒事物并使用队列来捕获用户的交互。

在它的背后,你可以执行一个或多个动作。

例如。

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

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

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

如果切换到Azure服务总线主题/订阅,则同一事件可以有多个处理程序。

  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
    }