方針はシンプルで、標準入力に与えられたメールをパースするcommandを作成しておき、メールが着信するたびにそのcommandを呼び出すようにPostfixを設定する。Postfixの設定に関しては前回記事を参照。
メールのパースにはphp-mine-mail-parserを使う。内部でmailparseを呼んでいるようなので、mailparseを予めインストールしておくこと。mailparseのインストールに関しては過去記事を参照。
1 |
$ composer require php-mime-mail-parser/php-mime-mail-parser |
以下、Laravelのcommand実装サンプル。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<?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