在 Laravel 中使用 DOMPDF 将 PDF 文件附加到电子邮件
Attach PDF file to email with DOMPDF in Laravel
我正在使用我的 MyEmail 模型将 PDF 文件附加到它。邮件中包含我想要的所有数据并附有 PDF,但它是空的,如果我附上附件,如何将我的布局和数据导入 PDF?
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Course;
use Barryvdh\DomPDF\PDF;
class MyEmail extends Mailable {
use Queueable, SerializesModels;
public $data;
public $course;
private $pdf;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($data, Course $course) {
$this->course = $course;
$this->data = $data;
}
/**
* Build the message.
*
* @return $this
*/
public function build() {
return $this->subject('Thanks')->view('emails.my_email')->attachData($this->pdf, 'my_pdf.pdf')->with(['data' => $this->data, 'course' => $this->course]);
}
}
这是向我的控制器发送电子邮件的函数:
public function sendMail(Request $request) {
$data = array(
'first_name' => $request->first_name,
'last_name' => $request->last_name,
'id' => $request->id,
'course_id' => $request->course_id,
);
$resultJson = $this->validateRecaptcha($request);
$course= Course::where('id', $data['course_id'])->first();
if($resultJson->success != true) :
return redirect()->back()->with(['success' => 'success']);
else :
\Mail::to($request->email)
->cc('my@*******')
->queue(
new Mail\MyEmail($data, $course)
);
return redirect()->back()->with(['success' => 'Success!']);
endif;
}
PDF 还需要一个视图,如下所示:
// creating the pfd:
$pdf = PDF::loadView('pdf.multiple_pages', [
'pages' => $this->pages,
'title' => $this->options->get('documentName'),
]);
视图看起来像这样:
<?php
$imgPath = public_path('store/assets/images/new_logo.png');
$img = base64_encode(file_get_contents($imgPath));
?>
<html lang="{{ app()->getLocale() }}">
<head>
<title>{{ $title ?? 'document' }}</title>
</head>
<body>
<style>
@php
include(public_path('/css/pdf/multiple_pages.css'))
@endphp
div.page {
background-image: url("data:image/png;base64, {{ $img }}");
}
</style>
@foreach($pages as $page)
<div class="page">
{!! html_entity_decode($page) !!}
</div>
@endforeach
</body>
</html>
所以我建议先创建 PDF,然后再将其附加到电子邮件中
请记住,这是针对我们自己的用例的,您需要对其进行修改。
如果您正在使用 barryvdh/laravel-dompdf package, you can simply use loadView() 函数,它会获取您的 .blade
文件和您想要的数据。在 blade 中,您将生成 PDF 布局并注入您的变量。简单的例子是这样的:
$name = 'John';
$pdf = PDF::loadView('your_view', $name);
您现在可以在 pdf 中使用这个 $name
变量。blade 文件:
<h1>Hi {{name}}</h1>
生成具有所需布局和数据的 pdf 后,您可以将其附加到邮件 class,如下所示:
->attachData($pdf->output(), 'your_file_name');
我正在使用我的 MyEmail 模型将 PDF 文件附加到它。邮件中包含我想要的所有数据并附有 PDF,但它是空的,如果我附上附件,如何将我的布局和数据导入 PDF?
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Course;
use Barryvdh\DomPDF\PDF;
class MyEmail extends Mailable {
use Queueable, SerializesModels;
public $data;
public $course;
private $pdf;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($data, Course $course) {
$this->course = $course;
$this->data = $data;
}
/**
* Build the message.
*
* @return $this
*/
public function build() {
return $this->subject('Thanks')->view('emails.my_email')->attachData($this->pdf, 'my_pdf.pdf')->with(['data' => $this->data, 'course' => $this->course]);
}
}
这是向我的控制器发送电子邮件的函数:
public function sendMail(Request $request) {
$data = array(
'first_name' => $request->first_name,
'last_name' => $request->last_name,
'id' => $request->id,
'course_id' => $request->course_id,
);
$resultJson = $this->validateRecaptcha($request);
$course= Course::where('id', $data['course_id'])->first();
if($resultJson->success != true) :
return redirect()->back()->with(['success' => 'success']);
else :
\Mail::to($request->email)
->cc('my@*******')
->queue(
new Mail\MyEmail($data, $course)
);
return redirect()->back()->with(['success' => 'Success!']);
endif;
}
PDF 还需要一个视图,如下所示:
// creating the pfd:
$pdf = PDF::loadView('pdf.multiple_pages', [
'pages' => $this->pages,
'title' => $this->options->get('documentName'),
]);
视图看起来像这样:
<?php
$imgPath = public_path('store/assets/images/new_logo.png');
$img = base64_encode(file_get_contents($imgPath));
?>
<html lang="{{ app()->getLocale() }}">
<head>
<title>{{ $title ?? 'document' }}</title>
</head>
<body>
<style>
@php
include(public_path('/css/pdf/multiple_pages.css'))
@endphp
div.page {
background-image: url("data:image/png;base64, {{ $img }}");
}
</style>
@foreach($pages as $page)
<div class="page">
{!! html_entity_decode($page) !!}
</div>
@endforeach
</body>
</html>
所以我建议先创建 PDF,然后再将其附加到电子邮件中
请记住,这是针对我们自己的用例的,您需要对其进行修改。
如果您正在使用 barryvdh/laravel-dompdf package, you can simply use loadView() 函数,它会获取您的 .blade
文件和您想要的数据。在 blade 中,您将生成 PDF 布局并注入您的变量。简单的例子是这样的:
$name = 'John';
$pdf = PDF::loadView('your_view', $name);
您现在可以在 pdf 中使用这个 $name
变量。blade 文件:
<h1>Hi {{name}}</h1>
生成具有所需布局和数据的 pdf 后,您可以将其附加到邮件 class,如下所示:
->attachData($pdf->output(), 'your_file_name');