#laravel #email #attachment #swiftmailer
#laravel #Адрес электронной почты #вложение #swiftmailer
Вопрос:
В Laravel я ищу способ получения вложений (если таковые имеются) для отправленного электронного письма, а затем сохранения этого вложения в файловой системе.
Я создал новый прослушиватель для IlluminateMailEventsMessageSent
события, и в настоящее время я извлекаю имя вложения, но я не знаю, как извлечь содержимое вложения для последующего хранения:
public function handle($event)
{
$subject = $event->message->getSubject();
$body = $event->message->getBody();
$recipient = array_keys($event->message->getTo())[0];
$attachments = [];
foreach ($event->message->getChildren() as $child) {
$attachments[] = [
'name' => str_replace('attachment; filename=', null, $child->getHeaders()->get('content-transfer-encoding')->getFieldBody()),
'contents' => '' // ?
];
}
}
Кто-нибудь знает, как это сделать?
Спасибо.
Ответ №1:
Вы должны фильтровать дочерние элементы сообщений по Swift_Attachment::class, и вы можете получить содержимое вложения с помощью getBody() . Возможно, вам придется дважды вызывать getBody() из-за проблемы с swiftmailer. Имя файла, тип содержимого и тело легко доступны из объекта вложения swift.
foreach (collect($event->message->getChildren())->whereInstanceOf(Swift_Attachment::class) as $attachment) {
$attachment->getBody(); // issue workaround
$attachments[] = [
'name' => $attachment->getFilename(),
'contentType' => $attachment->getContentType(),
'contents' => $attachment->getBody(),
];
}