【PHP】PHPMailerを使ってお問い合わせフォームからメールの送受信できるようにする方法!

プログラムを作っている中でメールを送信する機能がありますが、手で書くと結構煩雑になりませんか?
サーバーやポートの設定、ログイン認証、添付ファイルの追加・・・・。

そんな考えるのも面倒なメール送信を一気に楽にしてくれるライブラリ PHPMailer をご紹介します。

SMTPで送信して安全にメールを受け取れるのでこの方法でサイトにお問合せフォームを設置しています。

なんでPHP Mailerを使うのか

mb_send_mail()を使えばメール送信自体はできますが、ここ数年で迷惑メール扱いされる率が跳ね上がりました。
都度迷惑メールフォルダ見てくれとか言ったりするのは手間でしか無いですし、受信ボックスに入れる前の段階で弾かれてるのかもで送られてないんじゃないのみたいに揉めたり、誰も幸せにならない、用事にならない。
多分これはメール送信元がまともなアカウントかどうかをメーラー(メールサービス)が判定して、結果蹴られたって話なんだろうと思います。
発信元のメールアドレスは指定できるけどメールサーバー通してないし、だとすると偽装と変わらないですね。

で、PHP Mailerはメールアカウントにログインして送信処理してるから安心です。
設定さえちゃんと出来てればエラーも吐かないし迷惑メールになりません。

概要は以上です。

使い方

  1. PHPが使えるWEBサーバーを用意する
  2. PHPMailerのファイルをアップロードする
  3. PHPMailerを噛ませた内容のメールフォームをアップロードする

PHPMailer自体はいじらない。
記述ミスは自分で用意したデータでしか発生しないから安心感がある。

ダウンロード

GitHubで公開されてるからダウンロード。
GitHub – PHPMailer/PHPMailer: The classic email sending library for PHP
今見たら安定版が6.0.7だったんでこれでやっていく。

ディレクトリ構成

  1. 「PHPMailer」フォルダを作る。
  2. 「PHPMailer」に「src」フォルダごと全部突っ込む。
  3. 「PHPMailer」に「language」フォルダを作って「phpmailer.lang-ja.php」だけ入れる。

送信部分

上項目の「PHPMailer」と同じディレクトリで送信作業をするとして。
要するにこう。

[php title=”finish.php”]
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require ‘PHPMailer/src/Exception.php’;
require ‘PHPMailer/src/PHPMailer.php’;
require ‘PHPMailer/src/SMTP.php’;
require ‘PHPMailer/language/phpmailer.lang-ja.php’;

$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
//Server settings
$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = ‘smtp.lolipop.jp’; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = ‘****@megefeps.info’; // SMTP username
$mail->Password = ‘****’; // SMTP password
$mail->SMTPSecure = ‘ssl’; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 465; // TCP port to connect to (ssl:465)

//Recipients
$mail->setFrom(‘****@megefeps.info’, ‘MEGEFEPS’); // 送信者のメールアドレスと名前
$mail->addAddress(‘****@gmail.com’, ‘****’); // 送信先のメールアドレスと名前
// $mail->addAddress(‘****@gmail.com’); // 送信先追加
// $mail->addReplyTo(‘****@gmail.com’, ‘****’); // 返信先
// $mail->addCC(‘****@gmail.com’); // CC
// $mail->addBCC(‘****@gmail.com’); // BCc

//Attachments 添付ファイル
// $mail->addAttachment(‘/var/tmp/file.tar.gz’); // Add attachments
// $mail->addAttachment(‘/tmp/image.jpg’, ‘new.jpg’); // Optional name

//Content 送信内容
// $mail->isHTML(true); // Set email format to HTML HTML形式で送るかどうか
$mail->Subject = ”; // 件名
$mail->Body = ”; // 本文
// $mail->AltBody = ”; // HTML形式で送る場合の非HTML本文

$mail->send();
}
[/php]


記入内容は変数で指定できるので都合のいいように成形できます。
要らない項目はコメントアウトなり削除なりしてしまいましょう。
ちゃんとした使い方は「README.md」に書いてあります。

入力画面→確認画面→送信完了までの流れ

どんな感じで作るのが良いのか考えると、

  • ブラウザの「戻る」禁止
  • 前ページに戻るのはフォーム内で処理
  • 戻った場合入力情報を残す
  • 入力フローに沿わないアクセスは弾く

でやっていくのが良いと思います。
ブラウザ機能で戻れちゃうと送信処理のおかわりができるので良くありません。
直接送信処理してるページにアクセスできると良くないです。
気にしてる人としてない人がいますが、少し危ないと思います。

入力画面

“? php echo $text; ?></li><li><input type=

>radio01
>radio02
>radio03

>checkbox01
>checkbox02
>checkbox03
>checkbox04

>select

<? php echo $textarea; ?>

  • >必須
  • 確認画面へ
[/html]
check.phpから戻ってきた場合もvalueを受け取って表示させたいからこんな感じです。
変数にするにあたって自由入力項目についてはタグ入力とかされた場合に作動しちゃうのを回避するために「htmlspecialchars()」を噛ませます。

jsでブラウザの戻るを禁止。
他ページから来た場合違和感になるので、target=”_blank”でリンクさせるのがいいかもしれません。

radio、checkbox、selectはvalueを手打ちでいちいち指定して照合するしかないです。
jsでvalue読み取って照合するなら別案件もコピペでいけますよみたいな汎用性持たせたスマートな書き方もできますが、phpでもできますが、ここはベタ打ちでやるのが得策かと思います。

確認画面

[html title=”check.php”]
“,$required);
$requiredVal = implode(‘”>“,$checkbox);
$checkboxVal = implode(‘”>

決定
戻る

[/html]
[name=”reqired”]のチェックの有無でindex.phpからアクセスされてるかどうかを判別する。
チェックがなければindex.phpに飛ばします。
jsで操作してるからモヤモヤしますが、「決定」と「戻る」でそれぞれ遷移先を変更しています。

送信完了画面

確認画面と同じくphpでrequiredのチェックを確認して、無ければindex.phpに飛ばします。
入力画面、確認画面と同じくjsでブラウザの戻るを禁止します。
入力画面、確認画面よろしくpostを受け取ってメール本文の体裁を整えます。
PHPMailerで送信します。

select、radio、checkboxの応用

phpを前提に考えた時、選択肢を配列で用意してそこからforeachで書き出すのが楽だったりします。
上の項目みたいにブラウザバックを使わずに確認画面から戻った場合、postを受け取ってるからそれにも対応させるとこんな感じです。

select

[html title=”select”][/html]
表示とvalueを別々にしたいってんなら多次元配列を使うことになるのでちょっとめんどくなる。

checkbox

[html]

.$value.’
‘;
}else{
echo ‘‘.$value.’

‘;
}
}
?>

[/html]

項目を配列で用意して書き出す。
in_arrayでチェックしたvalueとぶつけてその有無で振り分け。

今回はこの辺でさようなら。

過去記事JavaScriptでできることって? 初心者でも分かるように概要を解説してみた。

過去記事初心者でもGitとGitHubを使えるようになろう!

最新情報をチェックしよう!
>本当の自由を求めて「WEBサバイバー terayamaya」

本当の自由を求めて「WEBサバイバー terayamaya」

本当の自由とはなんだ?答えを求めてサバイブし続ける!お金より大事な事は沢山あるけどお金じゃないと解決できない事もある。

CTR IMG