使用带有 laravel 的 Mandrill API 的“异步”参数

Posted

技术标签:

【中文标题】使用带有 laravel 的 Mandrill API 的“异步”参数【英文标题】:"async" Parameter using Mandrill API with laravel 【发布时间】:2014-08-22 08:30:32 【问题描述】:

这是我的代码:

 $email = "email@gmail.com";
 $data = array(
     'email' => $email,
     'async' => false,
 );

 Mail::queue('user.mails.welcome', $data, function($message) use ($email) 
     $message
         ->to($email, $email)
         ->subject('Welcome to the Laravel 4 Auth App!');
 );

这就是我的 Mandrill 帐户 API 日志中显示的内容:

 Full Request 
     "key": "x",
     "raw_message": "y",
     "async": "1" 
 
 Full Response 
     "email": "xy",
     "status": "queued",
     "_id": "z" 
 

如您所见,电子邮件默认排队。为什么?我该如何改变呢?

【问题讨论】:

【参考方案1】:

根据 Mandrill 文档:

异步:启用针对批量发送优化的后台发送模式。在异步模式下,messages/send 将立即为每个收件人返回“排队”状态。要在以异步模式发送时处理拒绝,请为“拒绝”事件设置 webhook。对于不超过 10 个收件人的消息,默认为 false;无论 async 的值如何,超过 10 个收件人的消息总是异步发送。

基本上,Mandrill 所做的事情与你在 Laravel 中使用 Mail::send 还是 Mail::queue 无关。

所有通过 Mandrill 发送的电子邮件都会按照为您的帐户定义的参数排队并发送出去。换句话说:他们决定您的电子邮件最终何时发送。

编辑:Laravel 的 Mandrill 邮件传输总是在启用异步模式的情况下发送。如果不编辑类,就无法配置它:MandrillTransport

【讨论】:

【参考方案2】:

我不确定我是否理解。您的电子邮件正在排队,因为您使用的是queue() 方法:

Mail::queue('user.mails.welcome', $data, function($message) use ($email) 

如果你不想排队,那么使用send()方法:

Mail::send('user.mails.welcome', $data, function($message) use ($email) 

【讨论】:

【参考方案3】:

我必须设置一个“发件人”电子邮件才能完成这项工作。

【讨论】:

【参考方案4】:

mandrill api 的 'async' 参数不会暴露给 Laravel 邮件闭包。我刚刚扩展了 MandrillTransport 类并将 Swift_Mime_Message 传递给它,以便我可以捕获响应,它将被“发送”或“拒绝”(并且 reject_reason 将填充诸如“硬/软反弹”之类的内容),我可以存储在我的应用程序中:

class Mandrill extends MandrillTransport
 
  public function send(\Swift_Mime_Message $message, &$failedRecipients = null)
  
     $client = $this->getHttpClient();

     $response = $client->post('https://mandrillapp.com/api/1.0/messages/send-raw.json', [
         'body' => [
             'key' => $this->key,
             'raw_message' => (string)$message,
             'async' => false,
         ],
     ]);
     return $response->json();
  

【讨论】:

以上是关于使用带有 laravel 的 Mandrill API 的“异步”参数的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 不使用 mandrill 发送的电子邮件

如何使用 Mail::send() 获取 Mandrill 消息 ID - Laravel 4

使用 Mandrill 和 Laravel 发送预定的电子邮件

尝试在 Laravel 5 上使用 mandrill 重置密码时出错

无法通过 Mandrill 发送密件抄送电子邮件(通过 Laravel)

Laravel 5.2 重置密码 + Mandrill