我想异步发送电子邮件以获得更快更轻的http响应,但我正在努力解决许多新概念。
例如,文档讨论了spool。它说我应该将spool与文件一起使用,然后使用命令发送电子邮件。但是我应该如何运行该命令呢?如果我设置一个cronjob每1分钟执行一次该命令(cron
中可用的最小值),用户将不得不平均等待30秒才能发送电子邮件(例如,注册电子邮件)。
所以我考虑使用队列代替。我已经在使用RabbitMQBundle进行图像处理(例如缩略图创建)。但是我只是定期使用这个,所以它是从cronjob中消耗的。
也许我应该创建一个始终等待新邮件到达电子邮件队列并尽快交付的daemon?
答案 0 :(得分:2)
解决方案是将每封电子邮件发送到队列,然后使用服务使用该队列。我的服务非常简单,它只是将项目从队列中取出,其中每个项目都是一个包含from,to,body等的数组,并发送该电子邮件。我使用Thumper让Rabbit更容易使用:github.com/videlalvaro/Thumper。我确保服务始终使用' sv' (来自Runit):smarden.org/runit/sv.8.html。您可以使用您喜欢的任何其他服务或守护程序管理器。
答案 1 :(得分: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 &');
}
这不是很干净,但它确实起到了作用。
答案 2 :(得分:0)
您需要2个服务,一个用于假脱机消息,另一个用于发送即时电子邮件。查看this