PHPMailerを日本語で便利につかう「NPHPMailer」作ってみた
2017/02/01
こんにちは、okutani(@okutani_t)です。PHPでメール機能を実装するとき、『PHPMailer』を使うと便利ですね。WordPress, Drupalなどにも使われている実績のあるライブラリです。
このPHPMailerを仕事で使う機会があったのですが、デフォルトで日本語に対応していなかったので『NPHPMailer』というラッパークラスを作ってみました。Nは日本語のNです(安直)。ご自由に使ってやってください。
もともと『JPHPMailer』というラッパークラスがあり有名らしいのですが、そっちは使ったことはないです。気になる方は調べてみてください。
NPHPMailerは下記GitHubで公開しています。
また、導入にはComposerを利用する必要があります。Composerについて詳しく知りたい方は以下の過去記事を参考にしてください。
では、NPHPMailerの導入方法から使い方までを解説していきます。
※追記: 導入方法をComposerでできるようにリファクタリングしました。それに合わせて記事も改変しています[2017/01/31]
スポンサーリンク
もくじ
NPHPMailerの導入方法
まずは、NPHPMailerの導入方法について説明していきます。
利用したいプロジェクトに「composer.json」を、以下の内容で作成します。
{
"require": {
"okutani-t/nphpmailer": "~1.0"
}
}
上記ではNPHPMailerのみを記述していますが、最新版のPHPMailerが同時にインストールされます。
以下のコマンドでインストールを実行。
$ composer install
vendor以下にPHPMailer, NPHPMailerが設置されました。
あとは利用したいプロジェクトでvendor/autoload.phpを呼べばOKです。
<?php
require __DIR__ . "/vendor/autoload.php";
これでNPHPMailerを使う準備が整いました。
NPHPMailerの使い方
NPHPMailerの使い方を説明します。
メール送信をおこないたい場所で、次のように利用します。
<?php
require __DIR__ . "/vendor/autoload.php";
use OkutaniT\NPHPMailer;
NPHPMailer::_()
#->setSMTP(ホスト, ユーザー, パスワード) // サーバーで設定していたら不要
->setFrom(差出人)
->addAddress(宛先)
->setSubject(件名)
->setBody(内容)
->send();
NPHPMailerを読み込み、『_()』メソッドでインスタンスを生成しています。
それ以降のメソッドは、ほぼほぼPHPMailerの仕様ままです。
サーバーでSMTPの設定をしていたら「setSMTP()」は不要です。HTMLメールを使いたい場合は「isHTML(true)」を途中で挟んでください。
チェーンメソッドを使うことで簡潔に利用できるようにしてみました。すっきり。
実例として、「相手(自動返信用)と自分(確認用)へメール送信をおこなう」流れを一通り紹介しておきます。POSTで相手の名前とメールアドレスが渡されたと仮定しています。
$from = "from@example.com";
$to = [
"myaddress@example.com"
];
$reply = $_POST["email"];
$mySubject = "お問い合わせがありました";
$myBody = "名前: " . $_POST["name"] . "\n" .
"メールアドレス: " . $_POST["email"];
$toSubject = "[自動返信]お問い合わせありがとうございます";
$toBody = "以下の内容でメールを送信しました。\n\n" .
"名前: " . $_POST["name"] . "\n" .
"メールアドレス: " . $_POST["email"] . "\n" .
"今後ともよろしくお願いいたします。";
// 自分宛
NPHPMailer::_()
->setSMTP("smtp.gmail.com", "〇〇@gmail.com", "Gmailのパスワード") # gmailの場合
->setFrom($from)
->addAddress($to)
->setSubject($mySubject)
->setBody($myBody)
->send();
// 相手宛(自動返信用)
NPHPMailer::_()
->setSMTP("smtp.gmail.com", "〇〇@gmail.com", "Gmailのパスワード")
->setFrom($from)
->addAddress($reply)
->setSubject($toSubject)
->setBody($toBody)
->send();
差出人、宛先、HTMLはオフに、件名とメール本文の内容を設定してメール送信を実行しています。これを単純に、相手と自分宛に送信実行しています。
「addAddress()」の送信先の情報は、文字列と配列両方とれるようにしてあります。
GmailのSMTPを使う場合
もし、GmailのSMPTを使いたい場合は、「setSMTP()」を次のように設定してください。
->setSMTP("smtp.gmail.com", "〇〇@gmail.com", "Gmailのパスワード")
GmailのSMTPを使う場合、差出人が「〇〇@gmail(利用しているGmailのアカウント)」になるのと、「安全性の低いアプリ – アカウント設定」でアクセスをオンにしておく必要がある点に注意してください。
では次に、NPHPMailerの中身をかんたんに解説していきます。
NPHPMailerの中身解説
NPHPMailerの中身は次のとおりです(冒頭のGitHubからも確認できます)。
<?php
/**
* PHPMailerを日本語用に拡張するラッパークラス
*
* @author okutani
* @package NPHPMailer
*/
namespace OkutaniT;
use PHPMailer;
class NPHPMailer extends PHPMailer
{
function __construct()
{
parent::__construct();
// HTMLメールは初期値false
parent::isHTML(false);
// タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');
// 文字エンコーディングの設定
$this->CharSet = "UTF-8"; // 文字セット(デフォルトは'ISO-8859-1')
$this->Encoding = "base64"; // エンコーディング(デフォルトは'8bit')
}
/**
* 自身のインスタンスを生成
*
* @access public
* @return object new self
*/
public static function _()
{
return new self;
}
/**
* SMTP情報のセッター
*
* @access public
* @param string $host SMTPのホスト名 Gmail->'smtp.gmail.com'
* @param string $usrName ユーザー名 Gmail->'〇〇@gmail.com'
* @param string $pass パスワード
* @param string $type 通信方法 ssl|tls
* @param int $port ポート番号
* @return object $this
*/
public function setSMTP($host, $usrName, $pass, $type = 'tls', $port = 587)
{
$this->isSMTP();
//$this->SMTPDebug = 2;
$this->SMTPAuth = true;
$this->Host = $host;
$this->Username = $usrName;
$this->Password = $pass;
$this->SMTPSecure = $type;
$this->Port = $port;
return $this;
}
/**
* 差出人のセッター
*
* @access public
* @param string $from
* @param string $name
* @param bool $auto
* @return object $this
*/
public function setFrom($from, $name = "", $auto = true)
{
parent::setFrom($from, $name, $auto);
return $this;
}
/**
* 送信先アドレスのセッター
*
* @access public
* @param string|array $to
* @param string $name
* @return object $this
*/
public function addAddress($to, $name = "")
{
// 配列なら$nameを無視してforeachでセット
// 2次元配列の場合も考えられるのでdistributeAddress()で振り分けている
if (is_array($to)) {
foreach ($to as $type => $address) {
$this->distributeAddress($type, $address);
}
} else {
parent::addAddress($to, $name);
}
return $this;
}
/**
* 返信先のセッター
*
* @access public
* @param string $reply
* @param string $name
* @return object $this
*/
public function addReplyTo($reply, $name = "")
{
parent::addReplyTo($reply, $name);
return $this;
}
/**
* CCのセッター
*
* @access public
* @param string $cc
* @param string $name
* @return object $this
*/
public function addCC($cc, $name = "")
{
parent::addCC($cc, $name = "");
return $this;
}
/**
* BCCのセッター
*
* @access public
* @param string $cc
* @param string $name
* @return object $this
*/
public function addBCC($bcc, $name = "")
{
parent::addBCC($bcc, $name = "");
return $this;
}
/**
* ファイルの添付
*
* @access public
* @param string $path
* @param string $name
* @param string $encoding File encoding
* @param string $type File extension (MIME) type.
* @param string $disposition Disposition to use
* @return object $this
*/
public function addAttachment($path, $name = "", $encoding = "base64", $type = "", $disposition = "attachment")
{
parent::addAttachment($path, $name, $encoding, $type, $disposition);
return $this;
}
/**
* HTMLメールにするかどうか
*
* @access public
* @param bool $isHTML
* @return object $this
*/
public function isHTML($isHTML=true)
{
parent::isHTML($isHTML);
return $this;
}
/**
* 件名のセッター
*
* @access public
* @param string $subject
* @return object $this
*/
public function setSubject($subject="")
{
$this->Subject = $subject;
return $this;
}
/**
* 本文のセッター(HTML)
*
* @access public
* @param string $body
* @return object $this
*/
public function setBody($body="")
{
$this->Body = $body;
return $this;
}
/**
* 本文のセッター(non-HTML)
*
* @access public
* @param string $body
* @return object $this
*/
public function setAltBody($body="")
{
$this->AltBody = $body;
return $this;
}
/**
* 文字コードのセッター
*
* @access public
* @param string $charset
* @return object $this
*/
public function setCharSet($charset = "UTF-8")
{
$this->CharSet = $charset;
return $this;
}
/**
* エンコードのセッター
*
* @access public
* @param string $charset
* @return object $this
*/
public function setEncoding($encoding = "base64")
{
$this->Encoding = $encoding;
return $this;
}
/**
* SMTPデバッグモード
*
* @access public
* @param bool|int $smtpdebug
* @return object $this
*/
public function setSMTPDebug($smtpdebug = false)
{
$this->SMTPDebug = $smtpdebug;
return $this;
}
/**
* 送信
*
* 注:) 送信だけチェーンメソッドの最後に記述する
* @access public
*/
public function send()
{
if (!parent::send()) {
trigger_error('Mailer Error: ' . $this->ErrorInfo, E_USER_NOTICE);
}
}
/**
* 連想配列で渡されたキー(to, cc, bcc)を振り分けるメソッド
*
* @param int|string $type
* @param string $address
*/
private function distributeAddress($type, $address)
{
if (is_array($address)) {
foreach ($address as $value) {
if ($type === 'to') {
parent::addAddress($value);
} elseif ($type === 'cc') {
parent::addCC($value);
} elseif ($type === 'bcc') {
parent::addBCC($value);
}
}
} else {
parent::addAddress($address);
}
}
}
最初の呼び出しで日本語を使えるように設定、それ以降はPHPMailerのメソッドをそれぞれラップしているだけです。
見て分かるとおり、さきほど紹介した実例以外で使えるメソッドが複数あります。これらはPHPMailerの仕様にそって利用してください。
基本的にチェーンメソッドで繋いで書けば動作します。
PHPもGitHubも勉強中なので意見ください!
もし、「ここはこうした方がよくない?」とか「こんなバグあるから直して」などの意見がある方は、okutaniのGitHubもしくはTwitter(@okutani_t)までご連絡ください。
特に、GitHubは最近使い始めてよくわかってないので、issueやPull requestなどあればお願いします(僕が対応に手間取ったらごめんなさい)。
PHPでメール機能を実装したい方の参考になれば幸いです。それでは。
参考【脱・日本語JIS】PHPMailerで日本語メールをUTF-8のまま送信する | BLOGRAM
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク