Laravel/Sail/PHPでオンラインFAXのメール受信をフックにアクションを実行する

必要なもの

  • PHPのmailparseエクステンション
  • PHPのパーサーライブラリ : php-mime-mail-parser

手順

  1. LaravelSailに“PHPのmailparseエクステンション”をインストール
  2. ライブラリをsail経由でインストール
  3. FAXのEメールを受信処理する

1.LaravelSailに“PHPのmailparseエクステンション”をインストール

1–1 sailの設定ファイルを書き出し(publish)

$ ./vendor/bin/sail artisan sail:publish
→/docker/以下にsailのdocker設定ファイルが生成される

1–2 sailのDockerfileにエクステンションを追記

/docker/(任意の利用しているバージョン)/Dockerfile
のphpをインストールしているブロックの最後の行に php8.4-mailparse \ を追記
(※利用しているphpのバージョンは /docker-compose.yml に記載があるので参照)

    && apt-get install -y php8.4-cli php8.4-dev \
       php8.4-pgsql php8.4-sqlite3 php8.4-gd \
       php8.4-curl php8.4-mongodb \
       php8.4-imap php8.4-mysql php8.4-mbstring \
       php8.4-xml php8.4-zip php8.4-bcmath php8.4-soap \
       php8.4-intl php8.4-readline \
       php8.4-ldap \
       php8.4-msgpack php8.4-igbinary php8.4-redis php8.4-swoole \
       php8.4-memcached php8.4-pcov php8.4-imagick php8.4-xdebug \
       php8.4-mailparse \

1–2 sailのDockerを再ビルド

$ ./vendor/bin/sail build --no-cache

→少し時間がかかりますが、インストールを完了、sailを再起動するとphpinfoなどで「mailparse」が追加されていることを確認します。

2.ライブラリをsail経由でインストール

2–1.インストール

$ ./vendor/bin/sail composer require php-mime-mail-parser/php-mime-mail-parser

ライブラリの細かい使い方は以下より
https://github.com/php-mime-mail-parser/php-mime-mail-parser

3.FAXのEメールを受信処理する

3–1.受信〜画像の処理

//パーサーをuse
use PhpMimeMailParser\Parser;
//パーサーを生成、ソースの読込
$parser = new Parser();
$parser->setPath($path); //emlファイルを読込の場合
$parser->setStream(fopen('php://stdin', 'r')); //標準入力より
//添付ファイルを取得
$attachments = $this->parser->getAttachments();
$attachment = $attachments[0]; //今回は1ファイルのみしか来ないので1つのみを取得 
//tiffファイルを保存
$tmpPath = $attachment->save(保存したいパス指定, Parser::ATTACHMENT_DUPLICATE_SUFFIX);
//ImageMagickで取得
$images = new Imagick($tmpPath);
//faxのデータがtiff(複数ページ)で来るので画像ごとに処理
foreach ($images as $index => $image) {
    //フォーマット変更,画像処理,リサイズ,サムネ,DB紐づけ,その他何かしらの処理..
}
//画像クリア
$images->clear();
//元tiff要らなければ削除
unlink($tmpPath);