如何延迟电子邮件发送?

时间:2010-03-29 01:06:38

标签: drupal drupal-6

我目前正在学习Drupal电子邮件功能,例如drupal_mail和hook_mail,以及hook_mail_alter,我之前遇到问题,我需要能够将电子邮件排入队列以延迟交付。例如,在用户注册事件后需要等待一小时的事件注册通知。并且该电子邮件具有用户特定数据,因此不能只是通用模板电子邮件...

我正在使用MailQ模块,主要是因为它的日志记录功能,但我想知道是否可以修改它(或其他东西)以添加可配置的延迟功能?

有什么想法吗?

======================

一些额外的想法:

D6中有2个模块可用于排队电子邮件,MailQ和作业队列(在下面的Nikit列表中)。它们都具有邮件队列功能,这可能非常有用,并且两者都有不同的方法,优点和缺点 - 来自粗略的调查。 EG:MailQ有一个很棒的日志功能,有一个非常有用的管理界面来处理邮件类别,如排队,发送,发送,失败等。你可以设置每个cron运行的电子邮件数量。

但是,尽管Job Queue没有这些类别和日志记录存档,但它确实允许对不同的作业进行优先级排序,如果您同时发出不同的电子邮件类型(例如联系人),这可能非常有用例如,确认,事件注册确认和“邀请朋友”电子邮件。

因此,我对完美队列的想法会将这两个模块集成在一起(它们不能相处得很好),并为每种作业类型提供额外的延迟功能。

但是编写这样的东西远远超出了我的微薄天赋,所以我只需编写一个由cron激活的小型自定义模块,它将查找标记的联系人,其创建日期至少为一小时过去,并找到一种方法将相关信息直接写入MailQ数据库表。

当我的新函数由cron触发时,以及同一个cron运行触发的MailQ函数似乎发生了一些冲突,所以我试图理清如何优先考虑cron MailQ over my function-这样我的函数将在MailQ运行后添加表数据。

1 个答案:

答案 0 :(得分:0)

这不是最优雅的解决方案,但我在使用hook_mail_alter知道交易电子邮件服务之前在D6中做了一些事情,我将电子邮件参数加载到数据库表中,将消息值设置为null,因此它没有&# 39; t挂钩之后发送,然后一个每5分钟运行一次的cron作业将检查表并一次发送几条消息,如果有的话等待。一旦发送,我将状态翻转为已发送。您将收到监视程序错误,指出电子邮件无法发送。

但是使用这种方法,您可以调用类似Mailgun / Mandrill的内容并在钩子中发送预定的电子邮件,或者将其放在带有时间戳字段的数据库表中,例如strtotime(' +2周' )然后每隔x分钟对表进行一次cron作业检查,并在满足时间戳条件时发送。 hook_mail_alter为您提供了一个标识消息的字段,因此您可以使用一个只能捕获特定电子邮件的开关。

如果您对自定义模块感到满意,请查看Mandrill模块。它可能有一个更优雅的解决方案来接管Drupal的电子邮件,而不是我上面所描述的。