Получение имени и содержимого вложений для отправленного электронного сообщения

#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(),
    ];
}