Как добавить вложение PDF в электронное письмо?


Цель: Мне нужно отправить электронное письмо с вложением pdf в Drupal 8.

Прогресс

Я могу отправить электронное письмо с темой и сообщением, но никогда не мог получить вложение. Когда я включаю логику прикрепления файла к электронному письму, электронное письмо никогда не отправляется, но почтовая служба возвращает значение True, как если бы электронное письмо было отправлено в любом случае. Ошибок нет, и в журналах ничего не говорится.

У меня есть следующие модули установлено:

  • SMTP
  • Почтовая система
  • Имитационная почта

Что я пробовал

  • Попытался использовать $message['params']['files'][] = $params['attachments'] вместо $message['params']['attachments'][] = $params['attachments'], как рекомендовали некоторые примеры
  • Попытался изменить $file->uri на $file->filepath
  • Попытался прикрепить файл следующим образом:

    $params['attachments']['filecontent'] = $this->generatePDF($foa_list);
    $params['attachments']['filename'] = 'MyFormsOfAssistance.pdf';
    $params['attachments']['filemime'] = 'application/pdf';
    
  • Попытался прикрепить файл только по пути с массивом:

    $attachment = array(
        'filepath'=>'sites/default/files/MyFormsOfAssistance.pdf',
    );
    
    $params['attachments'] = $attachment;
    
  • Попытался прикрепить файл другим способом способ:

    $attachment = array(
        'filepath' => 'sites/default/files/MyFormsOfAssistance.pdf',
        'filename' => 'MyFormsOfAssistance.pdf',
        'filemime' => 'application/pdf'
    );
    
    $params['attachments'][] = $attachment;
    

Настройка

  1. Существует целевая страница электронной почты, на которой пользователь вводит адрес электронной почты получателя, тему письма и сообщение для электронной почты.
  2. Когда пользователь нажимает кнопку "Отправить", эти данные направляются на мой контроллер электронной почты
  3. Контроллер электронной почты создает pdf-файл, пытается прикрепить pdf-файл к электронному письму, а затем отправляет электронное письмо.
  4. У меня есть функция hook_mail(), определенная в моем файле модуля.

Здесь это код для моего контроллера электронной почты:

public function submit_email($foa_list = null) {
    $lang = "en";
    $email_to = "[email protected]";
    $params['subject'] = "Test subject";
    $params['body'] = "Test body";

    // -------------------- Attachment Logic -----------------------
    // Create pdf file and store file
    file_put_contents('sites/default/files/MyFormsOfAssistance.pdf', $this->generatePDF($foa_list));


    // Attach pdf file to email params
    $file = new \stdClass();
    $file->uri = 'sites/default/files/MyFormsOfAssistance.pdf';
    $file->filename = 'MyFormsOfAssistance.pdf';
    $file->filemime = 'application/pdf';
    $params['attachments'][] = $file;

    // Send email
    \Drupal::service('plugin.manager.mail')->mail('email', 'email', $email_to, $lang, $params);

    $response = new Response();
    $response->setContent("true");

    return $response;
}

Вот код hook_mail() в моем файле модуля электронной почты:

// Note that print_and_email is what my module is called.
function print_and_email_mail($key, &$message, $params) {
    switch($key) {
        case 'email':
            $message['subject'] = $params['subject'];
            $message['body'][] = $params['body'];
            $message['headers'] = [
              'MIME-Version' => '1.0',
              'Content-Type' => 'text/html; charset=UTF-8; format=flowed; delsp=yes',
              'Content-Transfer-Encoding' => '8Bit',
              'X-Mailer' => 'Drupal',
            ];
            // $message['params']['files'][] = $params['attachments']; // Note: I have seen other examples implement attachments this way
            $message['params']['attachments'][] = $params['attachments'];
            break;
    } 
}

Документация по Drupal 8 на самом деле не очень полезна, и я хотел бы разобраться в этом без установки SwiftMailer, как рекомендовали некоторые источники. Действительно не уверен, почему это не работает так, как работало для других. Что я упускаю?

 7
Author: leymannx, 2018-01-02

3 answers

НАКОНЕЦ-ТО! 4 недели спустя...

Таким образом, следующий код в конечном итоге сработал для меня:

    $attachment = array(
        'filepath' => 'sites/default/files/MyFormsOfAssistance.pdf',
        'filename' => 'MyFormsOfAssistance.pdf',
        'filemime' => 'application/pdf'
    );

НО ключ заключался в том, что в конфигурации почтовой системы мне пришлось установить Форматировщик и Отправителя на "Почтовую программу SMTP". Конфигурация MimeMail автоматически извлекла ее значения из конфигурации моего SMTP.

 2
Author: Cadre, 2018-01-03 20:21:22

Попробуйте модуль Помощник по вложениям электронной почты .

Это модуль для разработчиков, которые хотят программно прикреплять файлы к электронным письмам, отправляемым с Drupal 8. Этот модуль не отправляет электронные письма, а скорее перехватывает электронные письма от других модулей.

Если в массиве $params присутствует ключ "вложение" или "вложения" , он будет преобразован в фактическое вложение MIME. В противном случае этот модуль не будет касаться почты.

Этот модуль не имеет конфигурации опции.

$params['context']['attachments'] = [
  'filecontent' => file_get_contents('sites/default/files/sample.pdf'),
  'filename' => 'Invoice.pdf',
  'filemime' => 'application/pdf',     
];

Hook_mail()

$context = $params['context'];
$message['params']['attachments'][] = $context['attachments'];
 1
Author: Jyothi, 2020-08-17 12:22:09
$invoice_pdf = File::load($fid); // the file id
$invoice_file = (object) [
  'filename' => 'invoice.pdf',
  'uri' => $invoice_pdf->getFileUri(),
  'filemime' => $invoice_pdf->getMimeType(),
];
$message['params']['files'][] = $invoice_file;

"файлы" должны быть массивом, с которым у меня было больше всего трудностей. Полный код здесь: Отправьте электронное письмо с вложением управляемого файла в drupal 8

 -1
Author: Stef Van Looveren, 2020-01-10 08:31:55