php 不能再使用Symfony Mailer发送模板化电子邮件了吗?

qyzbxkaa  于 2023-03-11  发布在  PHP
关注(0)|答案(1)|浏览(126)

我试图发送模板化的电子邮件,一切工作正常,只是文本或html,但当我尝试使用TemplatedEmail而不是电子邮件,我得到这个错误:“邮件必须包含文本或HTML部分或附件。",就好像我没有提供htmlTemplate一样。
设置如下

$mailer = new Mailer(Transport::fromDsn($_ENV['SMTP_DNS']));

$email = (new TemplatedEmail())
            ->from(new Address('my_address', 'NAME'))
            ->to($userEmail)
            ->subject('Some text...')
            ->htmlTemplate('user/email.html.twig');

$mailer->send($email);

树枝在那里,写得很对,我检查了100遍。
在twig.yaml中,路径也设置正确

twig:
    default_path: '%kernel.project_dir%/templates'

twig本身只有一个<h1>Some text</h1>标记,用于测试,仅此而已
我试着直接在控制器中注入邮件程序(基本上应该是这样的),但即使“MAILER_DSN”配置正确,也没有发送电子邮件。

y0u0uwnf

y0u0uwnf1#

正如我所怀疑的,如果您自己示例化Mail,并且希望集成Twig,那么您也需要将其连接起来。
Mailer组件有一个MessageListener,负责调用BodyRenderer,但在这里,我创建了自己的Mailer,没有在其中注入EventDispatcher(因此不会调度任何事件),也没有在此事件调度器中配置MessageListener。
如果您使用的是Symfony框架,请使用FrameworkBundle配置的邮件服务(它已经连接了MessageListener),而不是自己进行示例化,或者连接Twig集成。
为此,需要加载templates目录,并从其中创建环境,然后渲染它。
下面是代码:

$loader = new FilesystemLoader('Directory_name aka templates', 'App root aka /app');
$twigEnv = new Environment($loader);
$twigBodyRenderer = new BodyRenderer($twigEnv);
$twigBodyRenderer->render($email);

这对我来说很有用,但是同样,使用FrameworkBundle配置的邮件服务要容易得多。
最终代码(硬方式):

$mailer = new Mailer(Transport::fromDsn($_ENV['SMTP_DNS']));

$email = (new TemplatedEmail())
            ->from(new Address('my_address', 'NAME'))
            ->to($userEmail)
            ->subject('Some text...')
            ->htmlTemplate('user/email.html.twig');

$loader = new FilesystemLoader('Directory_name aka templates', 'App root aka /app');
$twigEnv = new Environment($loader);
$twigBodyRenderer = new BodyRenderer($twigEnv);
$twigBodyRenderer->render($email);

$mailer->send($email);

最终代码(正常方式):

//inject MailerInterface $mailer

$email = (new TemplatedEmail())
            ->from(new Address('my_address', 'NAME'))
            ->to($userEmail)
            ->subject('Some text...')
            ->htmlTemplate('user/email.html.twig');

$mailer->send($email);

希望这对你有帮助:)))

相关问题