draw/mailer

0.10.47 2024-09-25 20:25 UTC

README

由于 Symfony/Mailer 尚未完成,某些行为可能在后续版本中受到影响,请将此包视为实验性的

此包允许将电子邮件的创建委托给一个特定的类。

它还允许配置默认的 from

配置

draw_post_office:
  default_from: 'support@example.com'

您不是在控制器中直接构建电子邮件,而是创建一个继承自 Symfony\Component\Mime\Email 的类,并为它创建一个 writer

任何实现 Draw\Component\Mailer\EmailWriter\EmailWriterInterface 的服务都将注册为 writer。必须返回一个方法与优先级(作为值)的映射,以将方法注册为 writer(如果您返回方法作为值,则认为优先级为 0)。系统将检测电子邮件是否与方法的第一个参数的类匹配,并在需要时调用它。

邮局声明了一个监听器,用于 Symfony\Component\Mailer\Event\MessageEvent,以便将其连接到 symfony 邮件系统。

按照惯例,建议创建一个 Email 文件夹,在其中创建所有电子邮件类,并为实现 Draw\Component\Mailer\EmailWriter\EmailWriterInterface 的类创建一个 EmailWriter

示例

让我们创建一个忘记密码的电子邮件,此类将包含用于编写电子邮件的最 最小 信息,在这种情况下,触发忘记密码电子邮件流程的用户电子邮件。

<?php namespace App\Email;

use Symfony\Bridge\Twig\Mime\TemplatedEmail;

class ForgotPasswordEmail extends TemplatedEmail
{
    private $emailAddress;

    public function __construct(string $emailAddress)
    {
        $this->emailAddress = $emailAddress;
        parent::__construct();
    }

    /**
     * The email address of the person who forgot is email
     */
    public function getEmailAddress(): string
    {
        return $this->emailAddress;
    }
}

我们必须为电子邮件创建一个 writer

<?php namespace App\Email;

use App\Email\ForgotPasswordEmail;
use App\LostPasswordTokenProvider;
use Draw\Component\Mailer\Email\EmailWriterInterface;

class ForgotPasswordEmailWriter implements EmailWriterInterface
{
    private $lostPasswordTokenProvider;
    
    public function __construct(LostPasswordTokenProvider $lostPasswordTokenProvider)
    {
        $this->lostPasswordTokenProvider = $lostPasswordTokenProvider;
    }
    
     public static function getForEmails(): array
     {
         return ['compose']; // Or ['compose' => 0];
         
     }
    
    public function compose(ForgotPasswordEmail $forgotPasswordEmail)
    {
        $emailAddress = $forgotPasswordEmail->getEmailAddress();
        $forgotPasswordEmail
            ->to($emailAddress)
            ->subject('You have forgotten your password !')
            ->htmlTemplate('emails/forgot_password.html.twig')
            ->context([
                'token' => $this->lostPasswordTokenProvider->generateToken($emailAddress)
            ]);
    }
}

基本控制器示例

<?php namespace App\Controller;

use App\Email\ForgotPasswordEmail;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;

class ForgotPasswordController
{
    public function forgotPasswordAction(
        Request $request,
        MailerInterface $mailer
    ): Response {
        if ($request->getMethod() == Request::METHOD_GET) {
            return $this->render('users/forgot_password.html.twig');
        }

        // ... You should have a logic to validate there is a user and send a different email ... /
        $mailer->send(new ForgotPasswordEmail($request->request->get('email')));

        return new RedirectResponse($this->generateUrl('check_email'));
    }
}

这样,您就可以保持控制器整洁,并按照编写电子邮件和覆盖的方式对其进行结构化。

系统还将 Envelope 参数作为第二个参数传递,以防您需要它。

如果您查看 Draw\Component\Mailer\EmailWriter\DefaultFromEmailWriter,您将看到如何创建一个为所有发送的电子邮件调用的 writer。