メールへの自動返信
届いたメールに自動返信するには、/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"
リンク
- 空メールによる自動返信機能をつけたいのですが・・ – PHPプロ!Q&A掲示板
- メール分解 PEAR :: Mail_mimeDecode Mail_Mimeパッケージ – PHP::PEAR – dozo PukiWiki
- PHP第3回:PHP応用(メール送信)
- はやぐい/メールの転送と自動返信
- 自宅サーバの道しるべ【空メール(自動返信メール)】
- 研修で教えてくれない!:第3回「自動返信メールが“危険”な理由」 – ITmedia Biz.ID
- メールの自動返信で、誤訳が道路標識に | WIRED VISION