如何调试 Symfony Mailer 发送问题?

How to debug Symfony Mailer delivery problems?

我正在处理我的第一个 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 似乎是正确的。在其他邮件应用程序中使用相同的凭据、主机和端口是没有问题的。

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

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

虽然在 Symfony 中还有很多关于邮件问题的其他问题,但其中大部分都是针对较旧的 Swift Mailer 或其他特定问题。

如何判断邮件是否已发送但未收到或根本未发送?

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

来自docs

Handling Sending Failures

Symfony Mailer considers that sending was successful when your transport (SMTP server or third-party provider) accepts the mail for further delivery. The message can later be lost or not delivered because of some problem in your provider, but that’s out of reach for your Symfony application.

If there’s an error when handing over the email to your transport, Symfony throws a Symfony\Component\Mailer\Exception\TransportExceptionInterface. Catch that exception to recover from the error or to display some message

您还可以check the object that send() returns:

The Symfony\Component\Mailer\SentMessage object returned by the send() method of the Symfony\Component\Mailer\Transport\TransportInterface provides access to the original message (getOriginalMessage()) and to some debug information (getDebug()) such as the HTTP calls done by the HTTP transports, which is useful to debug errors.

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