!!!!!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
を取得できる。