inmotion PHPMailer の利用

2013年11月17日

XAMPP 及び inMotion ホスティングで PHPMailer を利用する場合のメモ。

参考サイト:Using phpMailer to Send Mail through PHP

XAMPP で PHPMailer を使う

「PHPMailer」は外部の SMTP サーバを利用(経由)してメールを送信するためのライブラリです。以下は「PHPMailer」を XAMPP で利用できるようにする方法です。まずは、「PHPMailer」をダウンロードします。

PHPMailer を上記ページの「Download ZIP」ボタンをクリックしてダウンロードして「C:\xampp\php」に解凍します。

phpmailer_download

ライブラリを読み込むため「C:\xampp\php\php.ini」を編集して、include_path にライブラリの PATH を追加します。

「include_path」という文字列を検索すると、以下のような部分が見つかります。

行頭にセミコロンが付いていたら、削除して有効にします。

; Windows: "\path1;\path2"
include_path=".;C:\xampp\php\PEAR"

include_path にライブラリの PATH を追加します。それぞれのパスはセミコロン「;」で区切られているので、以下のようになります。

include_path=".;C:\xampp\php\PEAR;C:\xampp\php\PHPMailer"

SSLを使って通信する必要があるため、php.ini を編集して「extension=php_openssl.dll」 を有効にします。

「php_openssl.dll」という文字列を検索すると、以下のような部分が見つかります。

extension=php_openssl.dll

行頭にセミコロンが付いていたら、削除して有効にします。そして Apache を再起動します。

変更された内容は、phpinofo() で確認することができます。

include_path

include_path には、require()、include()などの関数がファイルを探すディレクトリのリストをセミコロン「;」区切りで指定します。それにより、インクルードパスで指定されたディレクトリ内のファイルは、相対パスや絶対パスをつけずにファイル名だけで呼ぶことができます。

PHP マニュアルの「include 」に、「ファイルのインクルードは、指定されたパスから行います。パスを指定しない場合は、 include_path の設定を利用します。」という記述があります。

動作確認(メール送信テスト)

以下の PHP を記述して、適当な名前(例:phpmailer_test.php)で「C:\xampp\htdocs」に保存します。

このファイルをブラウザで開くとメールが送信され、問題なくメールが送信されると「Message has been sent」と表示されます。(このままでは、日本語を使用すると文字化けします)

<?php
require_once('PHPMailerAutoload.php');  //PHPMailer の読み込み
$mail = new PHPMailer;  //PHPMailer のインスタンスを生成

$mail->isSMTP();    // SMTP を使用
$mail->Host = 'smtp.gmail.com';  // SMTP サーバーを指定
$mail->SMTPAuth = true;         // SMTP authentication を有効に
$mail->Username = 'xxxxxxxx@gmail.com';   // SMTP ユーザ名
$mail->Password = 'password';   // SMTP パスワード
$mail->SMTPSecure = 'tls';   // TLS encryption を有効に
$mail->Port = 587;    // TCP ポートを指定

$mail->setFrom('xxxxxxxx@gmail.com', 'Mailer');    //差出人
$mail->addAddress('info@example.com', 'WDL');     // 受信アドレス
$mail->addReplyTo('xxxxxxxx@gmail.com', 'Information');    //返信用アドレス
$mail->addCC('test@example.com');    //Cc アドレス

//$mail->addAttachment('photo_01.jpg');  // 添付ファイルを追加
$mail->isHTML(true);   // HTML形式のメールに設定

$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}    

inMotion ホスティングで PHPMailer を使う

準備

PHPMailer を使って送信するための E-mail アカウントを用意する。

以下の例では次のような E-mail アカウントを作成しているものとする。
send_from_PHPMailer@bradm.inmotionhosting.com
パスワード: password

PHPMailer のダウンロード

以下のリンクから PHPMailer をダウンロードして解凍する。
PHPMailer_5.2.0.zip

