今回はあらゆるところで使われているPHP用のメール送信ライブラリphpmailerの使い方を紹介します。
脆弱性がPHPMailer5.2.18より下のバージョンで発生するので新しいバージョンをお使い下さい。現在の2017年6月現在のバージョンは5.2.23です。
とても簡単にメールを扱えるライブラリーになります。phpでもmail関数が使えるので簡単にメール送信は実装できるのですが、添付ファイルやらHTMLメールなど付加機能をつかるととたんに難しくなるので一括できるこのアプリケーションで実装していきましょう。
因みに当社のフォームはPHP用の強力なコンポーネントベースのメールライブラリ - Swiftmailerを使っております。
PHPMailerはPHP用の完全な機能を備えたメール作成および転送クラスです。 まずはcomposerでインストールしてしまいましょう。紹介しているサイトではダウンロードして必要なファイルを入れるという風に書かれている方がいらっしゃいますが最近はcomposerで管理されている方も多いですのでさくっとこれで入れましょう。composerはあらかじめインストールはしておきましょう
Macの場合だとターミナルで以下でダウンロードして2行目でpathの通った場所へ移動させるということをしています。windowsでもダウンロードまでは同じですがパスを通す方法が違います。
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
PHPMailerをダウンロードします。するとvendor/phpmailerというフォルダの中に入ってきます。
composer require phpmailer/phpmailer
設定情報用のsetting.phpに必要な情報を記載します。
setting.php
<?php
// メール情報
// 一応仮で入れてありますが適宜変えて下さい。
// メールホスト名
define('MAIL_HOST','its-mail.sakura.ne.jp');
// メールユーザー名・アカウント名
define('MAIL_USERNAME','contact@its-office.jp');
// メールパスワード
define('MAIL_PASSWORD','**************');
// SMTPプロトコル(sslまたはtls)
define('MAIL_ENCRPT','tls');
// 送信ポート(ssl:465, tls:587)
define('SMTP_PORT', 587);
// メールアドレス
define('MAIL_FROM','contact@its-office.jp');
// 表示名
define('MAIL_FROM_NAME','アイティーエス');
// メールタイトル
define('MAIL_SUBJECT','お問い合わせいただきありがとうございます');
setting.phpは設定で使う箇所になります。適宜変更してお使い下さい。
mail.php
<?php
require 'vendor/autoload.php';
require 'setting.php';
// PHPMailerのインスタンス生成
$mail = new PHPMailer();
$mail->isSMTP(); // SMTPを使うようにメーラーを設定する
$mail->SMTPAuth = true;
$mail->Host = MAIL_HOST; // メインのSMTPサーバーを指定する
$mail->Username = MAIL_USERNAME; // SMTPユーザー名
$mail->Password = MAIL_PASSWORD; // SMTPパスワード
$mail->SMTPSecure = MAIL_ENCRPT; // TLS暗号化を有効にし、 「SSL」も受け入れます
$mail->Port = SMTP_PORT; // 接続するTCPポート
// メール内容設定
$mail->CharSet = "UTF-8";
$mail->Encoding = "base64";
$mail->setFrom(MAIL_FROM,MAIL_FROM_NAME);
$mail->addAddress('joe@example.net', 'Joe User'); //受信者を追加する
$mail->addReplyTo('info@example.com ','Information');
$mail->addCC('cc@example.com'); // CCで追加
$mail->addBcc('bcc@example.com'); // BCCで追加
$mail->Subject = MAIL_SUBJECT; // メールタイトル
$mail->isHTML(true); // HTMLフォーマットの場合はコチラを設定します
$body = 'メールの中身';
$mail->Body = $body; // メール本文
// メール送信の実行
if(!$mail->send()) {
echo 'メッセージは送られませんでした!';
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo '送信完了!';
}
メールの設定部分です。1行目はcomposerに入れているライブラリを呼び出すものなので必須です。 2行目は上記のsetting.phpを呼び込みます。
あとは必要に応じて記載します。基本これだけでメールが送信できます。
PHPMailerのサンプルにあった例なんですが日本語にしました。簡単なフォームです。ちょっと変えてあります。 ⇒contactform.phps
<?php
/**
* この例は、簡単なフォームを処理する方法を示しています。
*/
session_start();
session_regenerate_id(true);
$msg = '';
//フォームの送信を処理しない限り、これを実行しないでください
if (isset($_POST['submit']) && validate()) {
checkToken();
$name = trim(rm(esc($_POST['name'])));
$email = trim(rm(esc($_POST['email'])));
$message = trim(esc($_POST['message']));
date_default_timezone_set('Asia/Tokyo');
mb_internal_encoding('UTF-8');
require 'vendor/autoload.php';
require 'setting.php';
//新しいPHPMailerインスタンスを作成する
$mail = new PHPMailer();
// SMTPを使用するようにPHPMailerに指示する - メールサーバが必要
// mail関数を使うよりも速くて安全です
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->Host = MAIL_HOST;
$mail->Username = MAIL_USERNAME;
$mail->Password = MAIL_PASSWORD;
$mail->SMTPSecure = MAIL_ENCRPT;
$mail->Port = SMTP_PORT;
// メール内容設定
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';
$mail->From = MAIL_FROM;
//自分のドメイン内の固定アドレスを送信元アドレスとして使用する
// **ここでは送信者のアドレスを偽造するために使用しないでください**
// メッセージがSPFチェックに失敗します
$mail->setFrom( MAIL_FROM, MAIL_FROM_NAME );
// お客さん宛に控えメール
$mail->addAddress( $email, $name );
// BCC宛てに自分のアドレスを設定
$mail->AddBcc(MAIL_FROM);
// reply-toヘッダーに送信者のアドレスを入れる
// 指定されたアドレスが無効な場合、これは失敗します。
// この場合、リクエスト全体を無視する必要があります
if ($mail->addReplyTo($email, $name)) {
$mail->Subject = mb_encode_mimeheader(MAIL_SUBJECT, 'ISO-2022-JP');
//HTMLを使用しないでください
$mail->isHTML(false);
//簡単なメッセージ本文を作成する
$mail->Body = <<<EOT
お問い合わせありがとうございます。
お名前: {$name}
Email: {$email}
メッセージ: {$message}
EOT;
//エラーをチェックしてエラーがなければメッセージ送信
if (!$mail->send()) {
// 送信に失敗した理由は、$mail->ErrorInfoで出力
// ユーザーにエラーを表示しないでください - エラーを処理し、サーバーにログオンします。
$msg = '申し訳ありませんが、何かが間違っていました。 後でもう一度お試しください。';
} else {
$msg = 'メッセージが送信されました! お問い合わせいただきありがとうございます。';
}
} else {
$msg = '無効なメールアドレスです。メッセージは無視されます。';
}
} else{
setToken();
}
// ワンタイムトークン発行
function setToken() {
$token = rtrim(base64_encode(openssl_random_pseudo_bytes(32)),'=');
$_SESSION['token'] = $token;
}
// チェックトークン
function checkToken() {
if (empty($_SESSION['token']) || ($_SESSION['token'] !== $_POST['token'])) {
echo "不正なPOSTが行われました!";
exit;
}
}
// バリテーション
function validate() {
// 名前とメッセージが空の場合
if(empty($_POST['name']) && empty($_POST['message'])) {
return false;
}
// メールアドレスの形式が正しくない場合
if (false === filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
return false;
}
return true;
}
// 改行を消す(メールヘッダ・インジェクション対策);
function rm($str) {
if(isset($str)) {
str_replace(array("\r\n", "\r", "\n"), '', $str);
}
return $str;
}
// エスケープ処理
function esc($value, $enc = 'UTF-8') {
if (is_array($value)) {
return array_map('escape', $value);
}
return htmlspecialchars($value, ENT_QUOTES, $enc);
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>お問い合わせフォーム</title>
</head>
<body>
<h1>お問い合わせ</h1>
<?php if (!empty($msg)) {
echo "<h2>$msg</h2>";
} ?>
<form action="" method="POST">
<label for="name">お名前: <input type="text" name="name" id="name" value=""></label><br>
<label for="email">Email: <input type="email" name="email" id="email" value=""></label><br>
<label for="message">メッセージ: <textarea name="message" id="message" rows="8" cols="20"></textarea></label><br>
<input type="submit" value="Send" name="submit">
<input type="hidden" name="token" id="token" value="<?php echo esc($_SESSION['token']);?>">
</form>
</body>
</html>
上記コンタクトフォームサンプルです。そのまま使えますが、カスタマイズ用、動作確認用としてお使い下さい。
参考になれば幸いです。
∞Tadashi Suyama∞
あまりcgiは使いたくないのですが使わざるを得ない時があります。仕方なく設置するのですがエラーが出ちゃうんです。なんか知らないけど。 ありがちなのがパーミッションとかパスが問題になるんのですけど...
19 Feb 2022
今回はワードプレス専用のアドレス変更方法をご紹介します。ワードプレスのアドレスはwordpress@~という形で送られてきますが変更可能です。 functions.phpに記載するのですがプラグ...
12 Feb 2022
Sassの遷移は多すぎる今日この頃 Ruby Sass→LibSass→DartSass(いまここ) Ruby SassはSassの最初の実装でしたが、2019年3月26日にサポートが終了しま...
22 Jan 2022
明けましておめでとうございます。 本年も何卒よろしくお願いいたします。 年末年始は雪でしたね、そこまで積もっていませんが。 {% include adsensearticle.html...
10 Jan 2022
最近はjQueryよりvueで書いた方が楽ではないかと思い学習中です。 そもそもVuejsはドキュメントが日本語対応なので試しやすいし情報も豊富なので学習しやすいです。 3大フレームワークと呼...
02 May 2021
ウェブエンジニアの須山のブログです。
WEBに関することや個人的に関心のあることについて書きます。主に技術系ブログです。