メールへの自動返信
届いたメールに自動返信するには、/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