bonsai's blog

ITベンチャー所属。Webエンジニア兼マーケッターです。python習得しようと頑張ってるごく一般的なサラリーマン。※ブログ初心者の為、至らぬ所は..m(_ _)m

PHPMailerでのメールフォーム実装外部メールサーバーでの対応も可

外部メールサーバー使ってのメールフォーム実装

Office 365のSMTP経由での実装が必要となりmb_send_mail関数が使えなかった為、PHPMailerを使用し実装しました。

composerを使わずにPHPMailerを設置

composerの環境がなく、使わずにセットアップする人のために
※公式ではcomposerでのインストールが推奨されています

  1. 公式よりzipファイルをダウンロード
    公式サイトはこちら

  2. ファイルを設置 zipファイルを解凍し、以下のファイルを設置する。
    src/. ※ディレクトリ配下のファイル一式
    language/phpmailer.lang-ja.php

  3. 設置箇所 僕の場合は以下の様に設置しました。

f:id:bonsaimasa:20190326215319p:plain

ディレクトリ図
━index.php

┗━ PHPMaile ━ language ━ phpmailer.lang-ja.php
       ┗ src ━┓━━ PHPMailer.php
           ┣━━ SMTP.php
           ┣━━ POP3.php
           ┣━━ OAuth.php
           ┣━━ Exception.php

記述ソース

問合せフォームで入力すると/php/index.phpに遷移し、問合せ者と管理者にそれぞれ1通ずつメールを送信する機能。

html(一部抜粋)

<form class="form" method="POST" action="/php/index.php">
    <div class="formRow">
        <label class="formRow__label" for="name">お名前</label>
        <input class="formRow__inputTxt" type="text" id="name" name="user_name" value="" />
    </div>
    <div class="formRow">
        <label class="formRow__label" for="name_kana">フリガナ</label>
        <input class="formRow__inputTxt" type="text" id="name_kana" name="user_name_kana" value="" />
    </div>
    <div class="formRow">
        <label class="formRow__label" for="company">会社名</label>
        <input class="formRow__inputTxt" type="text" id="company" name="user_company" value="" />
    </div>
    <div class="formRow">
        <label class="formRow__label" for="zip">郵便番号</label>
        <input class="formRow__inputTxt" type="text" id="zip" name="user_zip" value="" />
    </div>
    <div class="formRow">
        <label class="formRow__label" for="address">住所</label>
        <input class="formRow__inputTxt" type="text" id="address" name="user_address" value="" />
    </div>
    <div class="formRow">
        <label class="formRow__label" for="tel">電話番号</label>
        <input class="formRow__inputTxt" type="tel" id="tel" name="user_tel" value="" />
    </div>
    <div class="formRow">
        <label class="formRow__label" for="mail">メールアドレス</label>
        <input class="formRow__inputTxt" type="mail" id="mail" name="user_mail" value="" placeholder="mail@example.com" />
    </div>
    <div class="formRow">
        <label class="formRow__label" for="content">お問い合わせ内容</label>
        <textarea class="formRow__inputArea" id="content" name="user_content" value=""></textarea>
    </div>
    <div class="formSubmitRow">
        <button class="formSubmitRow__submit" type="submit">送信する</button>
    </div>
</form>

php

<?php
mb_language("ja");
mb_internal_encoding("UTF-8");

//PHPMailerの読み込み
//自分の置いたファイルのディレクトリ先を指定
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
require 'PHPMailer/src/POP3.php';
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/OAuth.php';
require 'PHPMailer/language/phpmailer.lang-ja.php';

//公式サイトにならってそのまま記述
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

/*=======認証情報=======*/
$host = "smtp.office365.com";
$smtp_user = "dummy@bonsai.com";
$smtp_password = "xxxxxxx";
$from_address = "dummy@bonsai.com";
$from_name = "株式会社ホゲ";

/*=======POST情報=======*/
$name = $_POST["user_name"];//氏名
$name_kana = $_POST["user_name_kana"];//フリガナ
$company = $_POST["user_company"];//会社名
$zip = $_POST["user_zip"];//郵便番号
$address = $_POST["user_address"];//住所
$tel = $_POST["user_tel"];//電話番号
$mail = $_POST["user_mail"];//メールアドレス
$content = $_POST["user_content"];//問い合わせ内容
$url = "/form_finish.html";

/*=======問い合わせ側:メール情報=======*/
$customer_to = $mail;//送信先メール
$customer_title = "お問い合わせありがとうございます。";//件名
$customer_content = "";//本文
$customer_content .= $name . "\r\n";
$customer_content .= "\r\n";
$customer_content .= "この度は、お問い合わせいただき誠にありがとうございます。\r\n";
$customer_content .= "\r\n";
$customer_content .= "お送りいただきました内容をご確認の上、担当者より折り返しご連絡させていただきますので、お待ちください。\r\n";

