web-dev-qa-db-fra.com

Comment ajouter une pièce jointe pdf à un e-mail dans Drupal 8?

Objectif: J'ai besoin d'envoyer un e-mail avec une pièce jointe pdf en Drupal 8.

Le progrès

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:

  • SMTP
  • MailSystem
  • MimeMail

Ce que j'ai essayé

  • Essayé avec $message['params']['files'][] = $params['attachments'] au lieu de $message['params']['attachments'][] = $params['attachments'] comme certains exemples l'ont recommandé
  • Changement essayé $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;
    

Installer

  1. Il existe une page de destination d'e-mail dans laquelle un utilisateur entre l'adresse e-mail du destinataire, l'objet de l'e-mail et le message de l'e-mail.
  2. Lorsque l'utilisateur clique sur le bouton Envoyer, ces données sont acheminées vers mon contrôleur de messagerie
  3. Le contrôleur de messagerie crée le fichier pdf, tente de joindre le pdf à l'e-mail, puis envoie l'e-mail.
  4. J'ai la fonction hook_mail () définie dans mon fichier de module.

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?

4
Cadre

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.

1
Cadre
$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

0
Stef Van Looveren