6

我想异步发送电子邮件以获得更快、更轻的 http 响应,但我正在为许多新概念而苦苦挣扎。

例如,文档讨论了spool。它说我应该使用带有文件的假脱机,然后使用命令发送电子邮件。但是我应该如何运行该命令?如果我将 cronjob 设置为每 1 分钟执行一次该命令(在 中可用的最小值cron),用户将不得不等待平均 30 秒才能发送他们的电子邮件(例如,注册电子邮件)。

所以我想改用队列。我已经在使用RabbitMQBundle进行图像处理(例如,缩略图创建)。但我只定期使用这个,所以它是在一个 cronjob 中使用的。

也许我应该创建一个始终等待新消息到达电子邮件队列并尽快交付它们的守护进程?

4

3 回答 3

2

解决方案是将每封电子邮件发送到一个队列,然后使用服务使用该队列。我的服务非常简单,它只是将项目从队列中取出,其中每个项目都是一个包含 from、to、body 等的数组,然后发送该电子邮件。我正在使用使 Rabbit 更易于使用的 Thumper:github.com/videlalvaro/Thumper。我确保服务始终使用“sv”(来自 Runit):smarden.org/runit/sv.8.html。您可以使用您喜欢的任何其他服务或守护程序管理器。

于 2015-01-05T13:42:48.223 回答
1

我和你有同样的问题。你最后是怎么解决你的问题的?

目前我在 crontab 中运行一个小脚本以便循环运行:

<?php
include('/var/www/vendor/symfony/symfony/src/Symfony/Component/Filesystem/LockHandler.php');
use Symfony\Component\Filesystem\LockHandler;

$lock = new LockHandler('mailer:loop');
if ($lock->lock()) {
    system('cd /var/www && php app/console swiftmailer:spool:send');
    sleep(1);
    $lock->release();
    shell_exec('cd /var/www && php LoopMailer.php > /dev/null 2>/dev/null &');
}

它不是很干净,但它完成了他的工作。

于 2014-11-13T10:15:36.107 回答
0

您需要 2 项服务,一项用于假脱机消息,另一项用于发送即时电子邮件。检查这个

于 2012-11-26T19:36:30.963 回答