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

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

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

■qmail

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

[cc lang="bash"]
vi /var/qmail/mailnames/[domain]/[mailaddress]/.qmail
[/cc]

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

[cc lang="bash"]
| true
| /usr/bin/deliverquota ./Maildir
[/cc]

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

[cc lang="bash"]
| /usr/bin/php /var/www/vhosts/[domain]/subdomains/[sub]/register.php
| true
| /usr/bin/deliverquota ./Maildir
[/cc]

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

■postfix

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

[cc lang="bash"]
vi /etc/aliases
[/cc]

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

[cc lang="bash"]
user: “| /usr/bin/php /var/www/vhosts/[domain]/subdomains/[sub]/register.php”
[/cc]

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

[cc lang="bash"]
postalias /etc/aliases
[/cc]

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

■register.php

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

[cc lang="bash"]
touch /var/www/vhosts/[domain]/subdomains/[sub]/log.txt
chmod 0777 /var/www/vhosts/[domain]/subdomains/[sub]/log.txt
[/cc]

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

[cc lang="php"]
$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);
[/cc]

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

[cc lang="php"]
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’);
[/cc]

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

Post Navigation