使用带有 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 重置密码时出错