使用不同的消息流在 symfony 上通过邮戳发送电子邮件

Sending email via postmark on symfony with different message streams

随着我的应用程序的发展,我需要以正确的方式向大量用户发送电子邮件。目前我们的交易电子邮件运行良好,这就是它们的结构。

.env 文件:

###> symfony/postmark-mailer ###
MAILER_DSN=postmark://token@default
###< symfony/postmark-mailer ###

发送邮件的控制器:

$email = (new Email())
    ->from('emailaddress', 'Sitename')
    ->to($email)
    ->priority(Email::PRIORITY_HIGH)
    ->subject('Subject line here')
    ->text("Your account's email has been changed to this one. If you didn't do this, contact us.");

//Send it.
$mailer->send($email);

这行得通,但是当我们想批量发送电子邮件(广播)时,这行不通。我们尝试通过这样做来更改 header:

$email = (new TemplatedEmail())
    ->from(new Address('emailaddress', 'Sitename'))
    ->subject('Subject line')
    ->htmlTemplate('email/post.html.twig')
    ->context([
        'postTitle' => $post_title,
        'postContent' => $post_content_updated,
        'profilePicture' => $user->getProfilePicture(),
        'displayName' => $user->getDisplayName(),
    ]);

foreach($subscribers as $subscriber)
{
    $email->addBcc($subscriber->getEmail());
}

$email->getHeaders()
->addTextHeader('X-PM-Message-Stream', 'broadcast');

$mailer->send($email);

我们得到一个错误:ErrorCode: '300', Message: 'Maximum of 50 recipients allowed per email message'.

我注意到这个错误出现在默认事务流中而不是广播中。我们如何进行这项工作?我似乎找不到与此相关的文档。

群发电子邮件不使用 Bcc。您需要为每个电子邮件地址发送单独的电子邮件。 X-PM-Message-Stream 只是 header 表示 Postmark 使用另一个流(使用另一个服务器和其他调整)。您可以通过这种方式在循环中执行此操作:

foreach($subscribers as $subscriber) {
    $email = (new TemplatedEmail())
        ->from(new Address('emailaddress', 'Sitename'))
        ->to($subscriber->getEmail())
        ->subject('Subject line')
        ->htmlTemplate('email/post.html.twig')
        ->context([
            'postTitle' => $post_title,
            'postContent' => $post_content_updated,
            'profilePicture' => $user->getProfilePicture(),
            'displayName' => $user->getDisplayName(),
        ]);

    $email
        ->getHeaders()
        ->addTextHeader('X-PM-Message-Stream', 'broadcast');

    $mailer->send($email);
}

如果您需要尽快广播,您应该使用 API from Postmark。然后,您可以向 API 每个请求发送 500 条消息。您可以同时发送 10 个请求,因此每次处理一个请求的速度约为 5000 条消息(我认为大约需要 1 秒)