【PHPメールライブラリ】PHPMailer使用、composer,SMTPなしで、サクッとメールフォームページを作る方法
| 更新: 2024/04/06 | 3842文字
今回は、PHPメールライブラリの『PHPMailer』を扱ってみます。ネットで検索したところ、このライブラリでは『composer,SMTP認証,gmailアカウント使う』みたいな事例が多いんですけど、『composer,SMTP認証などは省いて、サーバーにサクッと置いてメールフォームページを作る』というのをやってみます。
もちろんSMTP認証があった方がセキュリティ上は良いんですけど、『とりあえずこんな感じでメールが送られる』みたいな点は確認できると思います。さっそく内容を確認していきましょう。
目次
PHPMailerとは?ダウンロード方法は?
シンプル・多機能なPHPメールライブラリ
PHPにはmail・mb_send_mailなどのがファンクションがありますが、これはシンプルな実装でメール機能を使えるようになるライブラリです。メルアドのバリデーションやSMTP認証などもシンプルな記述で書くことができます。
送信先設定なども『$インスタンス名->addAddress($宛先)』のように組み込みメソッドでセットできます。
また、公式リポジトリには、コード例も多く上がっているので、自分の環境にあわせて実例を確認していくのもベターです。ただし英語です。
■PHPMailer GitHubリポジトリ
https://github.com/PHPMailer/PHPMailer
■PHPMailer コード例
https://github.com/PHPMailer/PHPMailer/tree/master/examples
PHPMailerのダウンロード方法
通常はライブラリ管理ツールcomposerを使うことが多いようです(管理人はよくコマンド忘れますけど笑)。サーバーにcomposer入れて管理、というまでやらない中~小規模なプロジェクトだと、リポジトリからダウンロードしてしまった方がラクです。
リポジトリにアクセスしたら、緑色のcodeボタンを押すと、メニューが出てきます。この一番下に『Download ZIP』があるので、ここからダウンロードします。
解凍したフォルダの中身はこんな感じ。『language』は、各種エラーメッセージなどが、いろいろな言語で入っているファイルで、実際のライブラリは『src』のようですね。
もともとのフォルダ名は『PHPMailer-master』だったんですけど、短くリネームしました(設置した場所のパスさえ間違わなければokでしょうか)。 で、『contact』みたいな名前のフォルダ用意して、index.phpとcssの2ファイルだけ用意。ライブラリ以外は実質的に1ファイルでメール機能を実装してみましょうか。
PHPMailerをつかって、サクッと作ったメールフォームページ
というわけで、さっそくメールフォームページを作ってみましょう。前述の通り、composerやSMTP認証は無しで簡単に作ってみました。以下のPHPMailerリポジトリサンプルも参考にしたので、お時間あったらリポジトリのサンプルコードも見てみてください。
『Fromアドレスに、送り手のアドレス書かないで、自分のドメインのメルアド書け』みたいな、さらっと重要なことも書いてあったりします。
simple_contact_form.phps(PHPMailerリポジトリ)
https://github.com/PHPMailer/PHPMailer/blob/master/examples/simple_contact_form.phps
コード例 フォーム表示&処理(任意のフォルダ/index.php)
*管理者メルアドがinfo@example.comというようになっているので、実際のアドレスに変更します。
ポイントとしては、composerじゃないので、autoloadではなくrequireで必要ファイル読み込んでます。メルアドバリデーションは組み込みメソッド『PHPMailer::validateAddress』を使用しています。一応、フロント/サーバー両方でチェックできるようにはしました。
問題がなければ『$mail_1= new PHPMailer();』というようにインスタンス化して、メールの部品をセットしていきます。組み込みメソッドの『setFrom,addAddress,addReplyTo』を使用。send()で送信して、『送信しました&トップページ戻るリンク出力』という流れです。
コード例 スタイルシート(任意のフォルダ/style.css)
CSSはお好みでどうぞという感じで、おまけなんですけど。こちらのCSSをhtml head内でincludeしています。めんどくさかったらまとめて書いてしまえば、1ファイルでokのメールフォームシステムになりますね。
表示・バリデーション・メーラー受信
表示と送信後
表示はこんな感じです。まあ普通ですね。
送信後はページ遷移はせず(同じスクリプトが再度読み込まれる)、send()の後にメッセージやリンクが出てくる形になりました。
バリデーション
フロントでは、『required』をつけておくと、空のときブラウザ警告がでます。メルアド欄にはpattern属性で正規表現入れてもよいですね。
あとは、組み込みメソッドvalidateAddressの挙動を確認。あからさまに形式がおかしいメールアドレスを入れたりすると・・・
ハネてくれました。ただし、『形式は正しいけど、メルアドの文字を打ち間違えた』みたいなのはハネられません。これはしょうがないですね。
メーラー受信
こんな感じでメールが届きました。項目とかは、お好みで調整してみましょう。 ちなみに、『mb_languageがJapaneseまたはuni』『mb_internal_encoding/CharSetがUTF-8』です。
その他、書いてなかったけどポイントになりそうな点
自動返信メールはどうするか?
2通り考えられます。まず一つは、送り先を『$mail_1->addAddress($toadmin); $mail_1->addAddress($email);』みたいにして複数指定する。この場合は、返信文をユーザー向けにして(お問い合わせありがとうございますとか入れる)、同じのを管理者にも送る、という感じになります。
もう一つは、インスタンスを2つ立ち上げて、『管理者用/自動返信用』に二つ作るという感じでしょうか。
メーラーで受信したときの文字化け
メール系ではよくあるんですけど、文字コード設定によっては文字化けも発生します。 管理人がこうなった状況では『mb_internal_encodingやCharSetがISO-2022-JP』でこれが発生しました。全く読めません。 ちなみに『gmail受信時はヘッダーやタイトル・差出人は化けてるけど、本文は化けずに読める』という状況です。
調べたらThunderbirdはISO-2022-JPに弱いっぽいですね。Thunderbird/charset=ISO-2022-JPできちんと表示できてたメールソースを調べたら、Content-Transfer-Encodingもきちんと指定してあったりします(大きい会社のメールシステムだと、こういうところはきちんと指定しているようです)。
そのほか、安定したのは上でも書いた『mb_languageがJapaneseまたはuni』『mb_internal_encoding/CharSetがUTF-8』でした。日本語はISO-2022-JPみたいなイメージがありましたけど、メール事業者のなかでも、最近は変わってきているみたいです。管理人ももう少し調べてみます。
あとがき・まとめ
- PHPMailerはサクッとメール機能が利用でき、宛先セットやバリデーションのような組み込みメソッドも利用できる。
- $mail= new PHPMailer()のようにインスタンス化して、メソッドで設定したり、値を組み込んだりして使う
- 文字コード設定によっては文字化けが発生する場合がある
まとめるとこんなところでしょうか。あまりエンジニア向きな記事ではありませんでしたが、『追加1ファイルでサックリ』という場合は、検討材料になりそうです。contact form7やオープンソースメールスクリプト・フォームサービスなどと比べてみましょう。
【カテゴリ】- PHP
【タグ】- PHPライブラリ, メールフォーム