[PHP-users 7716] Re: 受信メールデータの取得方法について

HAYAKAWA Hiroshi php-users@php.gr.jp
Wed, 29 May 2002 07:30:50 +0900


早川@名古屋です。

on 02.5.29 0:20 AM, Tetsuya Nakamura at magazine@ikoi.cha.to wrote:

> 今、制作しているプログラムで
> test@domain.com(仮)へメールを送った場合に
> PHPプログラムを動かしてタイトル、本文などデータベースへ
> 格納するという感じなのですが
> 過去ログににたような内容はあったのですが
> わかりませんでした。
> 
> qmailを使用しており
> .qmail-testに
> | /usr/local/bin/php /home/domain/public_html/mail.php
> というように記述し
> PHPファイルで環境変数は取得はできるのですが
> subjectや本文の取得の仕方がどうしてもわかりません。

ヘッダも含むメール全体は
以下のような感じでで取得できると思います。

----------
$rawmail="";
$fp=fopen("php://stdin", "r");
while(!feof($fp)){
    $rawmail.=fread($fp, 4096);
}
fclose($fp);
----------

僕は後は自前で変換・パース等して必要なものを切り出しています。

・生メールの文字コードを変換
$rawmail=h2_convert_encoding($rawmail, "EUC-JP", "auto");
・改行コードを変換
$rawmail=h2_convert_retcode($rawmail);
・ヘッダーとボディに分離
$splitmail=split("\n\n", $rawmail, 2);
・ヘッダーからサブジェクトを取得
eregi("\nSubject:([^\n]*(\n[ \t]+[^\n]*)*)", $splitmail[0],
$subject_header);
・サブジェクトの複数行を1行に変換
$subject_header[1]=trim(ereg_replace("\n[ \t]+", "", $subject_header[1]));
・サブジェクトをデコード
$decoded_subject=h2_decode_mimeheader($subject_header[1]);

という感じで。

# h2_*というのは自作関数で、<それなり>のことをしています。
# mb_*を使わないのはいわゆる
# 「半角円マークと半角オーバーライン」の処理のためです。
# (#6410で終わるスレッドを参照してください)

ヘッダを処理するのに、
もしかするとPearに何か便利なものがあるかもしれませんが、
コードを書いたのが結構前なのと
一部の情報のみしか必要としなかったので、
Pear等による方法はあいにく把握していません。

あとPostfixの場合はエンベロープ送信者(のはず)を
環境変数SENDERに入れて渡してくれますので、
FROM:ヘッダを使うことなくそちらを利用しています。


-----
With your dreaming, with your smile.
Hayakawa, Hiroshi <hayakawa@sam.hi-ho.ne.jp>
Nagoya,Aichi,JAPAN ☆彡