如何在Symfony中无需执行consume命令直接发送邮件?
Symfony 6.2 实现邮件直接发送(无需执行队列消费命令)
你的邮件被加入队列而非直接发送,核心原因是config/packages/messenger.yaml的路由配置中,将邮件发送消息Symfony\Component\Mailer\Messenger\SendEmailMessage指定到了async异步传输通道,导致邮件先进入队列,必须执行消费命令才会触发发送。
你可以通过以下两种方式实现邮件直接发送:
方法1:全局设置邮件默认同步发送
修改config/packages/messenger.yaml的routing节点,移除或注释掉邮件相关的路由规则:
framework: messenger: failure_transport: failed transports: async: dsn: '%env(MESSENGER_TRANSPORT_DSN)%' options: use_notify: true check_delayed_interval: 60000 retry_strategy: max_retries: 3 multiplier: 2 failed: 'doctrine://default?queue_name=failed' routing: # 移除或注释该行,取消邮件的异步路由 # Symfony\Component\Mailer\Messenger\SendEmailMessage: async Symfony\Component\Notifier\Message\ChatMessage: async Symfony\Component\Notifier\Message\SmsMessage: async
修改后,所有通过$mailer->send()发送的邮件都会默认同步执行,无需依赖队列消费命令。
方法2:针对单封邮件强制同步发送
如果需要保留全局异步配置,仅让特定邮件直接发送,可以在调用send()方法时传入第二个参数true,强制该邮件同步发送:
$email = (new Email()) ->from("from@gmail.com") ->to("go@gmail.com") ->subject("Here is my subject") ->html("<p>Here is the content</p>"); // 第二个参数传true,强制当前邮件同步发送 $mailer->send($email, true);
补充说明
如果之前队列中还有未发送的邮件,需要执行一次php bin/console messenger:consume -vv async来处理积压的队列任务,之后新发送的邮件会按照配置直接执行。
内容的提问来源于stack exchange,提问作者Elikill58
相关产品推荐
相关产品推荐

