Laravel,在时间戳匹配中发送电子邮件的最佳方法

时间:2019-07-19 13:20:57

标签: laravel laravel-5

Laravel 5.6。

我有一个表,其中包含一个名为“ end”的列,它是一个时间戳和“ user_id”。 该日期是将来的日期。到达该日期时,我需要向该用户发送一封电子邮件(总是相同的电子邮件)。

我了解到:

https://laravel.com/docs/5.6/scheduling

https://laravel.com/docs/5.6/mail#queueing-mail

https://laravel.com/docs/5.6/notifications#mail-notifications

但是我不确定从哪里开始。

所有这些工具都可以发送电子邮件,但是对我来说,最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

由于发送电子邮件可能会阻止进程,因此我建议您使用队列,特别是later($when, new Mailable())方法。

$when = now()->addMinutes(10);

Mail::to($request->user())
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->later($when, new OrderShipped($order));

您可以在将数据保存到数据库的同时排队,因为此时您将拥有所需的所有信息。

或者,您可以使用调度程序,该调度程序每x分钟运行一次,将当前时间与您的end时间进行比较,并在当前时间等于或超过{{ 1次。尽管考虑到Laravel具有队列API,这感觉有些笨拙。

答案 1 :(得分:2)

这是我的建议,我已经使用这种方法已有相当长的一段时间了,它的工作原理就像是一种魅力:

  1. 为表创建迁移,我们称之为cron_jobs。在其中创建除idcreated_atupdated_at之外的两列:signature(字符串)和flag(布尔值)。
  2. 当然,为其创建一个模型,该模型将为CronJob,并在其中定义fillable数组。
  3. 迁移表并使用以下命令在其中创建条目:

    • signature ='send:email'
    • 标志= 1
  4. 创建签名为send:email

  5. 的命令
  6. 在命令中,检查签名为“ send:email”的flag表中cron_jobs的条目。如果该值为0,请向您发送一封电子邮件,告知您CRON出于某种原因崩溃了,以便您可以查看日志并查看错误原因并从函数中返回。
  7. 如果为1,则将其设置为0,然后检查当前日期时间,并将其与您的end相匹配:

    • 如果不匹配,则不执行任何操作。将标志设为1。
    • 如果匹配,则发送电子邮件,将标志设为1。
  8. 现在转到服务器的cPanel并设置一个cron,每分钟运行一次此命令。

如果发送电子邮件的过程要花费一分钟以上的时间,则根据命令过程的耗时,每2分钟或每15分钟运行cron。但是,如果确实超过一分钟,那么请确保如何处理匹配的时间戳,因为脚本不会每分钟运行一次,因此您可能希望采用与匹配确切的时间戳不同的发送电子邮件的方法。

这种方法可确保错误脚本不会运行两次,并立即通知您命令有问题。

此外,我们不使用用户调度程序,因此我们不会冒很多人使用laravel调度程序时遇到的错误或意外行为的风险。

果然,将来,如果您想再次做一些迭代的事情,只需在表中添加另一个签名,就可以使用相同的方法使其扩展。

无需赘述,如果继续收到错误报告电子邮件,请继续解决该问题并手动将标志输入重新设置为1,以便下次脚本可以完全运行。

我希望能帮上忙。