PHPで自動返信メールを実装する(qmail&virturlhost使用時) その1
Q1, qmailとは?
A1, sendmailやpostfixと同じく、MTA(Message Transfer Agent、いわゆるメールサーバ)です。
現在では開発終了している。既存システムではまだ利用されており、機能追加する時などには、まだ必要な知識です。
Q2, 何をするの?
A2, phpを使って、メールの自動返信がしたい。
// 通常は以下の通り。
送信元メールサーバからメール
↓
自分のqmailに届く
↓
/home/vpopmail/domains/ヴァーチャルドメイン名/ユーザ名/Maildir/newに、受信したメールファイルを生成
↓
ユーザは自分のパソコンから、メーラを使って受信する
// やりたい事
送信元メールサーバからメール
↓
自分のqmailに届く
↓
PHPファイルがキックされる
↓
PHPにより自動返信メール送信
Q3, どうやって実装するの?
A3, 参考URL: http://teclog.hattara.info/?p=227
メール受信時にPHPを実行するだけなら、以下の設定フィアルを変更するだけ!
/home/vpopmail/domains/ヴァーチャルドメイン名/.qmail-defaultの記述を変更
/home/vpopmail/domains/ヴァーチャルドメイン名/ユーザ名/.qmail-defaultにすれば、そのユーザにメール送信した時だけ、返信PHPがキックされる。
旧) | /home/vpopmail/bin/vdelivermail ” bounce-no-mailbox
新) | /usr/bin/php /tmp/test.php
ただし、メールの内容をPHPで読み込むには、以下のPEAR(PHPの標準ライブラリ)が必要!
1 2 |
pear install Mail_Mime pear install Mail_mimeDecode |
PEARのインストールその1
ここでトラブル発生!pearのインストール(正確には展開)が失敗する!
1 2 3 4 5 6 7 8 9 |
[root@test.com ~]# pear install Mail_Mime downloading Mail_Mime-1.10.0.tgz ... Starting to download Mail_Mime-1.10.0.tgz (35,767 bytes) .........done: 35,767 bytes could not extract the package.xml file from "/tmp/pear/download/Mail_Mime-1.10.0.tgz" Download of "pear/Mail_Mime" succeeded, but it is not a valid package archive Error: cannot download "pear/Mail_Mime" Download failed install failed |
PEARのインストールその2
どうやら、Archive_Tarのバージョンが古いらしい。
参考URL:http://qiita.com/muramount/items/2071d005eb1155a08326
1 2 3 4 5 6 7 8 9 10 |
# 展開出来ずに失敗するけど、ダウンロードだけ行う pear upgrade -Z pear/Archive_Tar downloading Archive_Tar-1.4.2.tar ... Starting to download Archive_Tar-1.4.2.tar (Unknown size) ..........................done: 120,320 bytes could not extract the package.xml file from "/tmp/pear/download/Archive_Tar-1.4.2.tar" Download of "pear/Archive_Tar" succeeded, but it is not a valid package archive Error: cannot download "pear/Archive_Tar" Download failed upgrade failed |
PEARのインストールその3
tmpフォルダに展開に失敗したファイルがあるので、手動で展開して上書きする!
1 2 3 4 5 6 7 8 9 10 11 |
[root@test.com ~]# cd /tmp/pear/download/ [root@test.com download]# ls Archive_Tar-1.4.2.tar Mail_Mime-1.10.0.tar PEAR-1.10.1.tgz Archive_Tar-1.4.2.tgz Mail_Mime-1.10.0.tgz Structures_Graph-1.1.1.tgz Console_Getopt-1.4.1.tgz Mail_mimeDecode-1.5.5.tgz XML_Util-1.3.0.tgz [root@test.com download]# tar -zxvf Archive_Tar-1.4.2.tgz package.xml Archive_Tar-1.4.2/Archive/Tar.php Archive_Tar-1.4.2/docs/Archive_Tar.txt [root@test.com download]# mv /usr/share/pear/Archive/Tar.php /usr/share/pear/Archive/Tar.php.org [root@test.com download]# cp /tmp/pear/download/Archive_Tar-1.4.2/Archive/Tar.php /usr/share/pear/Archive/ |
PEARのインストールその4
ようやく必要なライブラリをインストールできた…。
1 2 3 4 5 6 7 8 9 10 |
[root@test.com download]# pear install Mail_Mime downloading Mail_Mime-1.10.0.tgz ... Starting to download Mail_Mime-1.10.0.tgz (35,767 bytes) .........done: 35,767 bytes install ok: channel://pear.php.net/Mail_Mime-1.10.0 [root@test.com download]# pear install Mail_mimeDecode downloading Mail_mimeDecode-1.5.5.tgz ... Starting to download Mail_mimeDecode-1.5.5.tgz (11,616 bytes) .....done: 11,616 bytes install ok: channel://pear.php.net/Mail_mimeDecode-1.5.5 |
Q4, 結局、何をどうするんだっけ?
A4, 本題の「特定のヴァーチャルドメインにメールが来たら、特定のPHPを実行する」には、
1, /home/vpopmail/domains/ヴァーチャルドメイン名/.qmail-defaultというファイルを修正(なかったら生成)
旧) | /home/vpopmail/bin/vdelivermail ” bounce-no-mailbox
新) | /usr/bin/php /tmp/test.php
2, メールを受信したら、意味のないファイルを作成するPHPファイルを書いてみる
/tmp/test.php
1 2 |
<?php file_put_contents('/tmp/test.txt', "hello, world\n"); |
3, qmailadminで作ったアカウントに対して、普通にメールしてみる
4, /tmp/text.txtが生成されているか確認する。ここまでくればPHPプログラミングの準備はOK!
Q4, 受信したメールの内容を取得するPHPの記述は?
A4, 実は標準入力で取得できる!ただし生データのままなので使いづらい!
1 2 3 |
<?php $input = file_get_contents("php://stdin"); file_put_contents('/tmp/test.txt', $input); |
受信メールの生データが格納されたファイル(/tmp/test.txt)
Received: (qmail 25611 invoked by uid 97); 26 Jul 2016 10:23:10 +0900
Received: from unknown (HELO mfg01.sendmail.ne.jp) (218.251.116.121)
by 0 with SMTP; 26 Jul 2016 10:23:10 +0900
Received: from mail.test.co.jp (mail.test.co.jp [121.83.205.115])
by mfg01.sendmail.ne.jp (8.14.7/8.14.7) with ESMTP id u6Q1N8Ep027409
for
Received: from [192.168.10.114] (221x243x14x226.ap221.ftth.ucom.ne.jp [221.243.14.226])
by mail.test.co.jp (Postfix) with ESMTPSA id DAC602B204A7
for
To: test1@sample.com
From: =?UTF-8?B?6Yi05pyo44CA5q2m5L+h?=
Subject: aaa
Message-ID: <1f3c2483-cc0e-b1ba-8deb-50a6d51f2080@test.co.jp>
Date: Tue, 26 Jul 2016 10:23:09 +0900
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101
Thunderbird/45.2.0
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp; format=flowed; delsp=yes
Content-Transfer-Encoding: 7bit
Q5, もっと使いやすい感じには出来ないの?
A5, さっきインストールが大変だったPEARパッケージを使えば、簡単に出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
/tmp/test.php <?php require_once("Mail/mimeDecode.php"); // メールの生データを、変数(to,from,subject,body)に格納してくれるクラスを定義 class receiveMail{ public function __construct() { } public function get($input) { $receiveParams; $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $params['crlf'] = "\r\n"; $params['input'] = $input; $mail_data = Mail_mimeDecode::decode($params); //メール生データを変数に格納 $this->receiveParams['from'] = $mail_data->headers['from']; $this->receiveParams['to'] = $mail_data->headers['to']; $this->receiveParams['subject'] = mb_convert_encoding($mail_data->headers['subject'], "UTF-8", "JIS"); $this->receiveParams['body'] = mb_convert_encoding($mail_data->body,"UTF-8","JIS"); return $this->receiveParams; } } // メールの生データは標準入力から来るので分解して、配列に格納する。 $receiveMail = new receiveMail(); $input = file_get_contents("php://stdin"); $mail = $receiveMail->get($input); // 適当な文字列に格納して、変数に渡す $data = sprintf(" to = %s\n from = %s\n subject = %s\n body = %s\n", $mail['to'], $mail['from'], $mail['subject'], $mail['body']); // ファイルに書き込む。 file_put_contents('/tmp/a.txt', $data); |
長くなってきたので、その2へ続く