PHP 添付ファイル付メール送信 勉強メモ
ブログで「今年こそはちゃんとPHP勉強するよ」宣言したのが効いているのかまだ諦めずに続いてます。PHPの勉強。脱三日坊主。やったぜ。
ようやく実務でもちょこちょこ自分で1からPHPの何かを作らせてもらえるようになって、調子に乗ってたんですが、「添付ファイル付きのメールを送る」という事態に対して、まったく仕組みがわからなかったんだぜ。
メールの仕組みをおさらい
分かってるようで分かってなかったメールの仕組みをもっかいおさらい。
メールにかけられた呪文「MIME~前編」
メールにかけられた呪文「MIME~後編」
めっちゃ詳しく説明されてる。全力で印刷した。読んだ。とりあえず前半を読んでMIMEってやつの仕組みをしっかり理解しておかないといけない、と初心者ながらに悟った。
ちょうど上のリンク先の後編は添付ファイルを送るときの仕組みが書かれていたので、それにそって勉強。
MIME-Version
MIMEのバージョンを示す。現在は1.0しか存在しないらしい。
MIME-Version: 1.0
マルチパートであることを宣言
複数の異なる種類のデータをメールで送ろうと思ったら絶対このマルチパートさんの力が必要になる、と。今回のケースで使用するのは
Content-Type: multipart/mixed;
これは最も一般的なマルチパートらしい。個々のパートがそれぞれ別のデータを表す、という意味。
パートの境界はバウンダリ(boundary)という任意の文字列で示す
添付ファイルを送るときはボディ部分をパートに区切る必要がある。分割の区切りには区切り文字というものを使用する。それがバウンダリ(boundary)という任意の文字列。
--バウンダリ文字列
↑ここから開始
↓ここで終了
--バウンダリ文字列--
頭に「--」が付いてるのが区切りのしるし。おしりにも「--」がついてるのがそれで全部終わりだよのしるし。
7ビットの日本語コードは ISO-2022-JP
ISO-2022-JPのコード体系はJISとほぼ同じ。でも半角カナ等に該当するコードが空けられているという点が違う。Content-TypeのcharsetでコードがISO-2022-JPであることを表す。ISO-2022-JPは7ビットコードなので、Content-Transfer-Encodingは省略しても構わない。
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
ISO-2022-JPに変換できない場合や、正確に送信する必要のある原稿などを添付ファイルにする場合は、BASE64を用いて中身をテキストデータにエンコードする。例えばこういう風にするとよいらしい。
Content-Type: text/plain; charset="SJIS"
Content-Transfer-Encoding: base64
とにかくそのまま送ったらマズいものはエンコードして送ればいいという感じなんかな。なんか難しい。とりあえずメールの仕組みはうっすらと分かった気になったので、実際のソースを見ながら追ってみた。
ソースを参考させて頂いたページ
上で予習した内容を元にソースを追ってみると、分かる・・・分かるわ、ママン!状態でウホウホになった。
めっさ大まかな流れ
- ヘッダの組み立て
- 添付画像のエンコード(base64でエンコードして、chunk_split)
- バウンダリを利用してパート化、ボディの組み立て
- mail関数で送信
mb_send_mailではなくmailを使ったほうがいい理由
いろいろググった情報では「添付を扱う場合はmb_send_mailじゃなくてmailの方を使う」みたいな事が至るサイトに書いてあった。んでもね、最近購入した「PHP 逆引きレシピ」という本によると「添付ファイル付きのメールを送りたい」のページのソースはmb_send_mailになってるんですよね。んで、このページにたどり着きました。
mb_send_mailで添付メール - おふぃす・ぞんち開発日記
なるほど。「結論的には、受け手の環境によるということです。
」とのこと。だからみんなmail関数の方を使って添付ファイルを送ってるってことなんですね。理解。
分かったような分かってないような状態ながらいろいろ参考になるサイトや本の力を借りてなんとかそういうモノが作れた。けど1から何も見ずに書けと言われたらまだ書けないな・・・。えーん。まぁ1回作ったんだからそれを元に改造していけばいいか。
なんか添付絡み、スゲーーややこしかったんですけど、PEAR使ったらもっと簡単にできるらしい。道は長いな。
<< PHP 画像にロゴを入れる | PHP オブジェクト指向の勉強 >>
トラックバック
このエントリーのトラックバックURL:
http://redline.hippy.jp/cgi/mt/mt-tb.cgi/247
コメント (3)
初めまして。
同じく。ただいま添付付メールに大格闘中でした。
参考にさせていただきます。ありがとう。
投稿者: shuga | 2009年12月16日 18:51
I want to quote your post in my blog. It can?
And you et an account on Twitter?
投稿者: MeninaDestinta | 2009年12月26日 00:49
非常に参考にさせて頂いています。
ありがとうございます。
投稿者: 匿名 | 2010年09月27日 17:45