如何调试Symfony Mailer交付问题?



我正在做我的第一个Symfony 5项目,并努力使用MailerInterface中的构建发送邮件。我以前在Symfony 3中使用过Swift Mailer,以前从未遇到过类似的问题。

use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentMailerMailerInterface;
...
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…因此,配置的DSNsmtp://user:pass@smtp.example.com:25似乎是正确的。在其他邮件应用程序中使用相同的凭据、主机和端口是没有问题的。

然而,当使用这段代码时,没有显示错误/异常,我根本没有收到邮件。当然,我已经仔细检查了日志(没有错误),收件人的垃圾邮件文件夹(没有)。指定SMTP服务器或sendmail没有任何区别。

Symfony文档只解释如何处理异常,但在我的情况下没有抛出异常。

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

我怎么知道邮件是发送了,没有收到还是根本没有发送?

MailerInterface使用Messenger的异步功能。

如果您在config/packages/messenger.yaml中注释默认配置

#SymfonyComponentMailerMessengerSendEmailMessage: async

您的邮件将立即发送。

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

From the docs:

发送失败处理

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

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

你也可以检查send()返回的对象:

SymfonyComponentMailerTransportTransportInterfacesend()方法返回的SymfonyComponentMailerSentMessage对象提供了对原始消息(getOriginalMessage())和一些调试信息(getDebug())的访问,例如HTTP传输完成的HTTP调用,这对调试错误很有用。

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

最新更新