PHPMailerの使い方

May 28, 2017

PHPMailerの使い方

2017-05-28 最終更新日:2017-06-03
phpmailer php メール

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

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

最近の投稿

アイキャッチ
ドメインオーソリティの使い道

ドメインオーソリティーとは一言で言えばドメインの価値を数値化したモノです。ドメインに関するものなので中身については全く意味をなさないと思います。ドメインオーソリティーの数値が低いから低品質なコン...

17 Jun 2017

アイキャッチ
個人情報を一切収集しない検索エンジンDuckDuckGoとは?

ネット検索と言えば、日本ならGoogleやYahoo Japan!(検索エンジンはGoogle)経由が多いですね。Bingは少数派といったところでしょうか。 DuckDuckGoという検索エン...

10 Jun 2017

アイキャッチ
ブートストラップバリデータ使い方 - Validator - for Bootstrap 3

今回はフォームバリデータのご紹介です。前回のPHPMailerと関連がありますが、フロントエンドでのバリデートができます。 CSSのフレームワークBootstrap3をお使いの方ならすんなりと...

03 Jun 2017

アイキャッチ
PHPMailerの使い方

今回はあらゆるところで使われているPHP用のメール送信ライブラリphpmailerの使い方を紹介します。 脆弱性がPHPMailer5.2.18より下のバージョンで発生するので新しいバージョン...

28 May 2017

アイキャッチ
画像加工・写真編集が簡単にできるアプリfotorのご紹介

今回は画像加工や編集ができるfotorのご紹介です。アプリの方が有名ですが、実はサイトからも使えるというのはご存じだったでしょうか?公式サイトはコチラ⇒画像加工・写真編集|Fotor - 無料オ...

20 May 2017

著者

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

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

タグクラウド

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