首页 > 解决方案 > 如何调试 Symfony Mailer 交付问题?

问题描述

我正在处理我的第一个 Symfony 5 项目,并且很难使用内置的MailerInterface. 我之前在 Symfony 3 中使用过 Swift Mailer,之前从未遇到过类似的问题。

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Mailer\MailerInterface;
...

class SomeController extends AbstractController {
    public someAction(Request $request, MailerInterface $mailer) {
        ...
        $email = (new TemplatedEmail())
            ->from(new Address('address@example.com', 'My Symfony Mail'))
            //->to($user->getEmail())
            ->to('receiver@example.com')
            ->subject('Subject')
            ->htmlTemplate('email.html.twig');
    
        $mailer->send($email);
    }
}


// .env
#MAILER_DSN=smtp://user:pass@smtp.example.com:25
MAILER_DSN=sendmail://default

如果MAILER_DSN格式不正确,则会抛出异常并显示在 Symfony 调试器页面上,例如The "invaliddsn" mailer DSN must contain a scheme……因此,配置的 DSN 似乎smtp://user:pass@smtp.example.com:25是正确的。在其他邮件应用程序中使用相同的凭据、主机和端口是没有问题的。

但是,当使用此代码时,不会显示错误/异常,并且我根本没有收到任何邮件。当然,我已经仔细检查了日志(没有错误),接收者垃圾邮件文件夹(没有)。指定 SMTP 服务器或 sendmail 没有任何区别。

Symfony 文档只解释了如何处理异常,但在我的例子中没有抛出异常。

虽然在 Symfony 中还有很多关于邮件问题的其他问题,但其中大多数都涉及旧的 Swift Mailer 或其他特定问题。

如何确定邮件是已发送但未收到还是根本未发送?

标签: phpsymfonysymfony-mailer

解决方案


如果它没有抛出异常,您可以假设传输没有引发错误条件。

文档

处理发送失败

当您的传输(SMTP 服务器或第三方提供商)接受邮件以进行进一步传递时,Symfony Mailer 认为发送成功。由于您的提供程序中的某些问题,该消息稍后可能会丢失或无法传递,但这对于您的 Symfony 应用程序来说是遥不可及的。

如果在将电子邮件移交给您的传输时出现错误,Symfony 会抛出 Symfony\Component\Mailer\Exception\TransportExceptionInterface。捕获该异常以从错误中恢复或显示一些消息

您还可以检查send()返回的对象:

方法Symfony\Component\Mailer\SentMessage返回的对象提供对原始消息 ( ) 和一些调试信息 ( ) 的访问,例如由 HTTP 传输完成的 HTTP 调用,这对于调试错误很有用。send()Symfony\Component\Mailer\Transport\TransportInterfacegetOriginalMessage()getDebug()

最后,如果你有Symfony Web Profiler,因为你是在 Web 请求期间进行发送的,你可以检查 profiler 的输出以获取有关邮件发送尝试的信息。


推荐阅读