PHPMailer と JPHPMailer でのメール送信(JPHPMailer連想配列版もアリ)
PHPからのメール送信で、以前に PEAR::Mail からのメール送信をやってみましたが、今回は「PHPMailer」と「JPHPMailer」を使ってみました。
(前回の PEAR::Mail からのメール送信は、こちら)
「PHPで日本語メールを送る ? 応用編 (添付ファイル、HTMLメール) - EC studio 技術ブログ」を、おもいっきり参考にさせていただきました。
※サンプルコード等をたくさん使わせていただきました。
今回の環境は、
になります。
PHPMailer でのメール送信
「PHPMailer」は PHP でメール送信をするためのライブラリです。
XOOPS(CMS) や Symfony(PHPフレームワーク) 等のオープンソースプロジェクトでも採用/実装されているそうです。
PHPMailer のインストール
「PHPMailer」はソースファイル群なので、インストールはファイルをダウンロードして解凍すれば完了です。
ライブラリへのアクセスを簡単にするために、解凍して出来たファイルは PHP の「include_path」に設定されいるディレクトリに格納するのが良いと思います。
# wget http://sourceforge.net/projects/phpmailer/files/phpmailer%20for%20php5_6/PHPMailer%20v5.1/PHPMailer_v5.1.zip/download # unzip PHPMailer_v5.1.zip # mv PHPMailer_v5.1 phpmailer
PHPMailer でのメール送信の実装
「PHPMailer」でのメール送信処理は以下のようなコードになります。
コードについては、「PHPで日本語メールを送る ? 応用編 (添付ファイル、HTMLメール) - EC studio 技術ブログ」を参考にさせていただきました。
唯一変更している箇所としては、オリジナルのコードは「EUC-JP」でしたが、自分環境では内部エンコードが「UTF-8」だったので「mb_internal_encoding("UTF-8");」や「mb_convert_encoding($fromname,"JIS","UTF-8")」というように変更をしています。
<?php require_once("./phpmailer/class.phpmailer.php"); //ライブラリ読み込み mb_language("japanese"); //言語(日本語) mb_internal_encoding("UTF-8"); //内部エンコーディング(UTF-8) $to = "hogehoge@example.com"; //宛先 $subject = "メールの件名"; //件名 $body = "メールの本文です。"; //本文 $from = "foobar@example.com"; //差出人 $fromname = "ほげほげ 太郎"; //差し出し人名 $attachfile = "./file.zip"; //添付ファイルパス $mail = new PHPMailer(); //PHPMailerのインスタンス生成 $mail->CharSet = "iso-2022-jp"; //文字コード設定 $mail->Encoding = "7bit"; //エンコーディング $mail->AddAddress($to); //宛先(To)をセット $mail->From = $from; //差出人(From)をセット $mail->FromName = mb_encode_mimeheader(mb_convert_encoding($fromname,"JIS","UTF-8")); //差出人(From名)をセット $mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8")); //件名(Subject)をセット $mail->Body = mb_convert_encoding($body,"JIS","UTF-8"); //本文(Body)をセット $mail->AddAttachment($attachfile); //添付ファイルをセット //メールを送信 if (!$mail->Send()){ echo("Failed to send mail. Error:".$mail->ErrorInfo); }else{ echo("Send mail OK."); }
「undefined function mb_language」が発生した
上記のコードを実行したところ、以下のように「Call to undefined function mb_language()」が発生しました。
$ php mail.php PHP Fatal error: Call to undefined function mb_language() in /root/work/phpmail/mail.php on line 6
どうやら「mbstring」がインストールされていなかったようなので、yum からインストールしました。
yum で「php-mbstring」をインストールします。
$ su - root # yum install php-mbstring (〜 省略 〜) Installed: php-mbstring.i386 0:5.1.6-27.el5_5.3 Complete!
「php-mbstring」のインストールができたら、「php.ini」を変更します。
CentOS の場合、「php.ini」は「/etc/php.ini」にあるので、vim 等でファイルを開いて下記のように変更します。
[mbstring] ; language for internal character representation. mbstring.language = Japanese -> コメントを解除 ; internal/script encoding. ; Some encoding cannot work as internal encoding. ; (e.g. SJIS, BIG5, ISO-2022-*) ;mbstring.internal_encoding = EUC-JP mbstring.internal_encoding = UTF-8 -> UTF-8を指定
もう一度メール送信を実行(今度はOK)
上記の設定が出来たら、もう一度メール送信処理を実行してみます。
# php mail.php Send mail OK.
今度は成功しました。
JPHPMailer でのメール送信
「JPHPMailer」は「PHPで日本語メールを送る ? 応用編 (添付ファイル、HTMLメール) - EC studio 技術ブログ」で公開されている、「PHPMailer」を使って日本語メールを送信するために作成されたラッパークラスです。
JPHPMailer のインストール
「JPHPMailer」も「PHPMailer」と同様にソースファイル群なので、インストールはファイルをダウンロードして解凍すれば完了です。
但し、「JPHPMailer」ラッパークラスのため、動作には「PHPMailer」が必要になります。
「JPHPMailer」単体では動作しないので注意してください。
# wget http://techblog.ecstudio.jp/files/jphpmailer.zip # unzip jphpmailer.zip
JPHPMailer の文字コード変換/文字コード設定の変更
「JPHPMailer」は「EUC-JP」で書かれているので、とりあえず文字コードを変換しておきます。
文字コードの変換には「nkf」を使用しました。
# cd jphpmailer # nkf -w --overwrite jphpmailer.php # nkf -w --overwrite sample_attachmail.php # nkf -w --overwrite sample_htmlmail.php
文字コードの変換が完了したら、次に内部エンコードが記述されている部分を変更します。
デフォルトでは「EUC-JP」となっているので、ここを「UTF-8」に変更します。
コードの変更には「sed」を使用してみました。
# grep "EUC-JP" jphpmailer.php var $in_enc = "EUC-JP"; //内部エンコード # # sed -i.bak -e "s/EUC-JP/UTF-8/g" jphpmailer.php # # grep "UTF-8" jphpmailer.php var $in_enc = "UTF-8"; //内部エンコード
JPHPMailer でのメール送信の実装
「JPHPMailer」でのメール送信処理は以下のようなコードになります。
コードについては、「PHPで日本語メールを送る ? 応用編 (添付ファイル、HTMLメール) - EC studio 技術ブログ」を参考にさせていただきました。
先ほどと同様に、「EUC-JP」を「UTF-8」に変更しています。
<?php require_once("./jphpmailer/jphpmailer.php"); //ライブラリ読み込み mb_language("japanese"); //言語(日本語) mb_internal_encoding("UTF-8"); //内部エンコーディング(UTF-8) $to = "hogehoge@example.com"; //宛先 $subject = "メールの件名"; //件名 $body = "メールの本文です。"; //本文 $from = "foobar@example.com"; //差出人 $fromname = "ほげほげ 太郎"; //差し出し人名 $attachfile = "./file.zip"; //添付ファイルパス $mail = new JPHPMailer(); //JPHPMailerのインスタンス生成 $mail->addTo($to); //宛先(To)をセット $mail->setFrom($from,$fromname); //差出人(From/From名)をセット $mail->setSubject($subject); //件名(Subject)をセット $mail->setBody($body); //本文(Body)をセット $mail->addAttachment($attachfile); //添付ファイル追加 if (!$mail->send()){ echo("Failed to send mail. Error:".$mail->getErrorMessage()); }else{ echo("Send mail OK."); }
「JPHPMailer」へのデータセットを連想配列で出来るようにしてみた
「JPHPMailer」へのデータセットについて、1つ1つをメソッド呼び出しで行うのではなく、連想配列を渡して1回で出来るようにしてみました。
JPHPMailer にメソッドを追加(setHash)
「JPHPMailer」に連想配列でのセット用メソッドとして、以下のような関数を追加してみました。
※コードが冗長的なのはお許しください。
<?php /* * メール送信情報を連想配列でセット * * @param array $hash メール送信情報の連想配列 */ function setHash($hash){ foreach( $hash as $key => $val ){ switch ($key) { case "to": $add_list = explode(";", $val); foreach ($add_list as $address) { $this->addTo($address); } break; case "cc": $add_list = explode(";", $val); foreach ($add_list as $address) { $this->addCc($address); } break; case "bcc": $add_list = explode(";", $val); foreach ($add_list as $address) { $this->addBcc($address); } break; case "reply": $add_list = explode(";", $val); foreach ($add_list as &$address) { $this->addReplyTo($address); } break; case "subject": $this->setSubject($val); break; case "from": $this->setFrom($val); break; case "fromname": $this->setFromName($val); break; case "body": $this->setBody($val); break; case "bodyhtml": $this->setHtmlBody($val); break; case "bodyalt": $this->setAltBody($val); break; } } }
JPHPMailer + 連想配列 でのメール送信の実装
上記の「連想配列でのセット用メソッド(setHash)」使用した実装コードは以下のようになります。
※下記のサンプルでは「JPHPMailer」のファイルをコピーして「JPHPMailerHash」として使用しています。
<?php require_once("./jphpmailer/jphpmailer_hash.php"); //ライブラリ読み込み mb_language("japanese"); //言語(日本語) mb_internal_encoding("UTF-8"); //内部エンコーディング(UTF-8) $mail = new JPHPMailerHash(); //JPHPMailerHashのインスタンス生成 $mail->setHash( array( "to" => "hogehoge@example.com", //宛先 "cc" => "hogehoge@example.com", //CC "subject" => "メールの件名", //件名 "body" => "メールの本文です", //本文 "from" => "foobar@exsample.com", //From "fromname" => "ほげほげ 太郎" //From名 ) ); $mail->addAttachment($attachfile); //添付ファイル追加 if (!$mail->send()){ echo("Failed to send mail. Error:".$mail->getErrorMessage()); }else{ echo("Send mail OK."); }
今回参考にしたページ
Worx International Inc.
http://phpmailer.worxware.com/#
Package PHPMailer Element Index.
http://www.geocities.jp/toyprog/xoops_api/elementindex_PHPMailer.html
PHPで日本語メールを送る ? 応用編 (添付ファイル、HTMLメール) - EC studio 技術ブログ
http://techblog.ecstudio.jp/tech-tips/mail-japanese-advance.html
PHPのmbstringはyumでインストールできる - このブログは証明できない。
http://d.hatena.ne.jp/shunsuk/20090117/1232198265
文字コード変換コマンドnkfの使い方まとめ linux - Layer8 Reference
http://jp.layer8.sh/reference/entry/show/id/744