Recently in qmail Category

本エントリでは、qmailを使用して存在しないユーザへのメールを
別なメールアドレスに転送する方法について記述する。

主な手段としては、

  • /var/qmail/alias/ を使う方法
  • /var/qmail/users/ を使う方法
の二つがある。
今回は/var/qmail/alias/ を使う方法について取り扱う。

/var/qmail/alias に「.qmail-XXX」というファイルを作成する。
XXX は存在しない仮想的なユーザ名であり、XXXあてのメールは全て.qmail-XXXの
内部に記述されているメールアドレスに転送される。

「.qmail-XXX」には複数行にわたりメールアドレスを記述することができる。
例を次に示す。

$cat .qmail-mtest
&mahata@example.net
&mahata@example.org
qmailがexample.comのマシンで動作していると仮定したとき、
mtest@example.comにメールを送信すると
mahata@example.netとmahata@example.orgにメールが転送される。

また、'@'以下(すなわちドメイン名)を省略した場合、
ドメイン名は/var/qmail/control/me に記述されているものに従う。

前回のエントリでmultipartのバウンダリ文字列を抜き取る処理を記述したけれど、
multipartを分解したいだけなら、Mail/mimeDecode.php の基本処理で事足りたようである...

<?php 
require_once('Mail/mimeDecode.php');

$_params['include_bodies'] = true;
$_params['decode_bodies'] = true;
$_params['decode_headers'] = true;
$_params['input'] = file_get_contents('php://stdin');
$_structure = Mail_mimeDecode::decode($_params);

foreach ($_structure->parts as $_part) {
    //$_part->body;
}

?>

この例では、foreachの中の

$_part->body;
で分解された個々のbodyを取得できる。
本来、multipartかどうかの処理や、その他の細かい処理が必要になるが、そこら辺はPHPプロ!の記事を参照されたい。

!!!!!multipartを分解するだけの処理を知りたい場合は、こちらを参照されたい。!!!!!

multipartのバウンダリ文字列がヘッダで渡ることを知らなくて、少しだけはまった。

本エントリでは、qmailが動いているサーバでメールを受信し、
/tmp/mail_sample.txtにバウンダリ文字列を出力するまでの過程を記述する。

qmailでは、$HOME/.qmailでメール本文を受けたときに起動するスクリプトを記述できる。
私の環境では、.qmailは次のようになっている。

$ cat ~/.qmail
| /usr/bin/php /tmp/sample_script.php

この例では、メールを受信したタイミングで/tmp/sample_script.php が起動する。

さて、/tmp/sample_script.php は次のようになっている。
(PEAR のMail_Mimeがインストールされていることを前提としている)

<?php
require_once('Mail/mimeDecode.php');

$_in = fopen("php://stdin", "r");
$_mail_text = '';
while($_line = fgets($_in)) {
    $_mail_text .= $_line;
}

$_decoder = & new Mail_mimeDecode( $_mail_text );
$_parts =$_decoder->getSendArray();
list( $_recipients, $_headers, $_body ) = $_parts;

$_ret = preg_match("/boundary=\"([0-9a-zA-Z_\-\+\=\.\:]+)\"/", $_headers['Content-Type'], $_matches);
if($_ret) {
    $_fp = fopen("/tmp/mail_sample.txt", "w");
    fwrite($_fp, $_matches[1]);
    fclose($_fp);
}
?>

ただ単純に、ヘッダからContent-Typeの列を取り出して、正規表現で抜き出すだけ。
本来なら、multipart/mixed かどうかも見るべきかと思うけれど、
multipart/mixed でない限りは"boundary"という文字列は存在しないはずなので、これでよしとしている。

なお、multipart/mixed の場合は、次のような感じの文字列を受け取れる。

multipart/mixed; boundary="-----=_NextPart_46196_50244_54292"

この場合、上記のスクリプトでは、

-----=_NextPart_46196_50244_54292

を取得できる。

About this Archive

This page is a archive of recent entries in the qmail category.

PHP is the previous category.

Tag is the next category.

Find recent content on the main index or look in the archives to find all content.