Метод attachData
Метод attachData применяется к экземпляру класса Mailable
и позволяет прикрепить к письму любые бинарные данные в виде вложения.
Первым параметром передаются сами данные, вторым - имя файла,
третьим (опциональным) - массив параметров вложения.
Этот метод удобен, когда нужно отправить файл, сгенерированный
динамически, без сохранения на диск.
Синтаксис
<?php
$this->attachData($data, $filename, $options);
?>
Пример
Давайте создадим простой mailable класс и прикрепим к нему текстовые данные как вложение:
<?php
namespace AppMail;
use IlluminateBusQueueable;
use IlluminateMailMailable;
use IlluminateMailMailablesContent;
use IlluminateMailMailablesEnvelope;
use IlluminateQueueSerializesModels;
class OrderConfirmation extends Mailable
{
use Queueable, SerializesModels;
public function envelope(): Envelope
{
return new Envelope(
subject: 'Order Confirmation',
);
}
public function content(): Content
{
return new Content(
view: 'emails.order_confirmation',
);
}
public function attachments(): array
{
return [
$this->attachData(
'Invoice #12345: Order total $150.50',
'invoice.txt',
[
'mime' => 'text/plain',
]
),
];
}
}
?>
Затем отправим письмо с помощью фасада Mail:
<?php
namespace AppHttpControllers;
use AppMailOrderConfirmation;
use IlluminateSupportFacadesMail;
class OrderController extends Controller
{
public function sendConfirmation()
{
$email = 'user@example.com';
Mail::to($email)->send(new OrderConfirmation());
echo "Email sent successfully";
}
}
?>
Результат выполнения кода:
"Email sent successfully"
Пример
Давайте прикрепим к письму данные в формате JSON:
<?php
namespace AppMail;
use IlluminateBusQueueable;
use IlluminateMailMailable;
use IlluminateMailMailablesContent;
use IlluminateMailMailablesEnvelope;
use IlluminateQueueSerializesModels;
class UserReport extends Mailable
{
use Queueable, SerializesModels;
protected $users;
public function __construct($users)
{
$this->users = $users;
}
public function envelope(): Envelope
{
return new Envelope(
subject: 'User Report',
);
}
public function content(): Content
{
return new Content(
view: 'emails.user_report',
);
}
public function attachments(): array
{
$jsonData = json_encode($this->users, JSON_PRETTY_PRINT);
return [
$this->attachData(
$jsonData,
'users_report.json',
[
'mime' => 'application/json',
]
),
];
}
}
?>
Далее в контроллере создадим массив пользователей и отправим отчет:
<?php
namespace AppHttpControllers;
use AppMailUserReport;
use IlluminateSupportFacadesMail;
class UserController extends Controller
{
public function sendReport()
{
$users = [
['id' => 1, 'name' => 'John', 'email' => 'john@example.com'],
['id' => 2, 'name' => 'Jane', 'email' => 'jane@example.com'],
['id' => 3, 'name' => 'Bob', 'email' => 'bob@example.com'],
];
$email = 'admin@example.com';
Mail::to($email)->send(new UserReport($users));
echo "Report sent successfully";
}
}
?>
Результат выполнения кода:
"Report sent successfully"
Пример
Давайте создадим PDF-документ динамически с помощью библиотеки и прикрепим его к письму:
<?php
namespace AppMail;
use IlluminateBusQueueable;
use IlluminateMailMailable;
use IlluminateMailMailablesContent;
use IlluminateMailMailablesEnvelope;
use IlluminateQueueSerializesModels;
class ReceiptMail extends Mailable
{
use Queueable, SerializesModels;
public function envelope(): Envelope
{
return new Envelope(
subject: 'Your Receipt',
);
}
public function content(): Content
{
return new Content(
view: 'emails.receipt',
);
}
public function attachments(): array
{
$pdfData = $this->generatePdfContent();
return [
$this->attachData(
$pdfData,
'receipt.pdf',
[
'mime' => 'application/pdf',
]
),
];
}
private function generatePdfContent()
{
$content = '%PDF-1.4
1 0 obj
<< /Type /Catalog /Pages 2 0 R >>
endobj
2 0 obj
<< /Type /Pages /Kids [3 0 R] /Count 1 >>
endobj
3 0 obj
<< /Type /Page /Parent 2 0 R
/MediaBox [0 0 612 792]
/Contents 4 0 R >>
endobj
4 0 obj
<< /Length 44 >>
stream
BT /F1 12 Tf 50 700 Td (Receipt #54321) Tj ET
endstream
endobj
xref
0 5
0000000000 65535 f
0000000009 00000 n
0000000056 00000 n
0000000111 00000 n
0000000200 00000 n
trailer << /Size 5 /Root 1 0 R >>
startxref
286
%%EOF';
return $content;
}
}
?>
Отправим письмо с прикрепленным PDF:
<?php
namespace AppHttpControllers;
use AppMailReceiptMail;
use IlluminateSupportFacadesMail;
class ReceiptController extends Controller
{
public function sendReceipt()
{
$email = 'customer@example.com';
Mail::to($email)->send(new ReceiptMail());
echo "Receipt sent with PDF attachment";
}
}
?>
Результат выполнения кода:
"Receipt sent with PDF attachment"
Смотрите также
-
класс
Mailable,
базовый класс для всех почтовых уведомлений -
метод
attach,
который прикрепляет файл из файловой системы -
метод
attachFromStorage,
который прикрепляет файл из хранилища -
класс
Mail,
фасад для отправки электронной почты