let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【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のダウンロード方法

通常はライブラリ管理ツールcomposerを使うことが多いようです(管理人はよくコマンド忘れますけど笑)。サーバーにcomposer入れて管理、というまでやらない中~小規模なプロジェクトだと、リポジトリからダウンロードしてしまった方がラクです。

リポジトリにアクセスしたら、緑色のcodeボタンを押すと、メニューが出てきます。この一番下に『Download ZIP』があるので、ここからダウンロードします。

解凍したフォルダの中身はこんな感じ。『language』は、各種エラーメッセージなどが、いろいろな言語で入っているファイルで、実際のライブラリは『src』のようですね。

もともとのフォルダ名は『PHPMailer-master』だったんですけど、短くリネームしました(設置した場所のパスさえ間違わなければokでしょうか)。 で、『contact』みたいな名前のフォルダ用意して、index.phpとcssの2ファイルだけ用意。ライブラリ以外は実質的に1ファイルでメール機能を実装してみましょうか。

PHPMailerをつかって、サクッと作ったメールフォームページ

というわけで、さっそくメールフォームページを作ってみましょう。前述の通り、composerやSMTP認証は無しで簡単に作ってみました。以下のPHPMailerリポジトリサンプルも参考にしたので、お時間あったらリポジトリのサンプルコードも見てみてください。

『Fromアドレスに、送り手のアドレス書かないで、自分のドメインのメルアド書け』みたいな、さらっと重要なことも書いてあったりします。

コード例 フォーム表示&処理(任意のフォルダ/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
【タグ】- ,

関連記事