Laravel 5.3 - прикрепить несколько файлов к почтовым сообщениям

Как можно прикрепить несколько файлов к почтовому сообщению laravel 5.3?

Я могу достаточно легко прикрепить один файл, используя ->attach($form->filePath) в моем методе сборки для отправки по почте. Однако как только я меняю поле формы на массив, я получаю следующую ошибку:

basename() expects parameter 1 to be string, array given

Я искал документы, а также различные поисковые запросы здесь, в стеке, но безрезультатно. Любая помощь будет принята с благодарностью.

Метод сборки:

public function build()
{
    return $this->subject('Employment Application')
                ->attach($this->employment['portfolio_samples'])
                ->view('emails.employment_mailview');
}

Почтовый звонок от контроллера:

Mail::to(config('mail.from.address'))->send(new Employment($employment));

person kash101    schedule 17.03.2017    source источник


Ответы (1)


Вы должны сохранить сгенерированное электронное письмо как переменную, а затем вы можете просто добавить несколько вложений, например:

public function build()
{
    $email = $this->view('emails.employment_mailview')->subject('Employment Application');

    // $attachments is an array with file paths of attachments
    foreach($attachments as $filePath){
        $email->attach($filePath);
    }
    return $email;
}

В этом случае ваша переменная $attachments должна быть массивом с путями к файлам:

$attachments = [
    // first attachment
    '/path/to/file1',

    // second attachment
    '/path/to/file2',
    ...
];


Также вы можете прикреплять файлы не только по путям к файлам, но и с типом MIME и желаемым именем файла, см. документацию о втором случае использования метода attachment: https://laravel.com/docs/master/mail#attachments

Например, ваш массив $attachments может быть примерно таким:

$attachments = [
    // first attachment
    'path/to/file1' => [
        'as' => 'file1.pdf',
        'mime' => 'application/pdf',
    ],

    // second attachment
    'path/to/file12' => [
        'as' => 'file2.pdf',
        'mime' => 'application/pdf',
    ],

    ...
];

После того, как вы можете прикрепить файлы из этого массива:

// $attachments is an array with file paths of attachments
foreach($attachments as $filePath => $fileParameters){
    $email->attach($filePath, $fileParameters);
}
person Alexander Reznikov    schedule 17.03.2017
comment
Это решение отлично работает в L5.8, но убедитесь, что вы используете другое имя вместо $attachments, поскольку внутренний класс Mailable уже имеет свойство с именем $attachments. Использование того же имени перезаписывает свойство и вызывает ошибки. - person Sven; 17.08.2019
comment
@Sven, спасибо за ваш комментарий. Однако вы ошибаетесь насчет имени переменной этого примера. Даже если у некоторого класса есть свойство $attachments, мы все равно можем создать переменную с тем же именем $attachments, потому что нестатические свойства могут быть через псевдопеременную $this, поэтому наша переменная не влияет на свойства этого гипотетического класса. Доступ к статическим свойствам любого класса можно получить с помощью ключевого слова static, так что опять же - наша переменная здесь не вызывает никаких проблем. - person Alexander Reznikov; 17.08.2019
comment
@AlexanderReznikov Я не уверен, в чем проблема, но могут быть побочные эффекты: stackoverflow.com/q/54262711/1815847 (исходный код) - person Sven; 17.08.2019
comment
В случае, если вы упомянули, что пользователь @Matt E. пытается создать собственное свойство класса $attachments, и оно перезаписывает свойство класса Laravel $attachment. Вы можете без проблем использовать переменные с одинаковыми именами, см. Пример: sandbox.onlinephpfunctions.com/code/code/code/ - person Alexander Reznikov; 17.08.2019
comment
@AlexanderReznikov Вы правы. Проблема только в $this->attachments. Спасибо за терпеливость. - person Sven; 17.08.2019
comment
Конечно, без проблем. - person Alexander Reznikov; 17.08.2019
comment
Нет необходимости хранить его в переменной email, поскольку вы работаете с объектом. В конце можно просто вернуть $this. - person César Escudero; 19.04.2020