Daily Archives: 2010 年 9 月 27 日
qmailでバーチャルドメインのメールを全て受け取りphpに渡す
qmailでバーチャルドメインを設定するには、
「/var/qmail/control/morercpthosts」「/var/qmail/control/virtualdomains」などでできますし、
存在しないメールアドレス宛てのものを全部受け取るのは、「/var/qmail/alias/.qmail-default」でできます。
では、virtualdomainsで複数のドメインが指定されていて、その中の1個のドメインのみ
個別のメールアドレスを作らず、ドメインが一致していれば(@の後が同じなら)
どんなメールアドレスでも受信できるようにするには、どうしたらいいだろう。
まずは、qmailで利用しているメールアカウントは、/etc/passwdで管理されている前提でいうと、
***@example.com 宛のメールだとすれば、
「/var/qmail/control/virtualdomains」に以下のような記載をします。
example.com:example.com
※コロン「:」の右側はお好きなもので指定してください。
次に、「/var/qmail/control/morercpthosts」に以下のような記載をします。
example.com
次に、通常aaa@example.comなどのメールアドレスを作成する場合には、
/usr/sbin/useraddコマンドで、
「example.com-aaa」(virtualdomainsの[:]の右がexample.comなら)というアカウントを作成しますが、
特定のメールアドレスではなく、動的に作成される可変のメールアドレスを扱う場合には、
@の前が何になるかわからないので、「example.com」(virtualdomainsの[:]の右による)というアカウントを作ります。
次に、作成したアカウントのディレクトリ(/home/example.com/を例にする)に.qmail-defaultを作成します。
/home/example.com/.qmail-default
| /usr/bin/php /home/example.com/abc.php
上記の例だと、***@example.com宛にメールが着たら、毎回/home/example.com/abc.phpという
phpのプログラム(スクリプト/実行ファイル)がキックされ、動作することになります。
このphpのプログラムの中で、メールの内容を読み取るためには、事前にpearモジュールを
インストールしておく必要があります。
pear install Mail_Mime
pear install Mail_mimeDecode
これで以下のようなクラスを作成して呼び出せば、ガバっと取れますね。
<?phprequire_once(“Mail/mimeDecode.php”);class receiveMail{/*** コンストラクタ*/public function __construct(){}/*** get*/public function get($input){public $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);#– From フィールドの取得$this->receiveParams['from'] = $mail_data->headers['from'];#– To フィールドの取得$this->receiveParams['to'] = $mail_data->headers['to'];#– Subject フィールドの取得$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;}}
簡単に呼び出し元も書いておく。
require_once(“./receiveMail.php”);
$receiveMail = new receiveMail();
$input = file_get_contents(“php://stdin”);
$mail = $receiveMail->get($input);
これでやりたかったことを、ひとまず出来上がりっと。