我正在尝试发送一封附有 pdf 文件的电子邮件。 我检查过,文件确实存在于路径中。我也可以打开它。 我测试了我是否可以使用存储门面的下载功能下载文件并且也有效。
然而,当我在排队的电子邮件中尝试时,每次等待大约 20 秒后都会失败。 这是我得到的错误:
ValueError: fopen(): Argument #1 ($filename) must not contain any null bytes in C:\Users\Gebruiker\PhpstormProjects\FuegoWebsite\vendor\swiftmailer\swiftmailer\lib\classes\Swift\ByteStream\FileByteStream.php:129
Stack trace:
我的电子邮件代码是:
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Storage;
class PdfTestMail extends Mailable
{
use Queueable, SerializesModels;
public $orderId;
public $text;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($orderid, $text)
{
$this->orderId = $orderid;
$this->text = $text;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
$file = Storage::disk('private')->get("factuur_order_".$this->orderId.'.pdf');
return $this->text('emails.notifyAdmin')
->subject('Orderbevestiging #'.$this->orderId)
->attach($file, [
'as' => 'factuur.pdf',
'mime' => 'application/pdf'
]);
}
}
我尝试以多种方式附加 pdf,包括我用来生成 pdf 的 barryvdh/dompdf 包的直接输出。 什么都没用,我不知道为什么。
attach
方法需要附加文件的文件名,而不是数据。您可能正在寻找attachData
方法:
public function attachData($data, $name, array $options = [])
切换到
attachData
:
->attachData($file, 'factuur.pdf', ['mime' => 'application/pdf'])
Laravel 8.x 文档 - 邮件 - 附件 - 原始数据附件
attachData
如果有人在 Laravel 10.x 中使用 Envelope 遇到同样的错误,请参考: https://laravel.com/docs/10.x/mail#attachments
你应该使用:
public function attachments(): array
{
return [
Attachment::fromData(fn () => $this->pdf, 'Report.pdf')
->withMime('application/pdf'),
];
}