方針はシンプルで、標準入力に与えられたメールをパースする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