mb_send_mail と SMTP の基礎知識

Date
2006-03-16 (Thu)
Category
php

最初に、実際の使用感とは異なるかもしれない low level プロトコルとして、SMTP を簡単に解説します。SMTP を用いるのに必要なのは以下の3情報です。

mail from とはその名の通り差出人情報で、rcpt to は receipt to の略。つまり受取人情報。(技術書などではこれらの二つをあわせて envelope と呼ぶらしい。)そして data がメールで伝えたい内容。

この2つの envelope (mail from と rcpt to)に入力していいのは、我々がメーラで目にするヘッダ情報(つまり“From: 鈴木 一郎 <ichiro@suzuki.com>”など)ではなく、素のemail アドレスだけ、というのは考えれば当たり前ですが、僕の直感とは少し異なっていました。

では我々がメーラで目にするヘッダ情報はどこにあるのでしょう?これは3つめの data のなかにあります。この data として送られる内容の、始まりから数えて最初の により前が message header と呼ばれる“我々がメーラで目にするヘッダ情報”。それ以降全ては message body となり、普段、メーラで見る内容です。

message header 内で日本語を扱う場合、慣習的にほぼ必ず、ISO-2022-JP で文字構造化(character set)してそれを Base64 で可視符号化(encoding method)します。(RFC による標準定義はもちろんあるが、慣習的にほぼ必ずとしたのは、他のオプションもがあるけれども、あまり使われていないようだから。)

詳しくは以下の RFC を参照のこと
RFC 2076: 一般的に使われる message header について
RFC 2047: message header 内での非ASCII 文字の使用について

(正確には SMTP がプロトコルで中身を規定したのが MIME ですね?此処ではプロトコルエンジニアになるのが目的ではないのでとりあえず割愛します。)

さて漸く本題の php に話を戻します。日本語のメールを送りたい時に一番使われるのが mb_send_mail() でしょう。これは上記の問題の多くを隠蔽してくれます。それゆえ挙動がたまに不可解。調べました。

mb_send_mail() は以下の5つの引数を受け取ります。最初の3つが必須であとの2つは optional。

bool mb_send_mail (
	string $to,
	string $subject,
	string $message [, 
	string $additional_headers [, 
	string $additional_parameter]] 
)

(以下で断り無くエンコードと言った場合は、「文字構造化(character set)してそれを Base64 で可視符号化(encoding method)」することを意味します。)

$to は受取人情報を示します。message header に入るべき内容を受け渡すと、関数側でemail address 文字列を自動的に抜き出して rcpt to として MTA (Mail Transfer Agent、例えば sendmail や postfix) に伝え、渡された内容を直接を message header に挿入します。ただしマニュアルページにあるように、エンコードはしません。ので、日本語を使いたい場合は、mb_encode_mimeheader() すべきです。

$subject は message header の件名(Subject)を示します。マニュアルに書いていませんが自動的にエンコードされます

$message は message body を示します。当然ですがエンコードされません

オプションの $additional_headers は、上述の以外の message header を(\n 区切りで)いくらでも挿入可能。通常メーラは複数のヘッダを見つけた場合、下にあるほうを優先するようなので、実は Subject を挿入し上書きするのも可能です。ただしここで入力した内容はエンコードされません

最後の $additional_parameter は MTA に引き渡す特別な option です。詳しくは terminal で man sendmail してほしいですが、よく使われるのは “-f foo@example.com” でしょうか。僕の例では、FreeBSD上、php を apache 経由で起動し mail の送信をした場合、MTA に伝わる mail from は unix username が引き渡されていました。つまり apache の起動 user ですから www です。それでは error message が存在しない www ユーザに帰って困るので、前述の "-f foo@example.com" を使いました。


本当はちゃんとコードも載せるつもりでしたが、眠いので省略します。リクエストがあれば。PEAR のメールクラスなんかも本当は調べたい。。

Comment:3

tksh:2006-06-19 (Mon) 01:13

ここに書いてあることは実は間違ってることもいくつかあるので、訂正の必要がありです。ふむ。。

best wow gold sites:2011-09-19 (Mon) 02:38

5 br

moncler vest:2011-12-12 (Mon) 07:30

Thank you for the opportunity to be of service.

Comment Form

Remember Me?


Trackback:0

TrackBack URL for this entry
http://blogs.grf-design.com/mt/mt-tb.cgi/153
Listed below are links to weblogs that reference
mb_send_mail と SMTP の基礎知識 from The Croton

Return to Page Top