« QRコード作成 Main 足の甲の痛み »

メールへの自動返信

届いたメールに自動返信するには、/etc/aliasesに受け付けるアドレスを書き、そこに届いたメールを返信プログラムへパイプで渡す。

次のようになる。まず、/etc/aliasesへのパイプ設定

hoge: "|/usr/bin/php /home/foo/reply.php"

phpの場合は、他のスクリプトと違って通常は冒頭の起動シェルの指定(#!/usr/bin/php)は含まない(もちろん含めてもよいが)ため、スクリプト名だけを書くとボーンシェルあたりのスクリプトと解釈されてエラーになってしまうようなので、起動シェルの指定も前置する点に注意。

次に返信プログラム reply.php とした(参考:PHPプロ!)。PEAR::Mail/mimeDecode.phpを使ってphp://stdinから読み込んだメールを解析している。

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

// メールを stdin から読み込む
$source = file_get_contents("php://stdin");
if (!$source) exit;

// デコード設定
$params['include_bodies'] = true;
$params['decode_bodies'] = true;
$params['decode_headers'] = true;

// デコーダを生成し、デコード実行
$decoder = new Mail_mimeDecode($source);
list($recipients, $headers, $body)=$decoder->getSendArray();
$structure = $decoder->decode($params);

// FromヘッダをMIMEデコードし取り出す
$from = mb_convert_encoding(mb_decode_mimeheader($structure->headers['from']), mb_internal_encoding(), "auto");

// 元の From を返信宛先の To にする
$to = $from;
// 送信者設定(送信専用アドレス(←存在しないアドレスってこと?)にしたほうがよい?)
$from = "From: hoge@example.co.jp";
// 元の Subject に Re: を付けて題名にする
$title = mb_convert_encoding("Re: ".$structure->headers['subject'], "ISO-2022-JP");
// とりあえず届いた Body の文字コードを変換
$body= mb_convert_encoding($body, "ISO-2022-JP");
// 元の Body の前に返信メッセージと引用符を付加
$body = mb_convert_encoding("登録は完了しました。", "ISO-2022-JP") . "\n\n>>" . $body;

// 送信時の漢字コード設定(このあたりよくわからん)
mb_internal_encoding("ISO-2022-JP");
mb_language("japanese");

// 送信
mb_send_mail($to, $title, $body, $from);
?>

なお、/etc/aliases に、返信スクリプトのみでなく、カンマ区切りで転送アドレス先や届いたメールの保存ファイルも同時に指定できる。

hoge: foo,/home/foo/reply.log,"|/usr/bin/php /home/foo/reply.php"

リンク

Leave a comment

Your comment