hogehoge foobar Blog Style Beta

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

PHPMailer と JPHPMailer で SMTP サーバーからのメール送信

前回の続きとして、「PHPMailer」と「JPHPMailer」を使って SMTP サーバー経由でメールを送信するのをやってみました。

「PHPMailer」と「JPHPMailer」のインストールやローカルMTA(Sendmail/Postfix)等を使用した基本的なメール送信については、前回のエントリをご確認ください。

PHPMailer でのSMTP経由のメール送信

「PHPMailer」で SMTP 経由でメール送信するサンプルコードは以下のようになります。

<?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 = "ほげほげ 太郎";      //差し出し人名

$mail = new PHPMailer();           //PHPMailerのインスタンス生成
$mail->CharSet = "iso-2022-jp";    //文字コード設定
$mail->Encoding = "7bit";          //エンコーディング

$mail->IsSMTP();                        //「SMTPサーバーを使うよ」設定
$mail->SMTPAuth = TRUE;                 //「SMTP認証を使うよ」設定
$mail->Host = 'smtp-server-name:25';    // SMTPサーバーアドレス:ポート番号
$mail->Username = 'smtp-username';      // SMTP認証用のユーザーID
$mail->Password = 'smtp-userpassword';  // SMTP認証用のパスワード

$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)をセット

//メールを送信
if (!$mail->Send()){
    echo("Failed to send mail. Error:".$mail->ErrorInfo);
}else{
    echo("Send mail OK.");
}

上記のコードで言うと、下記の部分が SMTP 認証の設定になりますので、この部分については環境に合わせて変更してください。

<?php
$mail->IsSMTP();                        //「SMTPサーバーを使うよ」設定
$mail->SMTPAuth = TRUE;                 //「SMTP認証を使うよ」設定
$mail->Host = 'smtp-server-name:25';    // SMTPサーバーアドレス:ポート番号
$mail->Username = 'smtp-username';      // SMTP認証用のユーザーID
$mail->Password = 'smtp-userpassword';  // SMTP認証用のパスワード

JPHPMailer でのSMTP経由のメール送信(メソッド追加してみました)

「JPHPMailer」は「PHPMailer」のラッパークラスなので、基本的にさっきと同じように実装すればメール送信が可能です。

ただ、なんとなく「$mail->IsSMTP();」や「$mail->SMTPAuth = TRUE;」を毎回設定するのが面倒なので、SMTP 認証情報セット用のメソッドを追加してみました。

JPHPMailer に SMTP 認証情報セット用メソッドを追加

追加したメソッドは以下の2つになります。

  • setSmtpAuth -> SMTP認証情報を引数で受け取ってセットするメソッド
  • setSmtpAuthHash -> SMTP認証情報を連想配列で受け取ってセットするメソッド(内部でsetSmtpAuthを呼び出し)

上記の2つのメソッドを「jphpmailer.php」に追加します。
メソッドのコードは以下のとおりになります。

<?php
/**
 * SMTP認証のセット
 *
 * @param string $user     SMTPアカウントのユーザーID
 * @param string $password SMTPアカウントのパスワード
 * @param string $host     SMTPサーバーのアドレス
 * @param string $port     SMTPサーバーのポート番号
 */
function setSmtpAuth($user, $password, $host, $port)
{
    $this->IsSMTP();
    $this->SMTPAuth = TRUE;
    $this->Host = $host . ':' . $port;
    $this->Username = $user;
    $this->Password = $password;
}

/**
 * SMTP認証のセット(連想配列版)
 *
 * @param array $hash     SMTP認証情報の連想配列
 */
function setSmtpAuthHash($hash)
{
    $this->setSmtpAuth(
        $hash["user"],
        $hash["password"],
        $hash["host"],
        $hash["port"]
    );
}
追加したメソッドを使ってみる

実際に今回追加してみたメソッドを使って、「JPHPMailer」からSMTP 経由でのメール送信をしてみます。
実装のコードは以下のようになります。

<?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 = "ほげほげ 太郎";      //差し出し人名

$mail = new JPHPMailer();          //JPHPMailerのインスタンス生成

$mail->setSmtpAuthHash( array(
    "user" => "smtp-username",           // SMTP認証用のユーザーID
    "password" => "smtp-userpassword",   // SMTP認証用のパスワード
    "host" => "smtp-server-name",        // SMTPサーバーのアドレス
    "port" => "25" )                     // SMTPサーバーのポート番号
);

$mail->addTo($to);                 //宛先(To)をセット
$mail->setFrom($from,$fromname);   //差出人(From/From名)をセット
$mail->setSubject($subject);       //件名(Subject)をセット
$mail->setBody($body);             //本文(Body)をセット

//メールを送信
if (!$mail->Send()){
    echo("Failed to send mail. Error:".$mail->ErrorInfo);
}else{
    echo("Send mail OK.");
}

「$mail->IsSMTP();」と「$mail->SMTPAuth = TRUE;」が無いので、少しだけすっきりしたコードに見えます(たぶん)。

今回参考にしたページ

PHPで日本語メールを送る ? 応用編 (添付ファイル、HTMLメール) - EC studio 技術ブログ
http://techblog.ecstudio.jp/tech-tips/mail-japanese-advance.html

PHPMailerでGmailSMTPを利用する - memo.xight.org
http://memo.xight.org/2009-05-24-2