解凍したフォルダをドキュメントルート(public_html)に配置する。
public_html/PHPMailer_5.2.0.

メールフォームの作成

以下の様なコンタクト用のフォームを作成。(非常に単純な例)

action 属性に PHP を記述(処理)するファイルを指定する。(この例では email.php)

contact_us.html

<form method="post" action="email.php">
  Email: <input name="email" id="email" type="text" /><br />

  Message:<br />
  <textarea name="message" id="message" rows="15" cols="40"></textarea><br />

  <input type="submit" value="Submit" />
</form>

フォームの送信ボタンがクリックされると、それらの情報は”email.php”に渡される。

email.php の作成(記述)

ダウンロードして解凍したフォルダの中に「README」というファイルがあり、その中に以下のような単純なサンプルコードが記述されている。

<?php
require("class.PHPMailer.php");

$mail = new PHPMailer();

$mail->IsSMTP();                                      // set mailer to use SMTP
$mail->Host = "smtp1.example.com;smtp2.example.com";  // specify main and backup server
$mail->SMTPAuth = true;     // turn on SMTP authentication
$mail->Username = "jswan";  // SMTP username
$mail->Password = "secret"; // SMTP password

$mail->From = "from@example.com";
$mail->FromName = "Mailer";
$mail->AddAddress("josh@example.net", "Josh Adams");
$mail->AddAddress("ellen@example.com");                  // name is optional
$mail->AddReplyTo("info@example.com", "Information");

$mail->WordWrap = 50;                                 // set word wrap to 50 characters
$mail->AddAttachment("/var/tmp/file.tar.gz");         // add attachments
$mail->AddAttachment("/tmp/image.jpg", "new.jpg");    // optional name
$mail->IsHTML(true);                                  // set email format to HTML

$mail->Subject = "Here is the subject";
$mail->Body    = "This is the HTML message body <b>in bold!</b>";
$mail->AltBody = "This is the body in plain text for non-HTML mail clients";

if(!$mail->Send())
{
   echo "Message could not be sent. <p>";
   echo "Mailer Error: " . $mail->ErrorInfo;
   exit;
}

echo "Message has been sent";
?>

上記のサンプルを最初に作成したコンタクトフォーム(contact_us.html)で使えるようにしたものは以下のとおり。(日本語未対応)

email.php

<?php

// $email と $message はコンタクトフォームから渡された値
$email = $_REQUEST&#91;'email'&#93; ;
$message = $_REQUEST&#91;'message'&#93; ;

// 解凍した PHPMailer 内の class.phpmailer.php へのパス
// public_html/PHPMailer_5.2.0
require("/home/xxxx/public_html/PHPMailer_5.2.0/class.phpmailer.php");

$mail = new PHPMailer();

// set mailer to use SMTP
$mail->IsSMTP();

// このスクリプトはメールサーバーと同じサーバー上にあるので localhost を指定
$mail->Host = "localhost";  // specify main and backup server

$mail->SMTPAuth = true;     // turn on SMTP authentication

// PHPMailerを使ってメールを送信する場合、有効なメールアドレスから送信する必要がある。
// この例では以下のアカウントを使用(自分で使用するアドレスとパスワードに変更)
// email: send_from_PHPMailer@bradm.inmotiontesting.com
// pass: password
$mail->Username = "send_from_PHPMailer@bradm.inmotiontesting.com";  // SMTP username
$mail->Password = "password"; // SMTP password

// $email はコンタクトフォームに入力された値(メールアドレス)で冒頭で以下のように変数に格納済み
// $email = $_REQUEST['email'] ;
$mail->From = $email;

// メールの送信先アドレスを指定
$mail->AddAddress("bradm@inmotiontesting.com", "Brad Markle");

// set word wrap to 50 characters
$mail->WordWrap = 50;
// set email format to HTML(メール形式をHTMLに)
$mail->IsHTML(true);

