it-swarm.com.de

Wie füge ich einen PDF-Anhang zur E-Mail in Drupal 8?

Ziel: Ich muss eine E-Mail mit einem PDF-Anhang in Drupal 8) senden.

Fortschritt

Ich kann eine E-Mail mit Betreff und Nachricht senden, konnte den Anhang jedoch nie erhalten. Wenn ich die Logik zum Anhängen der Datei an die E-Mail einschalte, wird die E-Mail nie gesendet, aber der Mail-Dienst gibt True zurück, als ob die E-Mail trotzdem gesendet worden wäre. Es gibt keine Fehler und die Protokolle sagen nichts.

Ich habe folgende Module installiert:

  • SMTP
  • MailSystem
  • MimeMail

Was ich versucht habe

  • Versucht mit $message['params']['files'][] = $params['attachments'] Anstelle von $message['params']['attachments'][] = $params['attachments'], Wie einige Beispiele empfohlen haben
  • Es wurde versucht, $file->uri In $file->filepath Zu ändern.
  • Versucht, die Datei wie folgt anzuhängen:

    $params['attachments']['filecontent'] = $this->generatePDF($foa_list);
    $params['attachments']['filename'] = 'MyFormsOfAssistance.pdf';
    $params['attachments']['filemime'] = 'application/pdf';
    
  • Es wurde versucht, die Datei nur über einen Pfad mit einem Array anzuhängen:

    $attachment = array(
        'filepath'=>'sites/default/files/MyFormsOfAssistance.pdf',
    );
    
    $params['attachments'] = $attachment;
    
  • Versucht, die Datei auf andere Weise anzuhängen:

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

Installieren

  1. Es gibt eine E-Mail-Landingpage, auf der ein Benutzer die E-Mail-Adresse des Empfängers, den Betreff für die E-Mail und die Nachricht für die E-Mail eingibt.
  2. Wenn der Benutzer auf die Schaltfläche Senden klickt, werden diese Daten an meinen E-Mail-Controller weitergeleitet
  3. Der E-Mail-Controller erstellt die PDF-Datei, versucht, das PDF an die E-Mail anzuhängen, und sendet dann die E-Mail.
  4. Ich habe die Funktion hook_mail () in meiner Moduldatei definiert.

Hier ist der Code für meinen E-Mail-Controller:

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;
}

Hier ist der Code hook_mail () in meiner E-Mail-Moduldatei:

// 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;
    } 
}

Die Drupal 8-Dokumentation ist nicht wirklich hilfreich und ich möchte dies herausfinden können, ohne SwiftMailer zu installieren, wie einige Quellen empfohlen haben. Ich bin mir wirklich nicht sicher, warum dies nicht so funktioniert hat für andere gearbeitet. Was vermisse ich?

4
Cadre

ENDLICH! 4 Wochen später ...

Der folgende Code hat also für mich funktioniert:

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

ABER das Schlüssel war, dass ich in der MailSystem-Konfiguration den Formatierer und Absender auf "SMTP Mailer" setzen musste. Die Konfiguration von MimeMail hat die Werte automatisch aus der Konfiguration meines SMTP abgerufen.

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;

'files' muss ein Array sein, mit dem ich die größten Schwierigkeiten hatte. Vollständiger Code hier: E-Mail mit verwaltetem Dateianhang in drupal 8 senden

0