Swiftmailer 不立即发送
Swiftmailer not sending immediately
我已成功配置我的 symfony webapp 以使用 SMTP 发送电子邮件。但是我所有发送的电子邮件都被放入 spool
目录中。
只有在发送过程中出现错误时才会出现这种情况。对吗?
但是如果我执行命令 swiftmailer:spool:send --env=prod
,我所有的电子邮件都可以正确发送。
为什么我的服务器没有立即发送电子邮件?
那是因为我修复了错误吗?有什么办法可以解决这个问题吗?
swiftmailer:
spool:
type: file
path: %kernel.root_dir%/spool
您可以强制冲洗阀芯。
例如:
$mailer = $this->container->get('mailer');
$mailer->send($message);
$spool = $mailer->getTransport()->getSpool();
$transport = $this->container->get('swiftmailer.transport.real');
if ($spool and $transport) $spool->flushQueue($transport);
还要检查 config.yml 中的假脱机配置。
如果你有:
swiftmailer:
....
spool: { type: memory }
内核终止事件时发送邮件(因此在页面末尾)
A 只需将命令 swiftmailer:spool:send
添加到 crontab
中。 Symfony documentation.
上的这一步不清楚
如果有人通过消息队列 (symfony/messenger) 处理电子邮件,则首选使用内存假脱机。但是,内存假脱机仅在 Kernel::terminate
事件上处理。此事件永远不会发生在 long 运行 console worker 上。
此内核事件正在调用 Symfony\Bundle\SwiftmailerBundle\EventListener\EmailSenderListener::onTerminate()
方法。您可以通过调度您自己的事件并订阅上述方法来手动调用此方法。
src/App/Email/Events.php
<?php
namespace App\Email;
class Events
{
public const UNSPOOL = 'unspool';
}
config/services.yml
services:
App\Email\AmqpHandler:
tags: [messenger.message_handler]
Symfony\Bundle\SwiftmailerBundle\EventListener\EmailSenderListener:
tags:
- name: kernel.event_listener
event: !php/const App\Email\Events::UNSPOOL
method: onTerminate
你的消息队列工作者
src/App/Email/AmqpHandler.php
<?php
namespace App\Email;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class AmqpHandler
{
/** @var EventDispatcherInterface */
private $eventDispatcher;
/** @var Swift_Mailer */
private $mailer;
public function __construct(EventDispatcherInterface $eventDispatcher, Swift_Mailer $mailer)
{
$this->eventDispatcher = $eventDispatcher;
$this->mailer = $mailer;
}
public function __invoke($emailMessage): void
{
//...
$message = (new Swift_Message($subject))
->setFrom($emailMessage->from)
->setTo($emailMessage->to)
->setBody($emailMessage->body, 'text/html');
$successfulRecipientsCount = $this->mailer->send($message, $failedRecipients);
if ($successfulRecipientsCount < 1 || count($failedRecipients) > 0) {
throw new DeliveryFailureException($message);
}
$this->eventDispatcher->dispatch(Events::UNSPOOL);
}
}
您可以阅读有关 symfony/messenger here.
我已成功配置我的 symfony webapp 以使用 SMTP 发送电子邮件。但是我所有发送的电子邮件都被放入 spool
目录中。
只有在发送过程中出现错误时才会出现这种情况。对吗?
但是如果我执行命令 swiftmailer:spool:send --env=prod
,我所有的电子邮件都可以正确发送。
为什么我的服务器没有立即发送电子邮件? 那是因为我修复了错误吗?有什么办法可以解决这个问题吗?
swiftmailer:
spool:
type: file
path: %kernel.root_dir%/spool
您可以强制冲洗阀芯。 例如:
$mailer = $this->container->get('mailer');
$mailer->send($message);
$spool = $mailer->getTransport()->getSpool();
$transport = $this->container->get('swiftmailer.transport.real');
if ($spool and $transport) $spool->flushQueue($transport);
还要检查 config.yml 中的假脱机配置。
如果你有:
swiftmailer:
....
spool: { type: memory }
内核终止事件时发送邮件(因此在页面末尾)
A 只需将命令 swiftmailer:spool:send
添加到 crontab
中。 Symfony documentation.
如果有人通过消息队列 (symfony/messenger) 处理电子邮件,则首选使用内存假脱机。但是,内存假脱机仅在 Kernel::terminate
事件上处理。此事件永远不会发生在 long 运行 console worker 上。
此内核事件正在调用 Symfony\Bundle\SwiftmailerBundle\EventListener\EmailSenderListener::onTerminate()
方法。您可以通过调度您自己的事件并订阅上述方法来手动调用此方法。
src/App/Email/Events.php
<?php
namespace App\Email;
class Events
{
public const UNSPOOL = 'unspool';
}
config/services.yml
services:
App\Email\AmqpHandler:
tags: [messenger.message_handler]
Symfony\Bundle\SwiftmailerBundle\EventListener\EmailSenderListener:
tags:
- name: kernel.event_listener
event: !php/const App\Email\Events::UNSPOOL
method: onTerminate
你的消息队列工作者
src/App/Email/AmqpHandler.php
<?php
namespace App\Email;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class AmqpHandler
{
/** @var EventDispatcherInterface */
private $eventDispatcher;
/** @var Swift_Mailer */
private $mailer;
public function __construct(EventDispatcherInterface $eventDispatcher, Swift_Mailer $mailer)
{
$this->eventDispatcher = $eventDispatcher;
$this->mailer = $mailer;
}
public function __invoke($emailMessage): void
{
//...
$message = (new Swift_Message($subject))
->setFrom($emailMessage->from)
->setTo($emailMessage->to)
->setBody($emailMessage->body, 'text/html');
$successfulRecipientsCount = $this->mailer->send($message, $failedRecipients);
if ($successfulRecipientsCount < 1 || count($failedRecipients) > 0) {
throw new DeliveryFailureException($message);
}
$this->eventDispatcher->dispatch(Events::UNSPOOL);
}
}
您可以阅读有关 symfony/messenger here.