在Laravel 5.1 / OctoberCMS中使用attachData对邮件进行排队

时间:2018-01-11 14:44:03

标签: laravel laravel-5.1 octobercms

使用Mail::send时,以下 IS 正常工作

$email = 'my@email.com';
$name = 'My Name';
$invoice = InvoicePdf::generate($invoice_id); // generates PDF as raw data

Mail::send('mail.template', null, function($message) use ($name, $email, $invoice) {

    $message->to($email, $name);
    $message->subject('Thank you for your order!');
    $message->attachData($invoicePdf, 'invoice.pdf', ['mime' => 'application/pdf']);

});

它工作正常,并使用正确的PDF附件生成电子邮件。

但是,如果我将Mail::send更改为Mail::queue,则会收到以下错误:

  

Unable to JSON encode payload. Error code: 5

     

/var/www/html/october/vendor/laravel/framework/src/Illuminate/Queue/Queue.php line 90

如果我将$message->attachData();行删除,那么它甚至可以与Mail::queue一起使用,因此来自附件的原始数据似乎会导致队列出现问题,但相关内容中没有任何内容{{3} }或October有关如何处理此问题的文档。

1 个答案:

答案 0 :(得分:0)

可能是因为$invoicePdf数据是PDF file的原始数据,而且在保存到数据库时php无法处理该数据(attachData)。

  嗯,替代你可以生成文件,然后只需将file path附加到邮件,然后添加到队列。

// generate tempfile name
$temp_file = tempnam(sys_get_temp_dir(), 'inv');

// this pdf is generated by renatio plugin but you can 
// use your data and save it to disk
PDF::loadTemplate('renatio::invoice')
    ->save($temp_file);

Mail::queue('mail.template', null, function($message) use ($name, $email, $temp_file) {
    $message->to($email, $name);
    $message->subject('Thank you for your order!');
    $message->attach($temp_file, ['as' => 'Your_Invoice.pdf', 'mime' => 'application/pdf']);
});

它应该有用。

@Joseph指出,在Laravel 5.5中可以使用mailable@Joseph指出了这个解决方案,看起来很有效,所以如果laravel版本为>= 5.5,您也可以使用此解决方案 https://laracasts.com/discuss/channels/laravel/sending-email-with-a-pdf-attachment

谢谢@Joseph