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

Queuing mail with attachData in Laravel 5.1 / OctoberCMS

以下在我使用Mail::send

时有效
$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 一起使用,所以看起来来自附件的原始数据导致队列出现问题,但相关的 October or Laravel 关于如何处理这个问题的文档。

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

hmm, alternative you can generate file and then just attach file path to mail and then add to queue.

// 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