こんにちは!イッシーです。最近はnode.jsにキュンキュンしてますʕ→ᴥ←ʔ キュンキュン!

最近、空メールの処理をする機会がありました。以前、やったことがあったんですがすっかり忘れてしまっていたのでちゃんとメモっておくことにします。特にキュンキュンするようなトピックスでもないので、サクっと片付けて皆でnodeにキュンキュンする時間を作りましょう!

では、本題に入りますが、メールサーバに何を使用しているかによって設定ファイルの場所と方法が若干違います。

■qmail

以下のコマンドを実行し設定ファイルを編集します。

vi /var/qmail/mailnames/[domain]/[mailaddress]/.qmail

以下のように記述されていると思います。

| true
| /usr/bin/deliverquota ./Maildir

以下のように記述する事でプログラム(スクリプト)に処理を渡すことができます。

| /usr/bin/php /var/www/vhosts/[domain]/subdomains/[sub]/register.php
| true
| /usr/bin/deliverquota ./Maildir

register.phpの内容については後述します。

■postfix

以下のコマンドを実行し設定ファイルを編集します。

vi /etc/aliases

以下の記述を最後尾に加えます。

user: "| /usr/bin/php /var/www/vhosts/[domain]/subdomains/[sub]/register.php"

以下のコマンドを実行し設定を反映させます。

postalias /etc/aliases

以上でメールサーバの設定が完了しました。register.phpでメールの処理をする準備が整いました。

■register.php

まず、以下のコマンドでログファイルを準備します。

touch /var/www/vhosts/[domain]/subdomains/[sub]/log.txt
chmod 0777 /var/www/vhosts/[domain]/subdomains/[sub]/log.txt

ブラウザでデバッグできないので、まず以下のようにログファイルにエラーを出力するように設定しましょう。

$file = '/var/www/vhosts/[domain]/subdomains/[sub]/log.txt';
$date = date('Y-m-d H:i:s');
file_put_contents($file, "\nreceived - {$date}", FILE_APPEND);

ini_set('log_errors', 'On');
ini_set('error_log', $file);

次にメールの文言を取得します。面倒なのでPEARを使いましょう。パスは環境に応じて置き換えてください。

require_once('/usr/share/PEAR/Mail/mimeDecode.php');

$source = file_get_contents("php://stdin");//標準入力からメールデータをゲットだぜ!
if(!$source){
    echo "fail!\n";
    exit();
}

// メールデータをパースする
$decoder   = new Mail_mimeDecode($source);
$structure = $decoder->decode(array(
    'include_bodies' => true,
    'decode_bodies'  => true,
    'decode_headers' => true,
));
$from = mb_convert_encoding(
    mb_decode_mimeheader(
        $structure->headers['from']
    ),
    'UTF-8'
);
if(preg_match('/<([^>]+)>$/', $from, $regs)){
    $from = $regs[1];
}

$from    = strtolower($from);
$title   = mb_convert_encoding($structure->headers['subject'], 'UTF-8', 'ISO-2022-JP');
$context = ($structure->body)? $structure->body : $structure->parts[0]->body;
$context = mb_convert_encoding($context, 'UTF-8', 'ISO-2022-JP');

この後で取得したデータをDBに格納したりします。ログを確認できるようにすることがいかなる場合も大切ですね。(●´ω`●)

Post Navigation