Objectif: J'ai besoin d'envoyer un e-mail avec une pièce jointe pdf en Drupal 8.
Je peux envoyer un e-mail avec l'objet et le message, mais je n'ai jamais pu obtenir la pièce jointe. Lorsque j'active la logique pour joindre le fichier à l'e-mail, l'e-mail n'est jamais envoyé mais le service de messagerie renvoie True comme si l'e-mail avait été envoyé de toute façon. Il n'y a aucune erreur et les journaux ne disent rien.
J'ai installé les modules suivants:
$message['params']['files'][] = $params['attachments']
au lieu de $message['params']['attachments'][] = $params['attachments']
comme certains exemples l'ont recommandé$file->uri
à $file->filepath
J'ai essayé de joindre le fichier comme suit:
$params['attachments']['filecontent'] = $this->generatePDF($foa_list);
$params['attachments']['filename'] = 'MyFormsOfAssistance.pdf';
$params['attachments']['filemime'] = 'application/pdf';
J'ai essayé de joindre le fichier par le chemin seul avec un tableau:
$attachment = array(
'filepath'=>'sites/default/files/MyFormsOfAssistance.pdf',
);
$params['attachments'] = $attachment;
J'ai essayé de joindre le fichier d'une manière différente:
$attachment = array(
'filepath' => 'sites/default/files/MyFormsOfAssistance.pdf',
'filename' => 'MyFormsOfAssistance.pdf',
'filemime' => 'application/pdf'
);
$params['attachments'][] = $attachment;
Voici le code de mon contrôleur de messagerie:
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;
}
Voici le code hook_mail () dans mon fichier de module Email:
// 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;
}
}
La documentation Drupal 8 n'est pas vraiment utile et j'aimerais pouvoir le comprendre sans installer SwiftMailer, comme certaines sources l'ont recommandé. Je ne sais vraiment pas pourquoi cela ne fonctionne pas car il a travaillé pour les autres. Qu'est-ce qui me manque?
ENFIN! 4 semaines plus tard ...
Le code suivant a donc fini par fonctionner pour moi:
$attachment = array(
'filepath' => 'sites/default/files/MyFormsOfAssistance.pdf',
'filename' => 'MyFormsOfAssistance.pdf',
'filemime' => 'application/pdf'
);
MAIS, la la clé était que dans la configuration de MailSystem, je devais définir le formateur et l'expéditeur sur "SMTP Mailer". La configuration de MimeMail a automatiquement extrait ses valeurs de la configuration de mon SMTP.
$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;
"fichiers" doit être un tableau, c'est là que j'ai eu le plus de difficultés. Code complet ici: Envoyer un e-mail avec une pièce jointe gérée dans drupal 8