$customer_content .= "以下の内容が送信されました。\r\n";
$customer_content .= "-------------------------------------------------------------------------------------------------------- \r\n";
$customer_content .= "お名前 : " . $name . " \r\n";
$customer_content .= "フリガナ : " . $name_kana . " \r\n";
$customer_content .= "メール  : " . $customer_to . " \r\n";
$customer_content .= "会社名 : " . $company . " \r\n";
$customer_content .= "郵便番号 : " . $zip . " \r\n";
$customer_content .= "住所 : " . $address . " \r\n";
$customer_content .= "電話番号 : " . $tel . " \r\n";
$customer_content .= "メールアドレス : " . $mail . " \r\n";
$customer_content .= "お問い合わせ内容 : \r\n";
$customer_content .= $content . " \r\n";
$customer_content .= "-------------------------------------------------------------------------------------------------------- \r\n";
$customer_content .= "\r\n";

/*=======問い合わせ側:メール送信準備=======*/
$customer_mail = new PHPMailer();
$customer_mail->Debugoutput = function($str, $level) { syslog(LOG_ERR, "PHP Mailer:" . $str); };
$customer_mail->IsSMTP();
$customer_mail->SMTPAuth = true;
$customer_mail->SMTPDebug = 2;
$customer_mail->CharSet = "utf-8";
$customer_mail->SMTPSecure = "tls";
$customer_mail->Host = $host;
$customer_mail->Port = 587;
$customer_mail->IsHTML(false);
$customer_mail->Username = $smtp_user;
$customer_mail->Password = $smtp_password; 
$customer_mail->SetFrom($smtp_user);
$customer_mail->From = $from_address;
$customer_mail->FromName = $from_name;
$customer_mail->Subject = $customer_title;
$customer_mail->Body = $customer_content;
$customer_mail->AddAddress($customer_to);

/*=======管理者側:メール情報=======*/
$admin_to = "dummy@bonsai.com";//送信先メール
$admin_title = "【要確認】お問い合わせがありました";//件名
$admin_content = "";//本文
$admin_content .= "ご担当者様 \r\n";
$admin_content .= "\r\n";
$admin_content .= "問い合わせがありました。 \r\n";
$admin_content .= " \r\n";
$admin_content .= "以下の内容が送信されました。 \r\n";
$admin_content .= "-------------------------------------------------------------------------------------------------------- \r\n";
$admin_content .= "お名前 : " . $name . " \r\n";
$admin_content .= "フリガナ : " . $name_kana . " \r\n";
$admin_content .= "メール  : " . $admin_to . " \r\n";
$admin_content .= "会社名 : " . $company . " \r\n";
$admin_content .= "郵便番号 : " . $zip . " \r\n";
$admin_content .= "住所 : " . $address . " \r\n";
$admin_content .= "電話番号 : " . $tel . " \r\n";
$admin_content .= "メールアドレス : " . $mail . " \r\n";
$admin_content .= "お問い合わせ内容 : \r\n";
$admin_content .= $content . " \r\n";
$admin_content .= "-------------------------------------------------------------------------------------------------------- \r\n";
$admin_content .= " \r\n";
$admin_content .= "ご確認の程、宜しくお願いいたします。 \r\n";

/*=======管理者側:メール送信準備=======*/
$admin_mail = new PHPMailer();
$admin_mail->Debugoutput = function($str, $level) { syslog(LOG_ERR, "PHP Mailer:" . $str); };
$admin_mail->IsSMTP();
$admin_mail->SMTPAuth = true;
$admin_mail->SMTPDebug = 2;
$admin_mail->CharSet = "utf-8";
$admin_mail->SMTPSecure = "tls";
$admin_mail->Host = $host;
$admin_mail->Port = 587;
$admin_mail->IsHTML(false);
$admin_mail->Username = $smtp_user;
$admin_mail->Password = $smtp_password; 
$admin_mail->SetFrom($smtp_user);
$admin_mail->From = $from_address;
$admin_mail->FromName = $from_name;
$admin_mail->Subject = $admin_title;
$admin_mail->Body = $admin_content;
$admin_mail->AddAddress($admin_to);

/*=======メール送信実行=======*/
if($admin_mail->Send() && $customer_mail->Send()){
header('Location:' . $url);
exit;
}else{
    echo "customer Error : " . $customer_mail->ErrorInfo . "\r\nadmin Error : " . $admin_mail->ErrorInfo;
}
?>

POINT

  • point1
    $admin_mail->Debugoutput = function($str, $level) { syslog(LOG_ERR, "PHP Mailer:" . $str); };
    この記述がないと、ログが画面に表示されてしまいます。
    ユーザーに見えてしまうのとheader('Location:' . $url);が正常に動作しなくなってしまいます。

まとめ

普段PHPを使っていないのもあり、記述をあまり理解出来せずにやってる箇所もあるので今度しっかり理解しようと思います。
ともかくPHPMailerはすごい便利なようなのでとても汎用性が高そうです。
ソースがおかしいやもっとこうした方がいいなどあればご指摘お願いします。