Как добавить вложение 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;
Настройка
- Существует целевая страница электронной почты, на которой пользователь вводит адрес электронной почты получателя, тему письма и сообщение для электронной почты.
- Когда пользователь нажимает кнопку "Отправить", эти данные направляются на мой контроллер электронной почты
- Контроллер электронной почты создает pdf-файл, пытается прикрепить pdf-файл к электронному письму, а затем отправляет электронное письмо.
- У меня есть функция 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, как рекомендовали некоторые источники. Действительно не уверен, почему это не работает так, как работало для других. Что я упускаю?
3 answers
НАКОНЕЦ-ТО! 4 недели спустя...
Таким образом, следующий код в конечном итоге сработал для меня:
$attachment = array(
'filepath' => 'sites/default/files/MyFormsOfAssistance.pdf',
'filename' => 'MyFormsOfAssistance.pdf',
'filemime' => 'application/pdf'
);
НО ключ заключался в том, что в конфигурации почтовой системы мне пришлось установить Форматировщик и Отправителя на "Почтовую программу SMTP". Конфигурация MimeMail автоматически извлекла ее значения из конфигурации моего SMTP.
Попробуйте модуль Помощник по вложениям электронной почты .
Это модуль для разработчиков, которые хотят программно прикреплять файлы к электронным письмам, отправляемым с 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'];
$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