使用 Laravel 的 Mailgun 驱动程序,你如何(优雅地)通过电子邮件发送自定义数据和标签?

Posted

技术标签:

【中文标题】使用 Laravel 的 Mailgun 驱动程序,你如何(优雅地)通过电子邮件发送自定义数据和标签?【英文标题】:Using Laravel's Mailgun driver, how do you (gracefully) send custom data and tags with your email? 【发布时间】:2016-06-21 06:29:24 【问题描述】:

所以我正在使用 Laravel 5.1 并尝试与 Mailgun 集成。嗯,这很简单,但现在我正尝试从我的应用程序中发送 custom variables 以及我的电子邮件。

实际上,由于 Mandrill 的“新方向”等原因,我正在将我们的应用程序从 Mandrill 切换过来。有了它们,我可以通过电子邮件标头提供变量和标签,但使用 Mailgun,只有在您通过 SMTP 发送时才有效。在 Laravel 中,Mail::send() 使用 API 调用,所以理论上我会使用 "v:my-custom-data" => ""this_id": 123" 添加元数据,但我想避免像那样更改核心类。

我也考虑过使用Bogardo/Mailgun,但是我必须用Mailgun::send()替换所有Mail::send()s,然后我无法在本地发送电子邮件(基于环境的电子邮件驱动程序),然后是应用程序将与 Mailgun “结婚”。

以前有人做过吗?如果我在这里不清楚,请告诉我。

【问题讨论】:

【参考方案1】:

我解决了自己的问题。我错了,你可以通过 SMTP 方法添加自定义变量:

// Send email with custom variables and tags in Laravel
Mail::send('emails.blank',
    ['html' => 'This is a test of Mailgun. <strong>How did it work out?</strong>'],
    function($message) 
        $message->to('jack@mailinator.com');
        $message->subject('Mailgun API Test');

        $headers = $message->getHeaders();
        $headers->addTextHeader('X-Mailgun-Variables', '"msg_id": "666", "my_campaign_id": 1313');
        $headers->addTextHeader('X-Mailgun-Tag', 'test-tag');
    );

我的测试不够充分。很高兴知道,但我认为这是一个未记录的功能,所以我建议谨慎使用。

【讨论】:

附带说明,SparkPost 的 API 并非如此,尽管有类似的元数据处理。我最近试过了。【参考方案2】:

你可以在 Laravel 5 中这样做:

Mail::send(['text' => 'my_template'], $data, function ($message) 
  ..
  $message->getSwiftMessage()->getHeaders()->addTextHeader('X-Mailgun-Tag', 'my-tag');
);

【讨论】:

【参考方案3】:

Laravel 5.4+ 更新

正如您在offical docs 中看到的那样:

Mailable 基类的 withSwiftMessage 方法允许您注册一个回调,该回调将在发送消息之前使用原始 SwiftMailer 消息实例调用。这使您有机会在消息传递之前对其进行自定义:

/**
 * Build the message.
 *
 * @return $this
 */
public function build()

    $this->view('emails.orders.shipped');

    $this->withSwiftMessage(function ($message) 
        $message->getHeaders()
                ->addTextHeader('Custom-Header', 'HeaderValue');
    );

【讨论】:

【参考方案4】:

Mailgun 驱动程序的 Laravel 实现不支持选项/参数。

这是一个 Gist,它增加了对本机驱动程序的支持:https://gist.github.com/j0um/27df29e165a1c1e0634a8dee2122db99

【讨论】:

以上是关于使用 Laravel 的 Mailgun 驱动程序,你如何(优雅地)通过电子邮件发送自定义数据和标签?的主要内容,如果未能解决你的问题,请参考以下文章

Mailgun、Mandrill 和 Ses 驱动程序、SMTP 和 phpmailer,在 Laravel 5.1 中使用哪一个?

markdown Laravel Mailgun安装程序

使用 Mailgun API 在 Laravel 8 中未发送电子邮件

Laravel 8通过api客户端发送mailgun错误:未经授权的响应:禁止

Laravel5.5 邮件驱动使用 SMTP 驱动实现邮件发送

laravel框架总结(十五) -- 发送邮件