hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

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