PHPMailerの使い方

PHPMailerの使い方

  • 2017-05-28  最終更新日:2017-06-03

今回はあらゆるところで使われている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->setFromMAIL_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∞

phpmailer php メール
  • このエントリーをはてなブックマークに追加
  • follow us in feedly

サイト内検索

最近の投稿

アイキャッチ
そろそろvuejs始める

最近はjQueryよりvueで書いた方が楽ではないかと思い学習中です。 そもそもVuejsはドキュメントが日本語対応なので試しやすいし情報も豊富なので学習しやすいです。 3大フレームワークと呼...

02 May 2021

アイキャッチ
追い風CSS(tailwindcss)が結局楽かも

最初にtailwindcssのv1が出た頃はまだbootstrapで良いかな。 htmlに入れるクラスタグが多過ぎと思っていました。あまり良い印象はなかったです。 時は過ぎいろいろと触っていると...

29 Apr 2021

アイキャッチ
エラー処理について

COJPドメンを取得する際に「登記年月日」という項目があります。 その項目通り登記した年月日を入れる訳ですが、なぜかエラーが出ました。 半角英数字にして下さいというよくあるエラーです。当然半角英...

24 Jan 2021

アイキャッチ
javascriptのundefinedの判定

jqueryで高さの数値をとって足し算をしていたらエラーも出ずに動かないということになったので調べてみました。 ワードプレスで管理画面のアドミンバーが一度ログインするとフロント画面でも表示される...

17 Jan 2021

アイキャッチ
Webpack5にアップデートしてエラーの対処方法2つ

webpack4(4.41.5)から webpack5(5.12.1)にあげました。 特に難しい設定は行っておらず主にscssと共通モジュールの設定だけで使っているのですがそれでもエラーが出たの...

09 Jan 2021

著者

ウェブエンジニアの須山のブログです。

WEBに関することや個人的に関心のあることについて書きます。主に技術系ブログです。

タグクラウド

phpmailer php メール
フッターイメージ