Shopware自定义插件如何检查邮件发送成功?是否有相关函数?
在Shopware自定义插件中检查邮件发送状态的方案
当然有办法!不管是Shopware 5还是Shopware 6(后者基于Symfony生态,邮件系统依赖Symfony Mailer),你都能通过代码捕获邮件发送的成功/失败状态,甚至精准检测SMTP连接失败这类问题。下面给你两种实用的实现方式:
1. 直接捕获发送阶段的异常(最直观的方式)
当你在插件里主动触发邮件发送时,如果遇到SMTP连接失败、认证错误、邮件被拒绝等问题,对应的邮件服务类会抛出异常。你只需要用try-catch块包裹发送逻辑,就能直接拿到状态标识。
Shopware 6 代码示例:
use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mime\Email; use Symfony\Component\Mailer\Exception\TransportExceptionInterface; class YourPluginMailService { private $mailer; public function __construct(MailerInterface $mailer) { $this->mailer = $mailer; } public function sendNotificationEmail(): bool { $email = (new Email()) ->from('your-shop@example.com') ->to('customer@example.com') ->subject('Order Confirmation') ->html('<p>Thanks for your order!</p>'); try { $this->mailer->send($email); // 发送成功,返回true或执行后续业务逻辑 return true; } catch (TransportExceptionInterface $e) { // 捕获所有传输类异常:SMTP连接失败、认证错误、投递拒绝等 error_log("Email send failed: " . $e->getMessage()); return false; } } }
Shopware 5 补充:
如果你还在维护Shopware 5插件,逻辑类似,只是依赖的类不同:
use Shopware\Components\Mail\Mailer; use Shopware\Components\Mail\Exception\TransportException; class YourPluginMailService { private $mailer; public function __construct(Mailer $mailer) { $this->mailer = $mailer; } public function sendEmail(): bool { $mail = $this->mailer->createMail(); $mail->setFrom('your-shop@example.com'); $mail->addTo('customer@example.com'); $mail->setSubject('Test Mail'); $mail->setBody('Hello!'); try { $this->mailer->send($mail); return true; } catch (TransportException $e) { error_log("Mail failed: " . $e->getMessage()); return false; } } }
2. 全局监听邮件事件(适合批量监控)
如果你不想在每一处邮件发送代码里都写try-catch,可以通过监听Shopware/Symfony提供的邮件事件,全局监控所有邮件的发送状态。
Shopware 6 事件订阅示例:
创建一个事件订阅器,监听成功和失败事件:
use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Mailer\Event\MessageSentEvent; use Symfony\Component\Mailer\Event\MessageFailedEvent; use Symfony\Component\Mailer\MailerEvents; class EmailStatusMonitorSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ MailerEvents::MESSAGE_SENT => 'onEmailSent', MailerEvents::MESSAGE_FAILED => 'onEmailFailed', ]; } public function onEmailSent(MessageSentEvent $event) { $email = $event->getMessage(); // 记录成功日志,或者更新业务状态 error_log("Email sent to: " . $email->getTo()[0]->getAddress()); } public function onEmailFailed(MessageFailedEvent $event) { $email = $event->getMessage(); $error = $event->getException()->getMessage(); // 记录失败详情,比如SMTP连接问题 error_log("Email failed for: " . $email->getTo()[0]->getAddress() . " | Error: " . $error); } }
然后在插件的services.xml里注册这个订阅器:
<service id="YourPlugin\Subscriber\EmailStatusMonitorSubscriber"> <tag name="kernel.event_subscriber"/> </service>
注意事项
- 上述方法只能捕获发送阶段的失败(比如SMTP连接不上、认证失败),如果邮件已经被SMTP服务器接收,但后续被退回(比如收件人不存在),这种属于"投递后软失败",Symfony/Shopware无法直接捕获。要监控这种情况,你需要配置邮件退回通知(比如设置
Return-Path),并结合邮件服务商的工具来处理。 - 记得在插件里做好错误日志记录,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Nem Par
相关产品推荐
相关产品推荐

