avris / micrus-mailer

Micrus 框架的邮件发送模块

v4.0.0 2018-01-28 10:36 UTC

This package is auto-updated.

Last update: 2024-08-29 05:06:04 UTC


README

这是一个用于 Micrus 框架 的模块,允许您轻松发送电子邮件。

安装

运行

composer require avris/micrus-mailer

然后在您的 App\App:registerModules 中注册该模块

yield new \Avris\Micrus\Mailer\MailerModule;

最后,运行

bin/env

您将需要输入一个传输字符串,它将被保存到 .env 文件中,例如

  • null:// -- 不会发送任何实际电子邮件
  • smtp://user:password@server.com
  • gmail://user:password@localhost

如果您使用 GMail,请记住 允许不安全应用创建应用密码

手动创建和发送电子邮件

$mail = new Mail();
$mail->addTo(new Address('email@example.com'));
$mail->addCc(new Address('max@mustermann.de'));
$mail->setSubject('Subject');
$mail->setBody('...');
$mail->setAltBody('...');
$mail->embedImage('logo', $this->getRootDir() . '/assets/images/logo.png');
$mail->embedImage('banner', $this->getRootDir() . '/assets/images/banner.png');
$mail->addAttachment($this->getRootDir() . '/assets/pdf/registration.pdf');

$mailer->send($mail);

邮件构建器

遵循一些简单的约定并使用 MailBuilder 服务,您可以大大简化创建电子邮件的过程。

假设您想创建一个名为 Welcome 的模板。

您首先应在翻译密钥 mail:Welcome.subject 中放置电子邮件主题。例如,在文件 translations/mail.en.yml 中创建如下结构

Welcome:
  subject: Welcome to [[main.title]]
  

现在,电子邮件的内容应放在 Mail/Welcome.html.twig 模板中

<!DOCTYPE html>
<div class="mail-container">
    <h1>
        <a href="{{ app.request.absoluteBase }}" target="_blank">
            <img src="cid:logo"/>
            {{ 'main.title'|l }}
        </a>
    </h1>
    <p>
        Hello, {{ username }}!<br/>
        Welcome to our site! Click <a href="{{ tokenUrl }}" target="_blank"> to confirm your account.
    </p>
    <p class="signature">
        Best,<br>
        Team of {{ 'main.title'|l }}
    </p>
</div>

您也可以直接将模板放在 mail:Welcome.body 中。

类似地,对于备用正文:它将来自 Mail/Welcome.text.twig 模板或 mail:Welcome.altBody 翻译密钥。如果没有给出这些,它将来自 HTML 正文。

最后,您应该创建

final class WelcomeTemplate implements MailTemplateInterface
{
    /** @var string */
    private $projectDir;

    public function __construct(string $envProjectDir)
    {
        $this->projectDir = $envProjectDir;
    }

    public function getName(): string
    {
        return 'Welcome'
    }

    public function extend(Mail $mail): Mail
    {
        $mail->embedImage('logo', $this->projectDir . '/assets/images/logo.png');

        return $mail;
    }
}

这个类允许您封装所有可能对电子邮件进行的附加操作,例如附加图像或预定义管理员 BCC。您可能希望将此类逻辑提取到某个 BaseTemplate 中。

现在在控制器中,您只需写下

public function sendMailAction(MailBuilder $mailBuilder, Mailer $mailer)
{
    $mail = $mailBuilder->build(
        $this->get(WelcomeTemplate::class),
        $user->getLocale(),
        [
            'username' => $user->getUsername(),
            'tokenUrl' => $token,
        ]
    );
    $mail->addTo($user); // $user needs to implement AddressInterface
    $mailer->spool($mail);
    
    return new Response($mail); // casting to string generates a preview of the email
}

请注意,您可以通过覆盖电子邮件的本地化,例如,向德语用户发送德语电子邮件,即使当前请求的本地化是英语。

如果您在公共目录中创建了一个 mail.css 文件,它将被用于自动将 CSS 内联到电子邮件的 HTML 中。您可以在 config/assets.yml 中的 mailCss 选项中更改此文件的名称。

发件人

邮件发送器使用低级发送服务(实现 Avris\Micrus\Mailer\Sender\SenderInterface)来执行实际发送。到目前为止,仅支持 PHPMailer,但这个模块也可能与 SwiftMailer、纯 SMTP 连接、ExactTarget 适配器、Amazon SES 适配器等一起使用。

队列

由于发送电子邮件需要一段时间,因此通常最好在用户请求期间保存它,然后在后台执行发送,例如使用 cronjob。默认情况下,Mailer 将电子邮件排队在内存中,然后在请求终止时(在用户收到响应之后)发送。

您可以通过在 config/services.yml 中注册别名来将其更改为文件系统队列。

Avris\Micrus\Mailer\Spool\SpoolInterface: Avris\Micrus\Mailer\Spool\FilesystemSpool

然后,您可以通过设置每分钟运行一次的 cronjob 来发送队列

* * * * *  /var/www/yourproject/current/bin/micrus mailer:spool:send

如果您想强制直接发送,只需执行 $mailer->send($mail) 而不是 $mailer->spool($mail)

日志邮件处理程序

此模块还提供 Monolog 处理程序,以便您的日志可以自动发送到管理员的电子邮件。

例如配置(仅在发生错误时发送日志),请查看 Micrus 示例项目(文件 config/_logger.ymlconfig/prod/_logger.yml)。

配置

config/mailer.yml 文件中,您可以指定发送电子邮件的地址以及应该接收 MailerHandler 日志的管理员列表。

from: micrus@micrus.dev
fromName: Micrus App
logger:
  subject: '[Micrus] An Error Occurred! %message%'
  admins:
    andre@avris.it: Andre

版权