2019年 PHPのSMTP送信はインストール不要のPHPMailerが手軽で最短!PEAR終了

2019-07-07



<現役のメーラー「PHPMailer」ライブラリ>


以前、迷惑メールになりにくいということでPEARのSMTP送信の記事を書きましたが、
PEARはPHP7になってから非推奨になっている感があり、過去の産物といった感じ。

あと、SMTP送信で手軽だったのはPHPメーラーのライブラリ「Qdmail」。とにかく最軽量がウリ。
しかし、開発者の本業が忙しいということで、随分前に更新が止まっていたりして、新しい開発環境への対応は微妙です。

その点、PHPメーラーのライブラリ「PHPMailer」はまだまだ現役。今もなおアップデートされています。Wordpressもメール送信周りではPHPMailerを使用されています。
PHPMailer 公式サイト

<PHPMailerでSMTP送信ができたコードの紹介>


PHPMailerでSMTP送信ができたコードを残しておきます。

今回の設置環境は以下になります。
PHPのバージョンは5.2.17
PHPMailerのバージョンは5.2.2※

レンタルサーバーはさくらインターネット(大好きな鯖^_^)
SMTP送信はさくらインターネットで取得したメールアドレスで設定
メールクライアントはwindows7のwindows Live メール(文字化けに関係する)

※PHPMailerのバージョンは5.2系と6.0系ではコードが異なってきます。
今回は5.2系の紹介になります。

PHPMailerでSMTP送信の手順1「ダウンロード」


まずはPHPMailerのライブラリをダウンロードします。
Github-PHPMailer ダウンロード

5.2系のPHPMailerを探すのが面倒な方は、下記からダウンロードしてください。
PHPMailer ダウンロード(5.2.2最低限のファイルのみ)

※5.2以下のバージョンは2016年に脆弱性が発表され、WordPress利用者の間で問題となった経緯があります。

PHPMailerでSMTP送信の手順2「ライブラリ読み込み」


ライブラリを好きな場所に置いてください。
普通にrequireで一つのファイルを読み込むだけで使えます。ね?お手軽でしょ(^o^)
その後に文字コードに関する宣言をしておきます。
<?php
require "./libs/PHPMailer/class.phpmailer.php"; //ライブラリ読み込み※
date_default_timezone_set('Asia/Tokyo');
mb_language("ja");
mb_internal_encoding("ISO-2022-JP"); //内部エンコーディング(UTF-8など)
?>
※PHPMailer5.2系は読み込むファイルがバージョンによって違う場合があります。
「class.phpmailer.php」ではなく「PHPMailerAutoload.php」の場合も。

内部エンコーディングはUTF8での解説しているサイトが多いですが、UTF8が対応していないメールクライアントを使用している場合は「ISO-2022-JP」に設定します。

今回のメールクライアントは古めのwindows Live メールなので、UTF8だと文字化けしました。元々メールクライアントはISO-2022-JPが主流でした。一旦、このままコードをコピペして動作確認してみてください。文字化けした場合は文字コードを変更してください。

PHPMailerでSMTP送信の手順3「SMTPの設定」


<?php
$mailer = new PHPMailer();
$mailer->isSMTP(); //SMTP送信します宣言
//$mailer->SMTPSecure = 'ssl'; //Gmailの場合は必要
$mailer->Host = 'sample.sakura.ne.jp'; //メールサーバー
$mailer->Port = 587; //25 or 465
$mailer->SMTPAuth = true; //SMTP認証の有無
$mailer->Username = "xxxxx@sample.com"; //SMTP認証用のユーザーID(さくら鯖はIDがメアド)
$mailer->Password = "xxxxx"; //SMTP認証用のパスワード
$mailer->setFrom('xxxxx@sample.com', 'sample'); //送信用メールアドレス
$mailer->CharSet = 'ISO-2022-JP'; //文字化けした場合はUTF8に
?>
上記はさくらインターネットのメールサーバーでの設定です。
Host~setFromまでは各々の設定にしてください。

PHPMailerでSMTP送信の手順4「SMTP送信の実行」


<?php
$mailer->addAddress($mail); //送信先
$mailer->Subject = mb_convert_encoding($sub, "ISO-2022-JP","UTF-8"); //件名
$mailer->Body = mb_convert_encoding($body,"ISO-2022-JP","UTF-8"); //内容
$mailer->send(); //送信実行
?>
件名と内容はUTF8をISO-2022-JPに変換しています。ここも動作確認をして文字化けするようなら変更が必要です。

<PHPMailerでSMTP送信の動作確認済みコード>


<?php
$master_mail = 'xxxxx@sample.com'; //サイト運営元のメールアドレス
$sub = '運営元への件名';
$body = 'ユーザーがフォームで打ち込んだ内容';

$mail = 'xxxxx@xxx.xxx'; //POST受け取り(ユーザーのメールアドレス)
$sub2 = 'ユーザー向けの件名';
$body2 = 'ユーザー向けの内容';

//ライブラリ読み込み
require "./libs/PHPMailer/class.phpmailer.php";
date_default_timezone_set('Asia/Tokyo');
mb_language("ja");
mb_internal_encoding("ISO-2022-JP");

//メール設定
$mailer = new PHPMailer();
$mailer->isSMTP();
//$mailer->SMTPSecure = 'ssl';
$mailer->Host = 'sample.sakura.ne.jp';
$mailer->Port = 587;
$mailer->SMTPAuth = true;
$mailer->Username = "xxxxx@sample.com";
$mailer->Password = "xxxxx";
$mailer->setFrom('xxxxx@sample.com', 'sample');
$mailer->CharSet = 'ISO-2022-JP';

//運営に送信
$mailer->addAddress($master_mail);
$mailer->Subject = mb_convert_encoding($sub, "ISO-2022-JP","UTF-8");
$mailer->Body = mb_convert_encoding($body,"ISO-2022-JP","UTF-8");
$mailer->send();

//自動返信(ユーザーの打ち込んだメアドが正しいか判定してから送信)
if(preg_match('/^[a-zA-Z0-9_.!~*\'();\/?:\&=+\$,%#-]+@[A-Za-z0-9_.-]+\.[A-Za-z0-9]+$/',$mail)){
    $mailer->ClearAddresses(); //送信先をリセット
    $mailer->addAddress($mail);
    $mailer->Subject = mb_convert_encoding($sub2, "ISO-2022-JP","UTF-8");
    $mailer->Body = mb_convert_encoding($body2,"ISO-2022-JP","UTF-8");
    $mailer->send();
}
?>
自動返信メールのコードも記載しました。メールアドレスの書式チェックをしないと、エラーが起きる場合がありますので、フォームから入力されたメアドが正しいかどうかを正規表現チェックしてからSMTP送信しています。

自動返信のメールアドレスをaddAddressに追加する際、リセットをしないと2箇所にメールが飛んでしまったので、ClearAddressesでリセットしています。

これで無事に動作してくれることを祈ります。
環境によっては多少文字化けが起こるかと思いますが送信はできるかと思います。

今回はあくまで「PHPMailer5.2系」のコートです。
「6.0系」ははコードが異なってきますので、他のサイトをご覧ください。
【PHP】PHPMailerでメールを送信する際に、6.0系からお作法が変わっていてつまづいた話

カテゴリ: PHP

この記事がお役に立てましたら是非シェアのご協力お願いします。