« PEAR::Mailを使ってメールを送信してみよう | トップページ | WindowsでApolloをインストールしてみよう(開発環境を作ってみよう) »

2007年03月25日

PEAR::Mail_Mimeを使ってHTMLメールを送ってみよう

前回「PEAR::Mailを使ってメールを送信してみよう」でメールの送信について紹介しました。これだけでも結構助かるのですが、便利になると更に欲が出るもので「ファイルを添付したメールを送信できないか?」「HTMLメールを簡単に作れないか?」などを考えます。そんなときにPEAR::MailをサポートしてくれるPEAR::Mail_Mimeという便利な拡張機能があります。
PEAR::Mail_Mimeは添付メールやHTMLメールを簡単に実現できます。
今日はPEAR::Mail_Mimeを紹介します。

インストールについて知りたい方は、過去の記事をご参照ください。
レンタルサーバーでPEARを使う方法
WindowsでPEARを自動インストールしてみよう

今回はPEAR::Mailの拡張機能になりますのでPEAR::Mailの使い方を知ってることが前提です。
もし使い方を知らない方は前回のエントリー「PEAR::Mailを使ってメールを送信してみよう」をご参照ください。

まずは添付メールの紹介です。
テキストメールで「sample.php」「sample.jpg」「sample.xls」の3つのファイルを添付する場合、以下のように記述します。尚、赤色の部分は前回のエントリーからの追加・編集した部分です。

require_once("Mail.php");
require_once("Mail/mime.php");

$header['From'] = "ピヨヒコ<piyopiyo@s-memo.net>";
$header['To'] = "To様<to@s-memo.net>";
$header['Subject'] = "メールのタイトル";

$html_param['head_charset'] = "ISO-2022-JP";
$html_param['text_encoding'] = "ISO-2022-JP";
$html_param['text_charset'] = "SJIS";

$mime = new Mail_mime();
$mime->setTxtBody("メール本文");
$mime->addAttachment("./sample.jpg", "image/jpeg");
$mime->addAttachment("./sample.php", "text/plain");
$mime->addAttachment("./sample.xls");

$body = $mime->get($html_param);
$header = $mime->headers($header);

$mail = Mail::factory("smtp");
$ret = $mail->send("to@s-memo.net", $header, $body);
if(PEAR::isError($ret)) {
  die("エラーメッセージ:".$ret->getMessage());
}


まずはPEAR::MailとPEAR::Mail_Mimeをインクルードします。
PEAR::Mail_Mime自身はメールの送信は一切行いません。あくまでPEAR::Mailをサポートする為のクラスですので、PEAR::Mailも必ずインクルードします。
require_once("Mail.php");
require_once("Mail/mime.php");

次に文字コードを連想配列にセットします。head_charsetはメールヘッダの文字コード、text_encodingはメールの文字コード(テキストメール専用)、text_charsetは変換前の文字コードです。
文字化けが発生した場合、この部分を間違えている可能性が高いです。mb_convert_encodingなどで文字コードを変更する前に以下の連想配列を変えてみることをお勧めします。
$html_param['head_charset'] = "ISO-2022-JP";
$html_param['text_encoding'] = "ISO-2022-JP";
$html_param['text_charset'] = "SJIS";

次にPEAR::Mail_mimeを宣言して、メール本文をセットします。テキストメールを送信する場合、setTxtBodyメソッドを使用します。
$mime = new Mail_mime();
$mime->setTxtBody("メール本文");

いよいよ添付処理です。添付はAttachmentメソッドを使用します。
第1引数にファイルパス又はデータを直接書きます。第2引数にContent-Typeを指定します。
Content-Typeが不明な場合は、省略しても大丈夫でした。でも、出来る限り指定してあげたほうがよさそうです。
$mime->addAttachment("./sample.jpg", "image/jpeg");
$mime->addAttachment("./sample.php", "text/plain");
$mime->addAttachment("./sample.xls");

getメソッドでメール用に変換したデータを$body変数に格納しています。
ヘッダ情報もheadersメソッドで変換したデータを$header変数に格納しています。
$body = $mime->get($html_param);
$header = $mime->headers($header);

$body変数はそのままメール本文で使用して、$header変数もそのままメールヘッダとしてPEAR::Mailにセットしてメールを送信します。
$mail = Mail::factory("smtp");
$ret = $mail->send("to@s-memo.net", $header, $body);

