端くれプログラマの備忘録 Laravel [Laravel] 受信メールを取り込む

[Laravel] 受信メールを取り込む

方針はシンプルで、標準入力に与えられたメールをパースするcommandを作成しておき、メールが着信するたびにそのcommandを呼び出すようにPostfixを設定する。Postfixの設定に関しては前回記事を参照

メールのパースにはphp-mine-mail-parserを使う。内部でmailparseを呼んでいるようなので、mailparseを予めインストールしておくこと。mailparseのインストールに関しては過去記事を参照

$ composer require php-mime-mail-parser/php-mime-mail-parser

以下、Laravelのcommand実装サンプル。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Mail;
use PhpMimeMailParser\Parser;
use Log;

class ReadMail extends Command
{
    protected $signature = 'readmail';
    protected $description = 'Command description';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $parser = new Parser();
        $parser->setStream(fopen('php://stdin', 'r'));

        $mail = new Mail();

        $vars = $parser->getAddresses('from');
        $mail->from_name = $vars[0]['display'];
        $mail->from_addr = $vars[0]['address'];

        $vars = $parser->getAddresses('to');
        $mail->to_name = $vars[0]['display'];
        $mail->to_addr = $vars[0]['address'];

        $mail->subject = $parser->getHeader('subject');
        $mail->text = $parser->getMessageBody('text');
        $mail->html = $parser->getMessageBody('html');
        $mail->html_embedded = $parser->getMessageBody('htmlEmbedded');
        $mail->headers = serialize($parser->getHeaders());

        $mail->save();

        /*
        $parser->saveAttachments('/path/to/save/attachments/');
        $attachments = $parser->getAttachments();
        if (count($attachments) > 0) {
            foreach ($attachments as $attachment) {
                $filename = $attachment->getFilename();
                $path = '/path/to/save/attachments/'. $attachment->getFilename();
                $type = $attachment->getContentType();
            }
        }
        */
    }
}

参考サイト

受信したメールをLaravelで受け取る | Sukohi’s tech blog!!
http://sukohi.blogspot.com/2016/06/laravel.html

Setting up Postfix and pipe incoming emails to Laravel
https://sboersma.nl/blog/setting-up-postfix-and-pipe-incoming-emails-to-laravel