web-dev-qa-db-ja.com

Drupal 8)で電子メールにPDF添付ファイルを追加する方法

目標:PDFが添付された電子メールをDrupal 8.で送信する必要があります。

進捗

件名とメッセージを記載したメールを送信できますが、添付ファイルを取得することができません。メールにファイルを添付するロジックをオンにすると、メールは送信されませんが、メールサービスはTrueを返します。エラーはなく、ログには何も記録されていません。

次のモジュールがインストールされています。

  • SMTP
  • MailSystem
  • MimeMail

私が試したこと

  • いくつかの例で推奨されているように、$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;
}

これが私のEメールモジュールファイルの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をインストールせずにこれを理解できるようにしたいのですが、一部のソースが推奨しています。これがうまく機能しない理由は本当にわかりません他の人のために働いています。

4
Cadre

最終的に! 4週間後...

したがって、次のコードは私にとってはうまくいきました:

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

しかし、重要なのは、MailSystem構成で、フォーマッタと送信者を "SMTP Mailer"に設定する必要があったことです。 MimeMailの設定は、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;

「ファイル」は配列でなければなりません。それが私が最も困難だったものです。ここに完全なコード: 管理されたファイルが添付された電子メールをdrupal 8 に送信します

0