【问题标题】:Laravel Queue Mail filesLaravel 队列邮件文件
【发布时间】:2018-03-20 15:52:16
【问题描述】:

我一直在尝试从直接发送电子邮件转变为将它们添加到 Laravel Queue,并且我注意到如果电子邮件包含任何文件,它真的不喜欢处理它。

例如,如果我要直接发送电子邮件,则此示例可以正常工作,但如果我想将其添加到 Queue 则不会,因为它不会序列化 $file 变量。

$this->mail->queue('emails.contact-us',compact('data'), function($message) use($files)
    {
        $message->from('email@mail.co.uk', 'Test Subject');
            foreach($files as $file){
                $message->attach($file->getRealPath(),array(
                        'as' => $file->getClientOriginalName(),
                        'mime' => $file->getMimeType()
                ));
            }
    });

如果我尝试getFileContents,将所有数据存储到一个变量并将变量传递给Queue,它将创建一个Job,但是它应该生成的不是Json有效负载数据,而是将0 添加到payload 列。

所以我的问题是,以前有人处理过这种情况吗?我曾考虑过临时添加文件,但这似乎不是一个好的解决方案。

【问题讨论】:

  • 小文件也会出现这种情况吗?
  • @SupunFictionPraneeth 这已经在 ~200kb 图像上进行了测试

标签: php laravel queue laravel-5.1


【解决方案1】:

您可以使用attachData,只需将文件数据和名称传递给它

$message->attachData($data, $name, array $options = []);

去看看这个以获得更深入的信息:https://laracasts.com/discuss/channels/laravel/sending-email-with-a-pdf-attachment

编辑:尝试使用 Base64 编码

$this->fileContents = base64_encode(File::get($this->file));
$this->attachData(base64_decode($this->fileContents), 'file.pdf');

【讨论】:

  • 我也是这么想的,但是这个方法让我提出第二个问题,作业表中的有效负载数据存储为0 而不是json 对象,所以当作业需要时执行,它不知道该怎么做。我也尝试将column nameLONGTEXT 更改为BINARY,但这也没有解决问题
  • 正如有人在我给你的链接中提到的那样:“序列化在获取二进制文件数据时失败,因为该数据包含无效的 UTF-8 字符。base64 编码数据确保文件仅包含有效序列化之前的字符”。
  • 此 base64_decode 文件在作业“__construct”中作为文件内容工作,但在“handle()”中不工作。在句柄()中,我得到了这个 base64_decode 文件作为字符串。如何在不保存任何位置的情况下获取队列作业中的文件。
猜你喜欢
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 2018-02-06
  • 2016-12-08
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
相关资源
最近更新 更多