Daily Archives: 2010 年 9 月 27 日

qmailでバーチャルドメインのメールを全て受け取りphpに渡す

0
Filed under 未分類

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

これで以下のようなクラスを作成して呼び出せば、ガバっと取れますね。

<?php
require_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);

これでやりたかったことを、ひとまず出来上がりっと。