You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:07:47