在 Symfony 5 中异步使用电子邮件
Consuming emails async in Symfony 5
我使用 Symfony 5 Messanger 来处理以异步方式发送的电子邮件。我有:
电子邮件 DNS 在 .env
中配置
MAILER_DSN=smtp://localhost
.env 中的信使传输 DNS(我使用数据库来存储电子邮件队列)
MESSENGER_TRANSPORT_DSN=doctrine://default
messenger.yaml
中的传输和路由
serializer:
default_serializer: messenger.transport.symfony_serializer
transports:
# https://symfony.com/doc/current/messenger.html#transport-configuration
async: '%env(MESSENGER_TRANSPORT_DSN)%'
failed: 'doctrine://default?queue_name=failed'
# sync: 'sync://'
routing:
# Route your messages to the transports
# 'App\Message\YourMessage': async
'Symfony\Component\Mailer\Messenger\SendEmailMessage': async
当前情况: 发送电子邮件到队列工作 - 使用邮件程序导致在数据库中插入记录 table messanger_messages.
问题:如果我正确理解文档,对于异步电子邮件处理,第一封电子邮件排队进入数据库(对于我的情况),然后使用命令 php bin/console messenger:consume -vv async
。不幸的是,执行此命令不会导致发送电子邮件。数据库中的记录保持不变,它们不属于 失败 类别并且不会生成任何电子邮件。
为了确保发送配置正确,我切换到同步方法,在这种情况下,电子邮件会立即生成并发送。所以我的问题是是否应该采取另一个步骤来使排队的电子邮件被使用,例如。编写自定义发送处理程序(我假设 messanger:consume
命令会为我执行此操作)或者如果我错过了此过程的任何其他部分导致排队的电子邮件未被使用。
我想通了所以为后代添加答案。由于服务器配置问题,命令 messanger:consume
无法正常工作。
插入数据库的消息是根据 apache php.ini
中设置的时区使用当前日期时间插入的。碰巧 php 有第二个不同的 php.ini
配置文件,仅适用于 CLI 命令。
在 CLI 中执行 messanger:consume
使脚本使用不同的时区,从而导致用于获取队列中消息的查询为 return 空结果(永远无法满足条件)。
更新和同步两个 php.ini
文件中的时区解决了这个问题,并建立了使用队列消息的机制。
您可以在 CLI.
中使用 php --ini
找到控制台 php.ini
我使用 Symfony 5 Messanger 来处理以异步方式发送的电子邮件。我有:
电子邮件 DNS 在 .env
中配置MAILER_DSN=smtp://localhost
.env 中的信使传输 DNS(我使用数据库来存储电子邮件队列)
MESSENGER_TRANSPORT_DSN=doctrine://default
messenger.yaml
中的传输和路由serializer: default_serializer: messenger.transport.symfony_serializer transports: # https://symfony.com/doc/current/messenger.html#transport-configuration async: '%env(MESSENGER_TRANSPORT_DSN)%' failed: 'doctrine://default?queue_name=failed' # sync: 'sync://' routing: # Route your messages to the transports # 'App\Message\YourMessage': async 'Symfony\Component\Mailer\Messenger\SendEmailMessage': async
当前情况: 发送电子邮件到队列工作 - 使用邮件程序导致在数据库中插入记录 table messanger_messages.
问题:如果我正确理解文档,对于异步电子邮件处理,第一封电子邮件排队进入数据库(对于我的情况),然后使用命令 php bin/console messenger:consume -vv async
。不幸的是,执行此命令不会导致发送电子邮件。数据库中的记录保持不变,它们不属于 失败 类别并且不会生成任何电子邮件。
为了确保发送配置正确,我切换到同步方法,在这种情况下,电子邮件会立即生成并发送。所以我的问题是是否应该采取另一个步骤来使排队的电子邮件被使用,例如。编写自定义发送处理程序(我假设 messanger:consume
命令会为我执行此操作)或者如果我错过了此过程的任何其他部分导致排队的电子邮件未被使用。
我想通了所以为后代添加答案。由于服务器配置问题,命令 messanger:consume
无法正常工作。
插入数据库的消息是根据 apache php.ini
中设置的时区使用当前日期时间插入的。碰巧 php 有第二个不同的 php.ini
配置文件,仅适用于 CLI 命令。
在 CLI 中执行 messanger:consume
使脚本使用不同的时区,从而导致用于获取队列中消息的查询为 return 空结果(永远无法满足条件)。
更新和同步两个 php.ini
文件中的时区解决了这个问题,并建立了使用队列消息的机制。
您可以在 CLI.
中使用php --ini
找到控制台 php.ini