响应 MailGun 的 HTTP post 然后处理消息

Respond to MailGun's HTTP post and then process the message

通过 MailGun 接收邮件时,他们需要在限定时间内回复。我有两个问题:

1) 收到消息后,我需要对其进行处理并将其记录在我的 CRM 中,这需要一些时间。这会导致 MailGun 在我发送响应之前超时。然后 MailGun 一次又一次地重新发送消息,因为它继续超时。

2) MailGun 的 post 不是异步的,但对我的 CRM 的 api 调用是异步的。

所以我需要给MailGun发送一个200响应然后继续处理邮件。并且该过程需要异步。

下面的代码显示了我想要发生的事情。我尝试使用任务,但无法正常工作。有时,如果解决方案需要某种并行任务或线程,那么一次可能会收到很多电子邮件(例如初始化某人的帐户时)。

    public class HomeController : Controller
    {
        [HttpPost]
        [Route("mail1")]
        public ActionResult Mail()
        {
            var emailObj = MailGun.Receive(Request);

            return Content("ok");

            _ = await CRM.SendToEmailApp(emailObj);
        }
    }

感谢您的帮助!

完成您所描述的事情的最简单方法(不推荐,因为如果您的应用程序崩溃,您可能会丢失一些结果)是使用即发即弃任务:

var emailObj = MailGun.Receive(Request);
Task.Run(async () => await CRM.SendToEmailApp(emailObj));
return Content("ok");

但是,我认为您真正想要的是一种消息队列,通过使用消息队列,您可以将消息放入队列(速度足够快)并立即return,同时处理器正在处理消息队列并将结果保存在 CRM 中。
这是使用消息队列代理时的样子。