これでスクリプトを起動させると添付メールが届くと思います。

次はHTMLメールを作って見ます。HTMLメールには
・画像ファイルはサーバーに設置して、パスをhttpから記述する方法
・画像ファイルを添付してパスを相対パスで記述する方法
の2種類あります。
PEAR::Mail_Mimeを使うと両方とも実現できます。まずは、HTTPから記述する方法を紹介します。
「http://www.s-memo.net/img/sample.jpg」に画像があると過程します。

require_once("Mail.php");
require_once("Mail/mime.php");

$header['From'] = "ピヨヒコ<piyopiyo@s-memo.net>";
$header['To'] = "To様<to@s-memo.net>";
$header['Subject'] = "メールのタイトル";

$html_param['head_charset'] = "ISO-2022-JP";
$html_param['html_encoding'] = "ISO-2022-JP";
$html_param['html_charset'] = "SJIS";

$html = <<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>HTMLメール送信テスト</title>
</head>
<body>
<font color="#0000FF">HTMLメールのテストです</font><br>
<img src="http://www.s-memo.net/img/sample.jpg">
</body>
</html>
HTML;

$mime = new Mail_mime();
$mime->setHTMLBody($html);

$body = $mime->get($html_param);
$header = $mime->headers($header);

$mail = Mail::factory("smtp");
$ret = $mail->send("to@s-memo.net", $header, $body);
if(PEAR::isError($ret)) {
  die("エラーメッセージ:".$ret->getMessage());
}


text_encodingとtext_charsetはテキストメール用ですが、HTMLメールの場合はhtml_encodingとhtml_charsetを使用します。
・テキストメールの場合
$html_param['head_charset'] = "ISO-2022-JP";
$html_param['text_encoding'] = "ISO-2022-JP";
$html_param['text_charset'] = "SJIS";

・HTMLメールの場合
$html_param['head_charset'] = "ISO-2022-JP";
$html_param['html_encoding'] = "ISO-2022-JP";
$html_param['html_charset'] = "SJIS";

次に$html変数にHTMLを挿入して、setHTMLBodyメソッドにセットします。
$mime->setTxtBody($html);

後は先ほどを全く同じです。これでHTMLメールが送信できると思います。

最後に画像ファイルを添付してパスを相対パスで記述する方法を紹介します。

require_once("Mail.php");
require_once("Mail/mime.php");

$header['From'] = "ピヨヒコ<piyopiyo@s-memo.net>";
$header['To'] = "To様<to@s-memo.net>";
$header['Subject'] = "メールのタイトル";

$html_param['head_charset'] = "ISO-2022-JP";
$html_param['html_encoding'] = "ISO-2022-JP";
$html_param['html_charset'] = "SJIS";

$html = <<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>HTMLメール送信テスト</title>
</head>
<body>
<font color="#0000FF">HTMLメールのテストです</font><br>
<img src="./sample.jpg">
</body>
</html>
HTML;

$mime = new Mail_mime();
$mime->setTxtBody($html);
$mime->addHTMLImage("./sample.jpg", "image/jpeg");

$body = $mime->get($html_param);
$header = $mime->headers($header);

$mail = Mail::factory("smtp");
$ret = $mail->send("to@s-memo.net", $header, $body);
if(PEAR::isError($ret)) {
  die("エラーメッセージ:".$ret->getMessage());
}


imgタグのsrc属性を相対パスに変更します。
<img src="./sample.jpg">

画像をHTMLメールに埋め込みたい場合には、addHTMLImageメソッドを使います。
第1引数には画像パス、第2引数にはContent-Typeを指定します。
$mime->addHTMLImage("./sample.jpg", "image/jpeg");

これで画像付のHTMLメールが送信できます。
画像を添付で送りたい場合はaddAttachmentメソッドを使って、画像をHTMLメールに埋め込みたい場合はaddHTMLImageメソッドを使います。状況によって使い分けてください。

2回に分けてメールに関するPEARを紹介してきましたがいかがだったでしょうか。
私はPEAR::Mailに切り替えてからメール関係で文字化けに悩むことが大分減りました。
メール関係だけでもまだまだ別のライブラリがありますので、機会があれば紹介したいなと思います。

[関連記事]
PEAR::Mailを使ってメールを送信してみよう

トラックバック

このエントリーのトラックバックURL:
http://www.s-memo.net/mt/mt-tb.cgi/40

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)