[Linux]メールを受信したらPHPで自動返信メールを送信する

こんにちは。
BIG1等を当てたいサラリーマンです。

aliases(エイリアス)を使ってメール受信をトリガーにPHPを実行する方法を記事にします。
メールの解析に便利な、PEAR/Mail_MimeDecodeも併せて紹介します。

php-mime-mail-parserを使う方法も別エントリーで記事にしたいと思います。
パッケージ管理ツールのComposerインストール手順などもまとめたいと思います。

こちらのエントリーで構築したローカル開発環境に設定します。

[ローカル開発環境 #06]メールの送受信を可能にしよう
ローカル開発環境の構築:もくじ ローカルサーバーを導入しよう ローカルサーバーの設定をしよう Web開発環境を構築しよう Web...

もくじ

  • aliases(エイリアス)とは
  • main.cfの編集
  • aliasesの編集
  • PEARとは
  • PEARパッケージマネージャーをインストール
  • PEAR/Mail_MimeDecodeインストール
  • PHPプログラム設置
  • 送信テスト
  • 参考ページ

aliases(エイリアス)とは

Sendmail用の設定ファイルですが、互換のあるPostfixでも利用できます。
メールの転送先を設定できます。この機能を応用してPHPを実行します。

main.cfの編集

viで開いて編集します。

sudo vi /etc/postfix/main.cf

以下をコメントインします。

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

Postfixを再起動して設定を反映させます。

sudo service postfix restart

viで開いて編集します。

aliasesの編集

sudo vi /etc/aliases

最終行に追加します。

vagrant: vagrant, "|/usr/bin/php /var/www/html/example.com/execmail.php"

vagrant宛に配送されたら、execmail.php(パイプでphpパスを渡す)を実行します。
メールは転送されるので残りません。残すために「vagrant,」も設定しています。

設定を反映させます。

sudo newaliases

PEARとは

PEAR(ペア) は、PHP Extension and Application Repositoryです。
PHPのライブラリ群と思えば良いでしょう。

今回は、PEARのMail_MimeDecodeライブラリをメールの自動返信プログラムに組み込みます。

PEARパッケージマネージャーをインストール

PEARを利用するためにパッケージマネージャーをインストールします。

sudo yum install -y php-pear

PEAR/Mail_MimeDecodeインストール

インストール

sudo pear install Mail_Mime
sudo pear install Mail_mimeDecode

PHPプログラム設置

以下のソースを、/var/www/html/example.com/execmail.phpに配置します。
ソースの中身は受信したメールから送信元アドレス、件名、本文を取得し、UTF-8にエンコードを行い、logファイルに書き出す処理をします。

<?php
require_once ('Mail/mimeDecode.php');

$params['include_bodies'] = true;
$params['decode_bodies']  = true;
$params['decode_headers'] = true;
$params['input'] = file_get_contents('php://stdin');
// $params['crlf'] = "\r\n";
$structure = Mail_mimeDecode::decode($params);

$from = $structure->headers['from'];
// $to = $structure->headers['to'];
$subject = $structure->headers['subject'];

// エスケープ処理
// $from = addslashes($mail);
// $from = str_replace('"','',$mail);

// 署名付きの場合の処理を追加
preg_match("/<.*>/", $from, $str);
if ($str[0]!= "" ) {
    $str = substr($str[0], 1, strlen($str[0]) -2);
    $from = $str;
}

switch (strtolower($structure->ctype_primary)) {
    case 'text': 
        $body = $structure->body;
        $contenttype = CONT_TEXT;
        break;
    case 'multipart':
        foreach ($structure->parts as $part) {
            switch (strtolower($part->ctype_primary)) {
                case 'text': $body = $part->body;
                    $contenttype = CONT_MULTI;
                    break;
                case 'image':
                    // 画像を取得する処理が必要な場合
                    $ext = strtolower($part->ctype_secondary);
                    // if ($ext == 'jpeg' || $ext == 'jpg' || $ext == 'gif' || $ext == 'png') {
                    //  $fp = fopen('/var/www/html/images/'. time(). $ext, 'W');
                    //  $length = strlen($part->body);
                    //  fwrite($fp, $part->body, $length);
                    //  fclose($fp);
                    // }
                    break;
            }
        }
        break;
    default: $body = '';
}

// Convert Encoding UTF-8
$subject = mb_convert_encoding($subject, 'UTF-8', 'auto');
$body = mb_convert_encoding($body, 'UTF-8', 'auto');

// Write Text
$log = "From : {$from}\nSubject : {$subject}\nBody : {$body}\n";
$fp = fopen('/var/www/html/example.com/mailphp.log', 'a');
fwrite($fp, $log);
fclose($fp);

送信テスト

適当にメールを作って送信します。

SS 2015-08-28 5.12.24

正常に送受信できています。

SS 2015-08-28 5.14.00

処理されてファイルに書きだされたのが分かります。

参考ページ

システム設定ファイルを知ろう〜/etc/aliases〜

PEAR入門

PHPプロ!TIPS+

スポンサーリンク
レクタングル(大)
レクタングル(大)

コメントをどうぞ

メールアドレスが公開されることはありません。

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>