Laravel7でPDFを生成してファイルを添付してメールで送信する。

Laravel7でPDFを生成してファイル添付してメール送信する処理を作ることになったので、

流れをメモっときます。ローカル環境でやってます。

まずは、dompdfを追加

hoge@mac %composer require barryvdh/laravel-dompdf

dompdfでPDF生成するとサイズが大きくなっちゃうので、小さくする設定追加。

enable_font_subsettingをtrueにする。

hoge@mac %php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"
hoge@mac %vi config/dompdf.php

 74         "chroot" => realpath(base_path()),
 75 
 76         /**
 77          * Whether to enable font subsetting or not.
 78          */
 79         "enable_font_subsetting" => false,
 ↓
 79         "enable_font_subsetting" => true, // trueに変更
 80 
 81         /**
 82          * The PDF rendering backend to use

次に送信するためのメール設定追加

hoge@mac %php artisan make:mail CommonMail

hoge@mac %vi app/Mail/CommonMail.php

class CommonMail extends Mailable
{
    use Queueable, SerializesModels;

    private $params = array();

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($params)
    {
        //パラメータ設定
        $this->params = $params;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from($this->params['from'])
            ->subject($this->params['subject'])
            ->view($this->params['view'])
            //->text($this->params['text'])
            ->with($this->params['data'])
            ->attach($this->params['file']);
    }
}

app/Mail/配下にファイルを生成して、ファイル内部を上記のように修正。

今回はテキスト送信しないのでコメントアウトしてますが、text使いたい場合はコメント外してください。

/**
 * PDF送信ページ
 */
function send() {

    // viewに値を渡す場合、配列に設定
    $viewData = [];

    // PDFを生成(ファイル名はuniqid)
    $fileName = uniqid() . ".pdf";
    $pdf = \PDF::loadView('hoge.send', // PDF用のviewの設定
    compact('payslip')
    )->setPaper('a4', 'landscape'); // A4横向きの設定

    // ファイルをstorage配下に一時保存
    \File::append(storage_path('app/tmp/' . $fileName), $pdf->output());

    // 先ほど作ったCommonMailを使ってメール送信
    $params = array();
    $params['from'] = 'test@test.com';
    $params['subject'] = 'テストメール送信';
    $params['view'] = 'payslip.mail';
    $params['data'] = '';
    $params['file'] = storage_path('app/tmp/' . $fileName);

    Mail::to('send@ggmail.com')->send(new CommonMail($params));
}

ローカルテストする際、メール送信ができないためmailtripを使用

歯車マークの設定をクリックすると、設定方法が出てきます。今回はLaravelなのでここを確認。

2枚目の設定内容を.envに設定したら完了。

コメント

タイトルとURLをコピーしました