$mail->Subject = "You have received feedback from your website!";

// $message はコンタクトフォームに入力された値(本文)で冒頭で以下のように変数に格納済み
// $message = $_REQUEST['message'] ;
$mail->Body    = $message;
$mail->AltBody = $message;

if(!$mail->Send())
{
   echo "Message could not be sent. <p>";
   echo "Mailer Error: " . $mail->ErrorInfo;
   exit;
}

echo "Message has been sent";
?>

以下は日本語が使えるようにした場合のスクリプト。また、上記とは以下の様な点が異なる。

コンタクトフォームではセッション変数を利用していて、名前($_SESSION[‘name’])と件名($_SESSION[‘subject’])も取得しているものとする。

本文は $_SESSION[‘body’] で取得。

送信アドレスやパスワード等は別ファイル(phpmailvars.php)に記述し、安全な場所に配置して require_once で読みこむようにしている。

<?php
  session_start();    //セッションを開始
  require_once('/home/xxx/etc/web_test/var/phpmailvars.php'); //パスワード等を定義
  ・・・省略・・・
  //変数にセッション変数を代入
  $name = $_SESSION&#91;'name'&#93;;
  $email = $_SESSION&#91;'email'&#93;;
  $subject = $_SESSION&#91;'subject'&#93;;
  $body = $_SESSION&#91;'body'&#93;;
  
  //mbstringの日本語設定
  mb_language("japanese");
  mb_internal_encoding("UTF-8");
 
  // When we unzipped PHPMailer, it unzipped to
  // public_html/PHPMailer_5.2.0
  require("/home/xxxx/public_html/PHPMailer_5.2.0/class.phpmailer.php");
 
  $mail = new PHPMailer();
   
  // set mailer to use SMTP
  $mail->IsSMTP();
  $mail->Host = MAIL_HOST;  // specify main and backup server(phpmailvars.phpで定義)
  $mail->SMTPAuth = true;     // turn on SMTP authentication
   
  $mail->Username = MAIL_USER;  // SMTP username (phpmailvars.phpで定義)
  $mail->FromName = mb_encode_mimeheader($name); (MIMEヘッダの文字列をエンコード)
  $mail->Password = MAIL_PASSWORD; // SMTP password(phpmailvars.phpで定義)
   
  // $email is the user's email address
  // 送信するアカウントと異なるアドレスを指定するとスパム判定される可能性が高くなる
  // フォームで入力したユーザーではなくアカウントを指定するほうが安全?(運用方法次第か?)
  $mail->From = $email;
   
  //メールの宛先
  $mail->AddAddress(SEND_TO, "宛先の名前"); //(phpmailvars.phpで定義)
   
  // set word wrap to 50 characters
  $mail->WordWrap = 50;
  // set email format to HTML
  $mail->IsHTML(true);
   
  $mail->Subject = mb_encode_mimeheader($subject); (MIMEヘッダの文字列をエンコード)
  
  //日本語用
  $mail->CharSet = "iso-2022-jp";
  $mail->Encoding = "7bit";
  $mail->Body  = mb_convert_encoding($body,"JIS","UTF-8");
  $mail->AltBody = mb_convert_encoding($body,"JIS","UTF-8");

  
  //メール送信の結果判定
  if($mail->Send()) {
    $message = 'ありがとうございます。送信完了いたしました。';
    //成功した場合はセッションを破棄
    $_SESSION = array();   //空の配列を代入し、すべてのセッション変数を消去 
    session_destroy();   //セッションを破棄
  }else{
    $message = '申し訳ございませんが、送信に失敗しました。';
  }

phpmailvars.php

<?php
define('MAIL_HOST', 'localhost');
define('MAIL_USER', 'send_from_phpMailer@xxxx.com');
define('MAIL_PASSWORD', 'xxxxxxxx');
define('SEND_TO', 'xxxx@gmail.com');
?>