【MailForm01】PHP多機能メールフォーム フリー(無料)版
【重要】※要修正
PHP8以上の場合にエラーとなり送信できない問題
ただし、2020/05/08以前にダウンロードされた方が対象です。
2020/05/08以降にダウンロードされた方は関係ありませんので無視して下さい。
対象かどうかの確認方法はファイル内上部に「ver2.0.0」など、バージョンが記述されている場合は改修済みですので対応不要ですが、記載がない場合(最終更新日2018/07/27などとなっている場合)は修正が必要です。
バージョン(ver●●)が表示されている場合の記述例
PHPメールプログラム フリー版 ver2.0.0 最終更新日2021/05/20
※この場合は修正の必要はないということです。
【症状】
送信した際にPHP7.4の場合は環境によってエラーが表示される。PHP8以上の場合はエラー表示(またはページ真っ白)となり、送信が行えなくなります。
【原因】
PHPのバージョンが7.4以降の場合、get_magic_quotes_gpc()関数が非推奨となったため、環境によってはDeprecatedエラーが表示され、
PHP8以降では廃止になったため、Fatal errorが表示され、送信が出来ません。
【解決方法】
mail.phpをエディタソフトなどで開いて「get_magic_quotes_gpc()」の文字をファイル内検索して下さい。
※主にCtrl+Fで検索できます。
フリー版の場合は2箇所、有料版の全機能搭載版の場合は4箇所あります。
以下のような記述です。
if(get_magic_quotes_gpc()) { $out = stripslashes($out); }
あとはその行を1行まるっと削除するだけです。削除しても機能には影響ありません。
以上です。エラーが出ている場合はこれでエラー表示が消えるはずですので確認して下さい。
【説明】
get_magic_quotes_gpc()関数はmagic_quotes_gpcという設定がONかどうかチェックするためのものですが、 「magic_quotes_gpc」自体はPHP5.4で廃止されたため、本来は不要な記述ですが、古いバージョンでの利用も考慮し念の為に残していました。
ですので、PHP5以上であれば不要な機能なので削除して構わないのです。
誰でも無料で使えるPHPを利用したフリーのメールフォームプログラムです。サーバー環境は問わず、基本的にほとんどのレンタルサーバーで動作します。
1ファイルのみのシンプル&設置が容易な無料(フリー)のPHPメールフォームプログラムです。
設置の容易さはおそらくトップクラス(自称ですが)かと思います。面倒な設定は一切必要ありません。
お問い合わせの受付などに最適です。
項目を変更すればアンケートなどにも使用可能です。設置もいたって簡単です。
メールフォームプログラムに必要なものはほとんど付いています。
特に難しい設定は必要ありません。フォームページのhtmlはご自身で用意したものでも同梱しているサンプルをそのまま使ってもOKです。大きな特徴としてフォームで送信されたデータをすべて自動で取得、送信します。
name属性の値は日本語OKです。日本語にすることでその名前がそのまま確認メール、及び送信メールの各項目名となります。
※同梱しているcontact.htmlをご参考下さい。
※特殊文字、機種依存文字などの場合文字化け等が起こる可能性があります。
とりあえずであればファイル内に受信するメルアドとサイトのトップページのURLを記述し、サーバーにアップすれば設置は完了です。
必要に応じてその他の設定(mail.phpをエディタで開いて)を行なって下さい。
ご使用には設置予定サーバーでPHPが動作することが必須です。レンタルサーバーであれば今時まず問題無いですが(PHPが動かないサーバーは皆無と思います)、無料サーバーなどの場合はまず動かないと思います。
主な機能と特徴
- 完全無料のプログラムです。もちろん商用使用でもOKです!どんなサイトでも設置いただけます。クライアントへの納品などでももちろんOKです。特になんら制限はありません。
ただ実際に導入してみてもし気に入っていただけましたら「
」していただけるとさらにより良いものへと進化する可能性があります(笑)
- こちらのフリー版のみ著作権リンク表記はデフォルトの完了画面にのみ表示されます。ご自身で完了ページを用意すれば著作権リンク表記無しで運用可能です(ファイル内にて設定可)完了ページは普通のhtmlファイルでOKです。(CV率の計測も可能です)
- 使うファイルはたった1つだけです。(mail.phpのみ)なので設置・管理が容易です
※すべての設定はmail.phpで行います。
- すべてのフォームパーツを使えます。テキスト(textarea含む)はもちろんラジオボタン、チェックボックス、プルダウン(select)なども。もちろん項目数に制限はありません。すべての項目を自動で取得、送信しますので面倒な設定が不要です。
チェックボックス使用時は注意点がありますので必ず確認してください。ファイル内にもコメントしています。チェックボックス使用時の注意点はこちら
- 送信内容確認画面付き(デフォルトはON)
- 自動返信メール付き
(送信内容を送った人に自動送信します。デフォルトはOFFになってます。また送った人に送るメール本文の文頭に「○○様」と表示させることも可能です。いずれもmail.php内で設定可能。
- 入力必須項目も設定可能。※ファイル内にて設定可
- 携帯(ガラケー)、スマホも対応しています。※ガラケーは当然3キャリアで要テスト。ガラケーはSHift-JISが無難です。但し、すべての機種での動作保証は出来かねます。
- Javascriptなどのブラウザ依存のスクリプト等は使用していませんので、基本的にはブラウザ間の問題は発生しません。(あくまで実行結果がHTMLで出力されるだけですので)
- フォーム用のHTMLファイル(contact.html)も同梱してます。もちろんオリジナル、または既存のフォームページでもOKです。action属性でmail.phpを指定ください。
- 自動返信メールのフッタ部にオリジナルの署名等を表記可能。(デフォルトは無し)
- 確認画面はデフォルトではテーブルのみのシンプルなデザインですが、オリジナルのデザイン(現行サイトのデザイン)も反映できます。
- メールアドレスの形式チェック付き。
※xxxx@xxxx.xxxまたはxxxx@xxxx.xxx.xxxかどうか。@マークが1つかどうか。
※有効なメールアドレスが弾かれてしまうということはありません。
- Bcc送信が可能(ファイル内のコメントを参考ください)※複数宛先も可
- PHP4.3.9~PHP7までの幅広いバージョンで動作確認しています。
- 任意の複数の項目の連結が可能です。(2014/12/12アップデートによる新機能)
下記「更新履歴をご参照下さい。」
- 2018/07/28の大型アップデートによりワンタイムトークン(PHPセッション)によるスパム対策、CSRF対策、自動返信メールの送信元メールアドレスの設定、-fオプションによるエンベロープFrom(Return-Path)の設定、機種依存文字の変換などの新機能が追加されました。またフォームのレスポンシブ化も行いました。
詳細は「更新履歴をご参照下さい。」
サンプルデモ
お名前とメールアドレスを必須項目に設定しています。実際には送信されません。
問い合わせフォームサンプルデモ(デフォルト)
実際には既存のサイトに組み込むことが多いと思いますので以下はそのサンプルになります。
問い合わせフォームサンプルデモ(サイト組み込み版)
メールフォームダウンロード
フォームページの文字コードと同じ文字コードをダウンロードください。でないと必ず文字化けします。
(フォームページが現在無い場合にはUTF-8版をオススメします)
特に理由が無ければ、また可能であればできる限りShift_JIS版以外をオススメします。
※Shift_JISはPHPと相性がよくありません(以下「よくある質問」も参照下さい)
メールフォーム Shift-JIS版
メールフォーム EUC-JP版
メールフォーム UTF-8版
zipファイルにしてありますので、ダウンロード後解凍してください。
解凍ソフトは特になんでもOKですが、無ければ以下のLhaplusとかで良いと思います。
http://www.forest.impress.co.jp/lib/arc/archive/archiver/lhaplus.html
動作確認は十分に行なっておりますが、万が一最新版でなんらかの不具合、お気づきの点などがありましたらお気軽にお問い合わせよりご連絡ください。
または、以下旧バージョンをお試し下さい。また下記よくある質問もご確認下さい。
旧バージョンダウンロード
旧バージョンはこちらです
関連プログラム(その他の機能搭載版)
設置方法
1.ダウンロードファイルを解凍する
以下2ファイルがあります。
・mail.php ・・・メールを送信するためのメインファイル
・contact.html・・・フォームページのサンプル。 そのまま使ってもいいし、引用、またはオリジナル、既存のフォームページでももちろんOKです。
2.mail.phpをエディタソフトで開き、必要な設定を行う
mail.phpファイルをTeraPadなどのフリーのエディタもしくはDW等で開き、必要な項目を設定してください。
※メモ帳は使用禁止です。ファイルが壊れます。
※必ずUTF-8のBOM無しで保存下さい。TeraPadの場合はUTF-8Nです。(通常はそのまま上書きすればOKです)
初めに「必須設定 必ず設定してください」の箇所を必ず設定下さい。
設定の説明はファイル内にコメントしてありますので参考ください。
任意設定箇所が多めですが、様々な用途に対応するためになります。あくまでも必要なもののみ設定ください。
3.フォームページ側を設定する
オリジナル、または既存のフォームに導入する場合には下記例のようにフォームページ側のformタグのaction属性の値をmail.phpへの相対パス(絶対パスも可)を記述すればOKです。
method属性も必須です。必ずpostを指定してください。
フォームタグ例 ※ファイル名がmail.php(デフォルト)の場合
サンプルのhtmlファイル(contact.html)がありますので、そちらを参考にしてください。
※サンプルのhtmlファイルはすでに送信可能になってます。初めてであれば一度こちらで送信してみてください。
※サンプルのhtmlは不要であれば削除下さい。
※同梱のcontact.htmlをベースに作成される場合には、<form ○○>タグから</form>までをコピペし、必要に応じて項目を変更、削除等行って下さい。
name属性の値がそのまま確認画面、送信メールの各項目名になりますので、日本語で受信する場合(ほとんどの場合そうだと思います)にはname属性の値を日本語にして下さい。name="○○" の○○の部分です。
例 <input type="text" size="30" name="お名前" />
こうすれば確認画面、及び送信メールで
【お名前】ユーザが入力した値
のように表示されます。
このあたりも同梱のcontact.htmlを参考にして下さい。
すべての項目を自動で取得、送信します。項目を増やしても自動で処理が行われますのでその他面倒な設定は一切不要です。
※name属性の値に半角スペース、機種依存文字、特殊な記号、特殊な漢字などは使用できません。
4.サーバーにアップロード
mail.phpとフォームページをサーバーにアップします。上記のタグの例では同じ階層に。
※極々稀ですが、サーバーによってはphpファイルのパーミッションを変更する必要がある場合があります。サーバーのマニュアル等に書いていますので参照して変更下さい。(まずは送信してみてからでも構いません。正常に送信できれば最適なパーミッションになっているということになりますので)
5.送信テスト
フォームページから実際に送信してみて下さい。基本的には即時送信されますので、メーラー等で受信を確認して下さい。自動返信を設定している場合はそちらもご確認下さい。正常に受信できていればこれで設置完了になります。もし届かない等の場合には、以下「よくある質問」を参照してみてください。
※追記 GmailでGmail以外のメールを受信している場合、受信までに30分~1時間程度の遅延があります。これはGmail側の仕様ですので悪しからずご了承下さい。また、サーバによっては迷惑メールとされる可能性があります。(ロリポップでとあるメールアドレスで発生したとの報告を受けています。管理人のエックスサーバーではそのようなことは一度も起こっていません)
フォーム項目の変更方法について
デフォルトのメールフォームではおそらく不要な項目があったり、追加、変更したいことがほとんどでしょう。
項目の変更自体はいたって簡単です。(ただし、最低限のHTMLの知識は必要かもしれません)
フォーム部分のソースを確認いただくと分かりますが、
inputタグやselect、textareaなどすべての項目で
name="お名前" (「お名前」部分を「name属性の値」と呼びます)
などとなっているのがわかりますが、 この場合、name属性の値「お名前」と入力されたデータ(または選択されたもの)がセットで送信されます。
要するに、上記の場合で「テスト太郎」と入力された場合、確認画面や送信されるメールでは
【 お名前 】テスト太郎
のようになるということですね。 このプログラムはフォーム項目を自動ですべて取得、送信してくれますので、 あなたはこのフォーム部分のみ変更すればいいだけです。
※要するにフォーム内の「name="○○"」のすべてを送信するということです。
※フォーム内とは<form>タグから</form>タグまでを指します。
ですので、不要なものはまるっと削除すればいいだけですし、 追加したい場合には、既存の記述をコピペするなどで
name="お名前" → name="フリガナ"
のように変更すればOKということですね。
ただし、name="○○" の○○部分には使用できない文字列があります。
半角スペース、機種依存文字、特殊な記号などは使用できませんのでご注意下さい。
またテキストフィールドである「input type="text"」以外にもすべてのフォームパーツが使用できます。
※ただし、チェックボックスのみイレギュラーで、デフォルトのフォームの記述を見ていただくと分かりますが、
name="○○[]"
のように後ろに[]が付いているのがわかると思います。
チェックボックスの場合のみname属性の値の後ろに[]を記述するルールが有りますのでご注意下さい。
※尚、添付ファイル機能の「type="file"」は使用できません。
項目の必須設定についてはmail.phpにて管理されていますので、 必須項目を変更する場合などはmail.php内で指定下さい。もちろんフォーム側でrequire属性を使ったり、JSでの必須設定でもOKです。(ただしその場合でもスパム防止の観点からPHP側でも必須設定を併用して設定されることをオススメします)
以下のページでもより詳しく解説していますので、必要に応じてご参考下さい。
フォーム(input、select、textarea)の基礎知識について
項目連結機能について
※2014/12/12 のアップデートで実装
複数の項目を連結したり、入力値の末尾に任意の文字列を付けたり出来ます。
たとえば名前や郵便番号、住所、電話番号などを複数の入力欄に分けている場合に連結したり、人数や金額の入力の末尾に任意の単位を設定できます。(例 1名、1,000円など)
この機能はあくまでもオプションです。必要が無ければ使う必要はありませんし、特に意識する必要もありません。今まで通りの使用法で問題ありません。
こちらのマニュアルを以下に用意しましたので、必要に応じてご参照下さい。
項目連結、文字列追加オプションの解説
レスポンシブ(対応)への導入について
※2018/7/28追記
2018/7/28のアップデートにより以下レスポンシブ用のCSSを配布版のファイルにも記述しました。そのためこれからダウンロードされる方はすでに反映済みですので読み飛ばして下さい。
もちろんレスポンシブであってもまったく問題ありません。レスポンシブはPHPとは特に関連はなくあくまでもhtml、CSSの範疇です。またもちろんプログラム自体はスマホでも問題なく動作します。
レスポンシブについてはあくまでも設置される方ご自身が実装されることを想定しております為、
あえてレスポンシブ用のファイルは配布しておりませんのでご了承下さい。
これはこちらでレスポンシブ用として配布しても、実際には既存のサイトなどに組み込んだり、それぞれが自身の希望の形で実装することが多い、また適切なブレイクポイントについても意見が分かれるなど、
その性質上、配布版に反映することは適切ではないと考えています。かえって作業量が増える可能性があるというのもあります。
またフォームだけレスポンシブというのも通常はありえませんので、
レスポンシブ化される方はすでにレスポンシブ化の技術を持っているということもあります。
こういった理由からレスポンシブについてはあくまでも設置される方ご自身で対応いただければと思います。
レスポンシブ用CSSの参考ソース
参考までにレスポンシブ化の参考ソースを掲載しておきますので必要に応じて使って下さい。
※あくまでも必要最低限のもののみとなりますので微調整などは適宜ご自身で行なって下さい。
よくあるパターンではありますが、
テーブル(table)はスマホのように画面幅が狭いとそのままでは見づらいため、
テーブルのセルをブロックレベル要素に変更するというのをよく行います。
以下CSSは配布版のcontact.htmlとmail.phpの場合の例です。
contact.htmlとmail.phpのhead内に追加することで簡単にではありますがレスポンシブ化が可能です。
(必ずPC用のCSSの下に追加下さい)
既存のフォームなどに導入する場合には適宜セレクタなどを変更下さい。
これだけでひとまずレスポンシブ化はできますが、その他微調整などは各自で行なって下さい。(ブレークポイントも適宜自由に変更下さい)
また必ず以下のmetaタグをhead内に追加しておく必要がありますのでご注意下さい。
また必ず実機でも確認してください。
よくある質問と対処法など
メール送信不具合関連
メールが届かない・・・
様々な要因が考えられますが、まずは問題を切り分けるため、以下のことをご確認ください。
※2024/02/16追記
Gmail宛のメールが届かないという報告を多数いただいています。
Gmailのスパム対策が強化されたためと思われます。
対策などを以下ページにまとめていますのでご参照ください。
フォームから送信されたメールが迷惑メール扱いされる場合の対策
まずは配布中のものをダウンロードし、mail.phpで管理者のメールアドレスに1つのアドレスのみを設定し、一緒になっているcontact.htmlとともに同階層にアップロードし、送信してみて下さい。GmailなどのWebメールサービスを使用している場合には迷惑メールフォルダも確認ください。
※Gmailで他のメールアドレスを受信する設定にしている場合、30分~1時間ほど受信が遅れます。(これはGmail側の仕様になります)2013/9現在
■管理者のメールアドレスを2つ以上設定していませんか?
管理者のメールアドレスが2つ以上設定されている場合で送信先がGmailの場合にGmail側へのメールが届かない(迷惑メールにもなっていない)ことを確認しています。そのため管理者のメールアドレスはできる限り設置サイトのドメインと同じものにして、1つのみ設定して下さい。
■迷惑メールフォルダに入っていませんか?
Gmailやその他Webメールなどの場合、迷惑メールに入ってしまうことがありますのでご確認下さい。ただ、これはPHP側ではどうしようもありませんので、フィルタなどを設定の上対応下さい。
■設定したメールアドレスは本当に間違いないですか?
一度他のアドレス、またはGmailなどの無料メールアドレスを取得して送信テストしてみてください。
■mail.phpを開いたエディタはなんでしょうか?
メモ帳は厳禁です。ファイルが壊れます。推奨はTeraPadです。無料で使えるフリーソフトですので、ダウンロードしてインストールしてください。初めは特に設定などをいじらずデフォルトの状態でお使いください。もちろんその他のエディタやDWでも基本的にはまったく問題ありません。
■mail.phpの編集の際に必要な文字列等を削除されたりしていませんか?
mail.php内上部にも記載しておりますが、ダブルクーテーション「"」やシングルクォーテーション「'」、セミコロン「;」など、これらを削除されると動作しなくなりますので設定される際には注意下さい。
■サーバーはPHPが動作しますか?(ほとんどのレンタルサーバーでは問題ありません)
※CPIサーバーはデフォルトでは動きません(CPIについてはこちらの一番下を参考下さい)
サーバーのマニュアル等に掲載されているかと思いますのでご確認ください。
また、PHP4.3~PHP5.5(5.5以上でも基本的には問題無いかと思います)の環境で動作します。(ほとんどのレンタルサーバーでは問題無いです)
また、Sendmail機能を使っています(こちらもレンタルサーバーではほぼ問題無いです ※ただしWindowsサーバーの場合にはSendmail機能が無いことがほとんどなので使用できないとお考え下さい。一般的なレンタルサーバーはUNIX/LINUX系ですので問題ありません)
無料サーバーの場合、これらは無いことがほとんどですので基本的には動作しないと考えて下さい。
PHPが動くことを謳っている無料サーバーもありますが、実際には動かなかったという報告を複数いただいてます。
これを気にレンタルサーバーを借りてみてはいかがでしょうか。それほど高いものではありません。むしろ今の時代かなり安いです。無料サーバーであれこれ時間を無駄に使うことを考えると結果としてレンタルサーバーのほうが安いとも考えています。
参考URL:http://www.php-factory.net/server.php
■サーバーにアップロードしていますか?
ご自身のパソコン上ではそのままではメール送信はもちろんPHP自体動作しませんので、必ずサーバーにアップしてからテストしてください。
※XAMPP環境を入れてもメールの送信には別途特別な設定が必要です。
■ロリポップのコロリポプランでPHPバージョンが5.2の場合には動作しなかったとの報告がありました。
PHP5.3にすれば動作したとのことなのでお試し下さい。サーバー管理画面にて変更可能です。エックスサーバーのPHP5.2では動作しております。基本的にはそのようなことは無いはずではありますが。
■サーバーの試用期間中などはメール送信できないなどの制限がある場合もあります。※サーバーマニュアルやサーバー会社にご確認下さい。
■エックスサーバーを契約したのにメールが届かない。
エックスサーバーは無料お試し期間が10日ありますが、お試し期間中はメールの送受信ができません。入金後に送受信できるようになります。
■設置サーバーがスパムのブラックリストに登録されている
特にロリポップ系(ヘテムル含む)でこの現象を多く確認しています。ある日突然メールが届かなくなった場合はこれも疑ってみて下さい。
対策方法も含め詳しくは以下記事を参考にして下さい。
https://www.php-factory.net/cms/detail.php?id=4
■BIGLOBE(オフィスホームページサービス)の場合にはデフォルトでは送信できません
以下を参考に対応下さい。
https://www.php-factory.net/cms/detail.php?id=9
■その他以下ページのサーバーをお使いの場合には問題が出やすいです。
https://www.php-factory.net/cms/detail.php?id=6
■Google Apps(G Suite)をお使いの場合にはサーバーによってはそのメールアドレスでは受信できないようです。
転送設定や他のアドレスをご使用いただくなどで対応下さい。
(さくらサーバーで確認済)これはさくらサーバーの場合、送信先のアドレスが設置サイトのドメインと同じドメインのメールアドレスに設定している場合、
さくらサーバー上のメールサーバーを読みに行ってしまうため、送信先が見つからず送信に失敗するためと考えられます。
この場合、さくらサーバー側でもメールアドレスを作成すれば解決しますが、今度はGoogle Apps(G Suite)側に届かない状態になってしまうと思われますので根本的な解決は困難ではあります。(転送するなどしかありません)
■Return-Path(-f オプション)を指定しないと送信できない環境があります。(特にpostfixなど)
mail.phpのメール送信処理部分を以下のようにしてみて下さい。(ファイル内検索すれば見つかります)
mail($to,$subject,$adminBody,$header);
↓以下のように末尾に-f オプション(,'-f'. $to)を追記して下さい。
mail($to,$subject,$adminBody,$header,'-f'. $to);
上記記述のすぐ下あたりに自動返信メール用の記述もありますので忘れず同じように修正下さい。
mail($post_mail,$re_subject,$userBody,$reheader);
↓上記と全く同じです。
mail($post_mail,$re_subject,$userBody,$reheader,'-f'. $to);
メールが届いたり届かなかったりする(届かないことがある)
まず大前提としまして、PHPは動作したりしなかったりという不安定なことはサーバー障害を除き絶対にありません。常に要求された処理を必ず実行します。
要するに少なくとも一度以上正常に受信できているのであれば、プログラム側は問題ないとすることができます。
※ただ、PHP側ではメールが実際に届いたかどうかまでは判断できません。一方的に送信しているだけです。
この場合、メールが届かないほとんどの理由はPHPから送信された後の工程で発生していると考えられます。
具体的には受信するメールソフト側、メールサーバー、プロバイダなどです。
ただ、経験上、メールサーバー、プロバイダの影響である可能性は低いです。
これらがもし原因だとすると、そもそも一度も送信に成功しないでしょう。
(ただしメールサーバー、プロバイダでスパム判定などで弾かれている場合には、そのロジックが分からないため絶対ではありません。)
またGmailやYahooメールなどのWebメールサービスの場合、スパムと判断される可能性もあります。こちらもそのロジックは分かりませんので、対処のしようがありません。出来る限り独自ドメインなどのメールアドレスを使用されることをおすすめします。
デフォルトの機能ではBCC送信も可能ですので、他のアドレスをBCCに設定しておくなども有効です。
問題の切り分けにもなります。
また有料版にはなりますが、CSV保存版であればメール送信とは完全に別処理でメールの送信内容と同じ内容がCSVファイルに保存されますので、
仮にメールが受信できていなくてもCSVファイルを見ることで問い合わせ内容は確認できます。
※CSVファイルには必ず保存されますので問い合わせの漏れは防げます。(CSVファイルはエクセルなどで開けます)
CSV保存版のメールフォームプログラムは以下ページになります。
http://www.php-factory.net/mail/03.php
根本的な解決とはなりませんが、最悪の事態は回避できますし、メールは届かないけどCSVには保存されているという場合、
受信側の問題だということになり、問題の切り分けができます。
また管理者宛のメールの送信元はユーザーのメールアドレスが設定されますが、
これを固定のアドレスにすることで解決できるかもしれません。
mail.phpの以下の箇所
$header="From: $post_mail\n";
↓以下のように修正してみて下さい。
$header="From: $to\n";
これで自分自身が送信元になります。
Windowsサーバーでメールが届かない
申し訳ありませんが、Windowsサーバーの場合はSendmail機能が無いことがほとんどのため、対応しておりません。LINUX系サーバーにてご利用下さい。
※一般的なレンタルサーバーはほぼLINUX(UNIX)系なので問題ありません。
特に理由が無ければWindowsサーバーを新規で借りないことを強くおすすめします。
そもそもWindowsサーバー自体少ないですが・・・。無駄な時間を大量に費やすことになる可能性があります・・・^^;。
さくらサーバで確認画面→送信を押すとエラー(NOT FOUND、Internal Server Errorなど)、または「You don't have permission to access」(さくらサーバ共有SSLで確認)と表示される
さくらサーバの共有SSLにて確認していますが、さくらの共有サーバーの共有SSLは https://secure○○.sakura.ne.jp/○○○○.○○/のようになっています。
mail.phpのaction属性の値には現在実行中のファイルパスが自動で入るように($_SERVER['SCRIPT_NAME']で)設定していますので、本来「/○○○○.○○/mail.php」が指定されることを想定しますが、なぜかさくらの場合には、「/mail.php」が指定されてしまい、結果「You don't have permission to access」が表示されてしまい送信できないという現象が起きています。
これは「https://secure○○.sakura.ne.jp/mail.php」が指定されてことと同じになり、そこにはファイルが存在しないための結果です。
この場合、mail.phpの254行目付近の
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="POST">
を
<form action="mail.php" method="POST">
として下さい。これで解決するはずです。
その他のサーバーでは特に現在確認、報告等はありませんが、もしその他のサーバーでも同様の現象が起きた場合には、以上のことをお試し下さい。また、その旨ご連絡いただけると大変ありがたいです。
通常のURLではそのようなことは起きません。また共有SSLもさくらのような仕様となっているところは少ないと考えられます。
その他さくらサーバで確認されていること
通知先メールアドレスが2つ以上あるとエラー(Internal Server Error)になることが確認されています。
この場合、他のアドレスはBccに設定するなどで回避可能です。
また、フォーム設置先のドメインのメールアドレスをGoogle Appsで作成、管理している場合、そのメールアドレスでは受信できないようです。
※ドメインと同じメールアドレスの場合、サーバー側が自サーバー内のDNSを探しに行ってしまうためと推測されます。
この場合の対処法は分かりませんので、申し訳ございませんが他のアドレスに設定されるか、サーバー側でもメールアドレスを作成するなどでご対応下さい。
あとはファイル自体がUTF-8の場合、
BOM有りで保存してしまったなどが考えられます。
送信時、または確認画面で「Warning: Cannot modify header information - headers already sent by ○○○」と表示されてしまう
これは主にPHPファイル内に余計な文字列や空白スペースなどが入り込んでしまったことが原因である可能性が高いです。問題を切り分けるため、まずはデフォルトの状態で送信先アドレスのみを変更の上でお試し下さい。
デフォルトの状態でOKであれば、作業時に何らかの問題が発生したと推察することができます。
具体的な原因としましては、リダイレクト処理など、PHPの「header」系の関数はその前に文字列(空白や改行も含む)があってはならないルールが有ります。そのため余計な文字列があるとエラーが発生します。
デフォルトではもちろんそのようなことはありませんので、作業時に誤って入り込んでしまったと考えられます。
その他余計な文字列の混入の他にUTF-8の場合、BOMありで保存してしまった可能性もあります。
PHPファイルは必ずBOM無しで保存する必要があります。
(BOM有りで保存してしまった場合、必ず不具合が出ます)
BOMの確認、変更方法についてはこちらをご参考下さい。
2つ以上のメールアドレスを送信先に設定するとメールが届かない
問題を切り分けるため以下ご確認いただければと思います。
1,さくらサーバーの場合、2つ以上の送信先を設定するとエラー(Internal Server Error)となることが確認されています。
※実際には送信元アドレス(from)が2つ以上だとエラー(Internal Server Error)になります。
この場合、2つ目以降のメールアドレスはBCCに設定いただくなどでご対応下さい。
※BCC機能はデフォルトの機能として付いております。
※BCCであれば複数でも問題ありません。
尚、当方で把握しているのはさくらサーバーのみですが、他のサーバーでもあり得る可能性はあります。
2,送信先に設定している2つ以上のメールアドレスすべてをそれぞれ1つだけにした場合にはいずれにも正常に届くのかどうかを確認して下さい。
※受信側の問題かどうか、及びメールアドレスが間違っていないかどうかの確認。
3,根本的な部分ですが、メールアドレスの設定方法が間違っていないかどうか
ファイル内のコメントでも説明しておりますが、以下のように設定する必要があります。
$to = "aaa@abc.jp,bbb@abc.jp";
※単にカンマで区切るだけではあります。
以上のことを確認してみて下さい。
迷惑メールに振り分けられてしまう(Gmailなど)【対策方法掲載あり】
PHPのバージョンが7.4以降(8以上含む)でエラーDeprecatedやFatal errorが表示される
最新版のプログラムではすでに修正済ですので、2020/05/08以降にダウンロードされたプログラムは無関係です。
【原因】
PHPのバージョンが7.4以降の場合、get_magic_quotes_gpc()関数が非推奨となったため、環境によってはDeprecatedエラーが表示される場合があります。
※追記:PHP8以降では廃止になったため、Fatal errorが表示されると思います。
【解決方法】
mail.phpをエディタソフトなどで開いて「get_magic_quotes_gpc()」の文字をファイル内検索して下さい。
フリー版の場合は2箇所、有料版の全機能搭載版の場合は4箇所あります。
以下のような記述です。
if(get_magic_quotes_gpc()) { $out = stripslashes($out); }
あとはその行を1行まるっと削除するだけです。削除しても機能には影響ありません。
または先頭にスラッシュ2つ「//」を付けてコメントアウトして下さい。
例 //if(get_magic_quotes_gpc()) ・・・・・
これでエラー表示が消えるはずですので確認して下さい。
get_magic_quotes_gpc()関数はmagic_quotes_gpcという設定がONかどうかチェックするためのものですが、
「magic_quotes_gpc」自体はPHP5.4で完全廃止されたため、本来は不要な記述ですが、古いバージョンでの利用も考慮し念の為に残していました。
ですので、PHP5以上であれば不要な機能なので削除して構わないのです。
確認画面での不具合関連
確認画面で文字化けする・・・
フォームページ側のhtmlファイルの文字コードとメールフォームプログラムの文字コードが同じかどうか確認してみて下さい。htmlファイル側の文字コードはソース上の以下metaタグにて指定されているはずです。(以下の場合はUTF-8です。※大文字小文字は関係ありません)
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
上記が問題ない場合、サーバー側で強制的に文字コードを変換されている可能性があります。
以下ページにまとめておりますので参考の上、対処下さい。
https://www.php-factory.net/cms/detail.php?id=6
確認画面で項目が表示されない、必須項目を入力しても未入力(未選択)となる
確認画面で項目名の箇所が空欄になってしまう、または必須設定した項目を入力したにも関わらず、「○○が未選択です」(本来入力欄の場合には「未入力です」と出ます)と出る場合には、2通り考えられます。
1つは単純にメールフォーム側の文字コードとプログラムの文字コードが間違っている。
この場合にはフォーム側の文字コードと同じ文字コードのファイルをダウンロードください。
2つ目はフォーム側文字コード、及びmail.php側の文字コードは間違いないにも関わらず同様の現象が発生する場合です。これはサーバー側で強制的に文字コードを変換されている可能性があります。
以下ページにまとめておりますので参考の上、対処下さい。
https://www.php-factory.net/cms/detail.php?id=6
確認画面が真っ白、またはPHPのソースコードが表示される
サーバーにアップロードしていますか?
ご自身のパソコン上ではそのままではメール送信はもちろんPHP自体動作しませんので、必ずサーバーにアップしてからテストしてください。
※XAMPP環境を入れてもメールの送信には別途特別な設定が必要です。
ご利用のサーバーでPHPが動作しないことが考えられます。
無料サーバーでもPHPが使えることを謳っているところもありますが、それでも正常に動かないことを複数確認しておりますので、無料サーバーの場合は動かないと考えたほうが良いかもしれません。その他もろもろも含め、トータルで考えると有料のレンタルサーバーを借りた方が結局は無料サーバーよりも安く済むと考えています。(もちろんもろもろの事情があるのかもしれませんが・・・)
サーバー移転によってサイトのURLをどうしても変更出来ない場合には、プログラムのみレンタルサーバーにアップする方法が有効です。フォームページ側とメールフォームプログラムは同一サーバーにある必要はありませんので。action属性で絶対パスを指定すればいいだけです。
確認画面から「前の画面に戻る」を押すとフォームデータがクリアされてしまう
デフォルトではjavascriptにてhistorybackを行なっておりますので、ブラウザの「戻る」と同じ挙動となります。
古いFirefox(バージョン2系)などではブラウザの戻るにてデータがクリアされてしまうということがありましたが、
現在のメジャーなブラウザ(Firefox、Chrome、Safari及びIEなど)では「戻る」だけではデータはクリアされないことを確認していますので基本的には問題ないと考えられます。
※ただし、すべてのブラウザでの保証は出来かねます。
ただ、稀に必須チェックをJavascriptの特殊なライブラリなどを使って行うとデータがクリアされることがあります。(adobeのspryで確認済)
他のJSにて行うか、必須項目はPHP側でチェックを行うようにするとそのようなことは起きないかと思います。
※必須項目はmail.phpにて設定可能です。
またPHPのセッション機能などを使用している場合もクリアされることがあります。
その場合、session_start()の前に「session_cache_limiter('none');」を記述することで対処可能です。
尚、どうしても改善しない場合で完全に対応する方法としては、「戻る」を押した際にはフォームデータを再度POSTし、フォームページ側の各項目にデータを反映するという結構重めな処理が必要になります。
そのためフォームページ側もカスタマイズする必要があり、この場合には別途カスタマイズとして承ります。ただ、上記でもご説明しましたが、ほとんどのブラウザでは問題ないと考えておりますので、費用対効果を考慮の上でご検討ください。
追記:以下ページで解決方法と対策版のファイルを配布していますので、必要に応じてご利用下さい。
http://www.php-factory.net/trivia/15.php
フォーム側の項目数と確認画面の項目数が違う、または項目すべてが受信できない
まず項目数に上限はありません。すべて自動で取得、送信します。
(実際には容量の問題、POST数の上限もあるため無制限ではありませんが現実的には気にせずOKなレベルです)
原因は主に以下2パターン考えられます。
1,name属性の値が重複している。
フォームページのname属性の値を確認ください。特に項目数が多くなるほどそういったミスが起きやすいです。
name属性の値は name="○○" の○○の部分です。これはページ内で重複しての使用はできません。重複した場合、後のもののみが確認画面で表示され、送信されます。
2,チェックボックス、ラジオボタンの場合は、1つ以上チェックされていないと項目自体送信されません。
そのため、予めどれかをチェック済(checked)としておくか、隠し要素(ダミー要素)を埋め込んでおくということが考えられます。
隠し要素(ダミー要素)の記述例(赤字が追加する要素です)
<input type="hidden" name="性別" />
<input type="radio" name="性別" value="男" />男
<input type="radio" name="性別" value="女" />女
このようにtype="hidden"の隠し要素を直前に記述しておくことで未選択の場合でも項目が送信されます。
チェックされた場合には、そちらが優先(上書き)されますので問題ありません。
文字化けや誤変換関連
Shift_JIS版で一部の文字が誤変換される、または一部文字列の間に円マーク「¥」が付いてしまう
Shift_JISはPHPと相性が悪く、特に「表」、「申」、「ソ」、「ダ」などがname属性の値に含まれている場合、誤変換されたり、サーバの設定によっては円マーク(¥)が付与されることがあります。
特に誤変換はプログラム側では対応できませんので、出来る限りShift_JIS版以外を推奨します。
※これはテスト時にすぐに分かるものなので、テスト時に問題が無ければ以降も問題ありません。(起こったり起こらなかったりということは基本的にありませんし、name属性の値はそれほど頻繁に変更するもので無いと思いますので)
中国語が文字化けする
メール内の一部文字が「?」と表示される(機種依存文字の誤変換問題)【対策方法掲載あり】
機種依存文字などは基本的には使用不可になります。たとえば㈱(かっこ株)や①(丸1)、その他特殊な記号や特殊な漢字などは変換できずに「?」と表示されます。これはPHPプログラム上どうしようもありませんのでご了承下さい。SJIS-WINで送信する方法もありますが、Windowsに限定されるなどの理由から実装はしておりません。
ただ、一般的な機種依存文字に限りますが、以下方法にて機種依存文字を変換することで表示可能です。
必要に応じてご対応下さい。
※ただし、機種依存文字の状態で送信できるものではありませんのでご了承下さい。
■機種依存文字の変換処理追加の方法について
機種依存文字を確認画面表示時に表示可能な文字列に変換する方法です。以下手順にて修正下さい。
1,mail.phpの以下記述箇所を探して下さい(1箇所のみですので検索してみてください)
※「確認画面の入力内容出力用関数」の箇所にあります。
$key = h($key);
2,この下に以下すべてをコピペ下さい。(スペース的な都合で複数行に改行されていますが、実際は4行です。)
※全選択→コピペでOKです。
以上、これだけです。
これで確認画面表示時に「変換前の文字」が「変換後の文字」に変換され、送信メール内でも変換された状態で送信されます。(たとえば「㈱」の場合、「(株)」に変換されます。)
ただし、あくまでも上記で設定している機種依存文字のみが対象となります。
その他必要に応じてご自身で追加いただくなどでご対応下さい。
※変換前の文字と変換後の文字の順番は合わせる必要があります。
また必ずテスト送信を行って下さい。何らかの問題が発生した場合にはすぐに元に戻して下さい。
送信メールでは記号のエスケープ(サニタイズ)を無効にしたい
デフォルトではセキュリティを考慮し、また余計なトラブルを防止するため送信メールの内容についてもエスケープ(サニタイズ)を実施しています。
※本来は不要と思われますが、万が一html形式でメールを表示してしまった場合などを想定しています。
そのため主に英語での入力時にあることですが、
クォーテーションや&マークなどがエスケープ(サニタイズ)されてしまいますので、これを回避したい場合は以下の方法で可能です。
ただ、日本語以外のフォームの場合には基本的には多言語対応版を使用されたほうが良いです。
※多言語対応版のほうは送信されるメールではエスケープ(サニタイズ)処理を実施していません。
mail.phpの以下の箇所
※「送信メールにPOSTデータをセットする関数」の箇所です。
※1箇所しかありませんのでファイル内検索(Ctrl+F)で見つかります。
$resArray .= "【 ".h($key)." 】 ".h($out)."\n";
↓ 以下のようにするだけです。
$resArray .= "【 ".$key." 】 ".$out."\n";
h()を削除するだけです。
その他(カスタマイズ方法や対処法含む)
パーミッションについて
基本的にはPHPファイルの場合、パーミッションの設定は必要ないサーバーが多いですが、
サーバーによってはパーミッションの設定が必要な場合があります。
詳しくはサーバーのマニュアル等をご確認ください。
Sendmailパスの設定について
たまにご質問を受けますが、 一般的なレンタルサーバーの場合、PHPはSendmailパスの設定等は基本的に必要ありません。 基本的にはすでに設定済みになっています。
※CGI(perl)などでは必要ですが
Yahooジオプラスでの設置について(重要)
【x】、【y】という項目が出てきてしまう
送信ボタンに画像を指定しているとそのように表示されてしまいます。自動ですべての項目を取得、表示、送信を行う仕様となっておりますため、こちらはしょうがないのですが、input type="image" ではなく、通常のinput type="submit" とし、CSSで背景画像として指定すると解決可能です。CSSでの修正が難しい場合にはカスタマイズとして1件2,000円にて対応いたします。
時間がずれる、または「タイムゾーン」関連のエラー(date()[function.date]:、またはdate_default_timezone等が含まれる文言)が出る
プログラム側でタイムゾーンは特に設定しておりませんので、設置サーバーの設定が適用されます。これは様々な環境での使用を考慮し、そのようにしております。ただ、サーバーによってはデフォルトで指定されていない、または海外サーバーのため、海外のタイムゾーンになってしまっていることがあります。
その場合には以下の1行をmail.phpの上部付近に追記して下さい。
(「必須設定 必ず設定してください」の上あたりでOKです)
上記は日本時間を使用する場合です。日本以外の場合には適宜設定ください。ただし指定できる書式('Asia/Tokyo'部分)は決まっていますので適当に設定してもダメです。海外の場合は検索して確認ください。また、自分は東京じゃなくて北海道だからと「'Asia/Hokkaido'」としてもダメですよ。。。日本は上記だけです。日本は地域によって時差はありませんよね。これでもエラー等が出る場合には遠慮無くお問い合わせください。
ぷららホームページサーバーで「Fatal error」 が出る(ぷららは設置不可です)
結論から申しますとぷららホームページサーバーでは動作しません。以下のようなエラーが出るはずです。Fatal error: Call to undefined function mb_convert_encoding() in ○○○
これは「mb_convert_encoding」関数がないよーというエラーで、
及び
Warning: date() [function.date]: It is not safe to rely on the system's timezone settings.
も出ます。これはタイムゾーンが設定されてませんよーのエラーになります。タイムゾーンは解決可能ですが、上記mb_convert_encoding関数はどうしようもありません。そのため、ぷららでは使用不可です。ぷららにも問い合わせましたが、正式に回答をいただいてますのでご参考まで
--------------------------------------------------------
恐れながら、弊社ユーザーCGIサーバーは「mb_convert_encoding」の関数に対応をしておりません。
また、現時点で今後対応の予定はございません。
ご要望に沿えず申し訳ございませんが、ご利用可能な範囲にてユーザー
CGIをご利用くださいますよう、お願い申し上げます。
--------------------------------------------------------
mb_convert_encoding関数は文字コードを変換する関数ですが、メールフォームにかぎらずPHPプログラムでは非常に良く使われるメジャーな関数です。
Yahoo、ぷららに限らずプロバイダ系全般に言えますが、制限や特別な設定が必要だったりとトラブルが非常に多いです。
本職では無いのでしょうがない部分もありますが、プロバイダ系は基本的には動作しないものとお考えください。
なのでホームページサーバーとしては極力使うべきではありません。(と断言できます(笑)もう、ちょっと怒ってますw)
たくさんの不具合報告をいただいています。
英語だけのメールや文字化けしたようメール(迷惑メール)が届くことがある【対策法掲載】
メール本文内にURLやhtmlタグのようなものがありませんか?
それらはスパムメール(迷惑メール)の可能性が高いです。メールフォームを使用しても100%スパムを防ぐことは非常に困難です。経験上数日に1通程度など、それほど多く届くようなことは経験がありませんが、あまりにも多い場合には、必須項目を設定する、リファラチェックを「On」にするなどで減らせる可能性があります。またはメールアドレスの2重チェック版でも減らせる可能性があります。
それでも減らない場合で業務に支障が出るような状態であれば一度ご相談下さい。トークンによる認証機能や最悪の場合、ランダムな文字列を表示し、その文字列を入力させるいわゆるキャプチャ認証なども実装可能です。ただし、この場合、お問い合わせユーザーに若干ながら手間を与えてしまうことになるのでCV率に影響する可能性もあります。最後の切り札的な実装と考えるのが良いと思います。
また、こちらは有償のカスタマイズとして対応しますのでご了承下さい。現在まではそこまで深刻な状況は報告されていません。
その他迷惑メールに対してできることを以下にまとめましたのでご参考下さい。
http://www.php-factory.net/trivia/09.php
送信メールに悪意のあるコードが埋め込まれてしまったら?
htmlタグ類はエスケープ処理を行っていますので、テキストでそのままタグが表示されるだけですのでscriptタグなどが有効になることはありません。また、メールはテキスト形式で送信されますので、その他のコードが埋め込まれたとしてもそのまま文字列として表示されるだけです。もちろんすべての環境で100%の安全を保証するものではありませんが、基本的にはそのようなリスクはほとんど無いと考えています。ただ、URLに関してはほとんどのメールソフトでは自動的にリンク設定がされてしまうのでクリックできてしまいます。分からないURLなどはクリックしないことを強くおすすめします。
ご使用に際してはあくまでもご自身の責任、判断にてお願い致します。
SSLページで使用したい
もちろんSSLページでの使用も可能です。あくまでもSSLはサーバー側の問題になります。PHP側は特に関係がございません。https経由でアクセスすればSSL経由で表示できます。プログラム側でhttp通信を伴うパスなどは含んでおりませんのでエラー表示も起きません。SSLの導入法などについてはこちらでは対応できませんので、ご自身で別途契約等を行って下さい。
jQueryMobileでページ遷移がうまくいかない
formタグに以下属性を追加してみてください。
data-ajax="false"
フォーム→確認画面→送信→ブラウザの戻る→送信でメールを再送信できてしまう。
あえてこれを行う人間の意図は分かりませんが(笑)、また解決したい場合のみですが、以下Javascriptをmail.phpの確認画面用HTML部のhead部分にコピペすれば対応可能です。
※ただし、戻るボタンをありえないほど素早く連打すると戻れてしまうことがあります・・・wのでご了承下さい。
<script type="text/javascript">
window.onunload = function(){};
history.forward();
</script>
ブラウザの「戻る」を完全に無効化することはできません。こちらはあくまでも戻るボタンで戻った際にページを逆に戻すという処理で実現しています。
~IE10、Firefox、Chromeにて確認していますが、すべてのブラウザが対応しているかについては分かり兼ねますので完璧な方法とは言えませんが、とりあえずはこれで十分かと思います。
確実に再送信を防ぐにはPHP側でトークンなどを利用した処理が必要になります。どうしてもこちらが必要な場合にはカスタマイズにて承ることは可能ですのでご相談下さい。
送信完了ページに指定したページヘリダイレクトが行われない
可能性として考えられるのはmail.phpをUTF-8のBOMありで保存してしまったなどがあります。必ずBOM無しで保存下さい。TeraPadの場合にはUTF-8NがBOM無しです。BOMについての詳細や変更方法については以下を参考下さい。
UTF-8使用時の注意点(BOMあり、無し)
チェックボックス(type="checkbox")を必須項目に設定したい
チェックボックスはその他のname属性の値と異なり、後ろに[]がつきますが、mail.phpにて必須項目に設定する箇所では[]を取った文字列で指定下さい。
name属性の値に半角スペースを使いたい
PHP側で処理する関係でname属性の値に半角スペースは使用できません。
要するに「name="名前 フリガナ"」は不可ということです。全角スペースの「name="名前 フリガナ"」はOKです。
日本語、ローマ字、全角スペース、ハイフン、アンダーバー(_)などは使用可能です。ただし、機種依存文字(㈱や①)、特殊記号、その他の言語などは使用不可です。基本的にはこのプログラムは管理者、及びユーザーが日本人であることを想定しております。
英語は可能ですが、エラーメッセージ、自動返信メールの文言等も変更する必要があります。また外国語環境での受信確認は行っておりません。(JISの文字コードで送信するため外国語環境のパソコンでは正常に受信できない可能性もあります)メール自体をUTF-8で送信する外国語に対応した多言語対応版も手元にはありますが、動作確認ができないため、配布はしておりませんが、ご自身の責任において使用いただくことを条件に無償で提供しますのでご相談下さい。
※追記) 多言語対応版も配布を開始しました。
iPhoneのChromeで戻るボタンで戻った際にフォーム入力データがクリアされてしまう
ボタンに画像を使用したい
送信ボタンや戻るボタンに「input type="image"」を使用すると確認画面や送信メール内に「x」、「y」と座標が表示されてしまいます。
そのためボタンに画像を使用したい場合にはCSSにて背景画像として指定することで対応下さい。
参考までに記述例を掲載します。
もちろん外部CSSでもOKです。分かりやすいようあえてタグに直接書いています。幅や高さ、マージン、画像のパスなどは状況に合わせて変更ください。
送信メールのフッタ(署名)を管理者宛のメールでは非表示にしたい
mail.phpの以下の箇所(1箇所しかありませんので探して(検索)みてください)
$adminBody = mailToAdmin($_POST,$subject,$mailFooterDsp,$mailSignature,$encode,$confirmDsp);
赤字で示した「$mailSignature」を以下のように「""」(ダブルクォーテーション2つ)に変更して下さい。
$adminBody = mailToAdmin($_POST,$subject,$mailFooterDsp,"",$encode,$confirmDsp);
これだけでOKです。
送信ボタンの連続クリック(連打)による多重送信を回避(防止)したい
メールの件名にフォームの特定の項目の入力データ、または選択データを反映したい
以下の記述でフォーム側の特定の項目の内容を出力することができます。
$_POST['フォーム側のname属性の値']
「フォーム側のname属性の値」とは
name="○○" の○○部分です。
たとえばフォーム側のname属性の値が「名前」であれば
$_POST['名前']
とすれば入力された名前が出力されます。
これを利用します。
mail.phpの件名の設定箇所で以下のように記述することで実現できます。
例
$subject = "【".@$_POST['名前']."】 ホームページのお問い合わせ";
この場合たとえば名前に「佐藤太郎」と入力されたら、
【佐藤太郎】 ホームページのお問い合わせ
という件名になります。
前後のドット「.」はPHP上の連結を意味します。(必須です)
先頭の@マークは万が一未選択であった場合でもNoticeエラーが出ないためのものです。
動作には影響しません。
記述がもし間違っていれば確認画面すら表示されませんので、動作確認ですぐに気付けます。
逆に正常に動作し、件名にも反映されていればOKということですね。
自動返信メールの送信元アドレスを管理者のアドレス以外のアドレスを設定したい
デフォルトではmail.phpで設定した管理者のメールアドレスがお問い合わせフォームのメール送信先、及びユーザー宛の自動返信メールの送信元アドレスとなっております。
これをユーザー宛の自動返信メールの送信元アドレスのみ変更したい場合です。
mail.php内の以下の記述を探して下さい。
※フリー版のデフォルトですと200行目付近です。(1箇所しかないのでファイル内検索すればOKです)
$reheader = userHeader($refrom_name,$to,$encode);
↓以下のように設定するだけです。
$reheader = userHeader($refrom_name,'abcde@test.jp',$encode);
$toの部分を送信元としたいメールアドレスに変更するだけです。
'abcde@test.jp'
のようにメールアドレスは必ずクォーテーションで囲んで下さい。(でないと即エラーとなります)
これで自動返信メールの送信元アドレスはここで設定したメールアドレスとなります。
※送信元アドレス(from)、及び返信先アドレス(Reply)ともこちらのアドレスが反映されます。
尚、お問合わせのメールは今までどおり管理者用のメールアドレスに送信されます。
必ず送信テスト実施して問題のないことを確認してください。
管理者宛のメールの送信元アドレスを特定のメールアドレスに固定したい
※注意 2021/10/26のアップデートにて管理者宛メールの送信元アドレスもmail.phpの送信元アドレス($from)で設定したメールアドレスになるように改修したため、2021/10/26以降にダウンロードしたものはこの修正は不要です。$fromで設定すればOKです。
管理者宛のメールはデフォルトではユーザーのメールアドレスが送信元アドレスとして設定されます。
これを特定のメールアドレスに変更する方法です。
たとえば迷惑メールに振り分けられる場合などの対策として考えられます。
修正方法
mail.phpの以下の記述を探して下さい。一箇所しかありませんのでファイル内検索すればすぐに見つかります。
$header="From: $post_mail\n";
↓以下のように変更するだけです。
$header="From: abcde@sample.jp\n";
$post_mailの部分を送信元としたいメールアドレスに変更するだけです。
これで管理者宛のメールの送信元アドレスがここで設定したアドレスとなります。
これをやっても返信先(reply)はユーザーのメールアドレスになりますので、運用上の影響はありません。
尚、「管理者宛のメールで差出人を送信者のメールアドレスにする」の設定箇所が
$userMail = 1;
となっている必要があります。
さすがにやるとは思いますが、
修正を行ったら必ず送信テストなどで問題がないことを確認して下さい。
送信メールの内容を見やすさのため改行を追加したい(可読性アップ)
送信メールの内容はデフォルトでは以下のようになっています。
【 お名前 】 佐藤太郎
【 電話番号 】 ●●-●●●●-●●●●
【 メールアドレス 】 ●●●●@●●.jp
これをたとえば以下のようにしたい場合や
【 お名前 】 佐藤太郎
【 電話番号 】 ●●-●●●●-●●●●
【 メールアドレス 】 ●●●●@●●.jp
以下のようにしたい場合ですね。
【 お名前 】
佐藤太郎
【 電話番号 】
●●-●●●●-●●●●
【 メールアドレス 】
●●●●@●●.jp
修正方法
mail.phpをエディタソフトなどで開き、以下の記述(関数)を探して下さい。
「送信メールにPOSTデータをセットする関数」
その関数内の以下の記述を探して下さい。
※mail.php内で一箇所しかありませんので、ファイル内検索すればすぐに見つかります。
$resArray .= "【 ".$key." 】 ".$out."\n";
"\n"がメール内での改行を意味しますので、これを追加することで実現できます。これだけです。
変更例1.
$resArray .= "【 ".$key." 】 ".$out."\n\n";
とした場合は以下となります。
──────────────────────
【 お名前 】 佐藤太郎
【 電話番号 】 ●●-●●●●-●●●●
【 メールアドレス 】 ●●●●@●●.jp
──────────────────────
変更例2.
$resArray .= "【 ".$key." 】 \n".$out."\n\n";
とした場合は以下となります。
──────────────────────
【 お名前 】
佐藤太郎
【 電話番号 】
●●-●●●●-●●●●
【 メールアドレス 】
●●●●@●●.jp
──────────────────────
尚、項目名を囲んでいる【と】も自由に変更いただけます。
例 ■お名前 など。
修正を行なったら必ずテスト送信を実施して問題のないことを確認して下さい。
PHPはhtmlなどと異なり、1文字でも記述ミスがあると動作しません。(エラーや画面真っ白など)
※そのためテスト送信ですぐに気付けます。
以上です。
特定の項目の文字数を制限したい(コメント欄の文字数を制限したいなど)
スパムやいやがらせ、営業メールなどを防止したい場合などに有効です。
以下手順で導入できます。
1,mail.phpの適当な箇所(送信先設定などの上部あたりでOKです)に以下をコピペ下さい。
2,「お問い合わせ内容」の箇所を対象としたい項目のname属性の値に変更して下さい。(2箇所あるので注意!)
3,「250」の箇所が上限としたい文字数です。自由に設定下さい。(この場合、251文字以上でエラー表示となる)
4,もしUTF-8版以外を使用している場合は「UTF-8」の箇所をお使いの文字コードに変更下さい。
以上です。
日本語(全角)でも半角文字でも1文字は1文字としてカウントされます。改行は無視されます。(単純に文字数だけをカウントします)
必ずテスト送信を実施して問題のないことを確認して下さい。(上限を超えた場合の挙動も確認下さい)
WordPressに導入できるかどうか
結論から言ってしまうと可能です。ただこの質問への回答は性質上、とても難しいです。
どのように導入するのかにもよりますし、
人によっても出来る、出来ないがあるためです。(WPも含めたその方のスキルにも依存します)
そのため、「出来ることは出来るが、あなたが出来るかどうかまでは分からない」という回答になってしまいます。
実際にWordPressに組み込んでらっしゃる方は実際にいます。
テーマファイルに組み込んで運用されています。
ただ、最も手っ取り早いことはWordPressとは切り離して設置することです。
あえてWordPressに無理に組み込む必要はないとも思っています。
WordPressのディレクトリとは別に1つのディレクトリを作成し、そこにフォーム関連のファイルを設置すればOKです。
既存のサイトデザインを反映したい場合はWordPress側のページ(どこでもOK)のソースをまるっとコピペすればOKです。
WordPressは基本的にソース内のパスが絶対パスとなっているため設置場所(階層)を問いません。
ただこの場合、当然WordPressのテーマを編集してもフォーム側には反映されません。
それでは困る場合はWordPress側のテーマと連携させます。
方法は至って簡単です。
フォームのファイル内の最上部に以下の1行を追加すればOKです。
これでそのファイル内でWordPressタグ(テンプレートタグ)などが使えるようになります。
<?php require('../wp/wp-blog-header.php');?>
※パスは状況に応じて適宜変更下さい。(wp-blog-header.phpを読み込めばいいだけです)
※ファイルの拡張子は.phpとして下さい。(でないとPHPが動作しません)
あとは普通に「get_header();」とかを記述すればヘッダーなどを読み込めます。
個人的にはWordPressのテーマ側に直接組み込むよりも、
このほうが合理的かつ安全だと思っています。
※WP側に問題が起きた際にフォームも巻き添えを食らう可能性もありますからね。
(お問い合わせフォームなどはそれほど重要だと思いますので)
名前やふりがなに敬称(様)を付けたい(確認画面、送信メールで)
配布版のデフォルトで付いている機能で対応可能です。
name属性の値を以下のようにするだけです。
※後ろに[][ 様]をつけるだけです。
例
name="お名前[][ 様]"
name="ふりがな[][ 様]"
これで末尾に「様」が付きます。
自動返信メールで「●●様」ではなく「Dear ●●」と表示したい。
mail.phpの以下の記述を探して下さい。1箇所しかありませんのでファイル内検索で見つかります。
if(isset($arr[$dsp_name])) $userBody = h($arr[$dsp_name]). " 様\n";
↓以下のように変更して下さい。
if(isset($arr[$dsp_name])) $userBody = 'Dear '.h($arr[$dsp_name])."\n";
これで「Dear ●●」と表示されます。
入力がなかった(空)の項目を送信メール、確認画面で非表示にしたい
ソースコードの修正が必要になります。
以下に修正内容を記しますので試してみて下さい。
修正はあくまでもご自身の責任において行ってください。
また必ずテスト送信を行って下さい。
送信メールでのみ非表示としたい場合(確認画面では表示されます)
mail.php内以下の箇所
350行目付近にある(行数はプログラムのバージョンなどにより異なりますので以下文言で探して下さい)
//送信メールにPOSTデータをセットする関数
を探して下さい。
この関数の中の以下の箇所
if($out != "confirm_submit" && $key != "httpReferer") {
を以下に
if($out != "confirm_submit" && $key != "httpReferer" && $out != ''){
これで入力があった内容のみ送信されます。
確認画面、送信メール双方で非表示にしたい
mail.phpの389行目付近以下の関数の箇所(行数はプログラムのバージョンなどにより異なりますので以下文言で探して下さい)
//確認画面の入力内容出力用関数
この関数の中の以下の箇所
を以下のように上下に「//これを追加」の行を追記して下さい。(上下に1行ずつ追加してます)
これだけです。
万が一なんらかの不具合があった場合にはすぐに戻して下さい。
記述が間違っている可能性があります。一字一句間違わないようご注意下さい。
※尚、旧バージョンの場合には該当行がありませんので、2014/1/26以降配布のプログラムのみ対象となります。
管理者宛メールの送信元アドレス(From)をユーザーのメールアドレスにしたい
【重要】2021/10/26以降にダウンロードいただいたもの(ver2.0.1以降)が対象です。それ以前のバージョンの場合はここの内容は無効です。
まず、2021/10/26のアップデートで管理者宛のメールの送信元アドレス(From)が固定のメールアドレス(mail.php内で設定している送信元メールアドレス($from="●●"))となるように改修しました。
※それまでは管理者宛メールの送信元(From)はユーザーが入力したメールアドレスとなっていました。
改修した理由はユーザーが入力したメールアドレスを送信元にしてしまうと、
「なりすまし」と判定されて
メールが届かないケースが出てきたためです。
昨今はスパムに対して非常に厳しくなってきております。
ユーザーのメールアドレスを送信元にすることは、
ユーザーのメールサーバーを経由しているわけではないので、
完全に「なりすまし」なのです。
実際には特に問題ないケースが多いのですが、
メールが届かないということは確実に回避しなければならないため、
アップデートにてそのように改修しました。
利便性は若干損なわれますが、
メールが届かないよりはいいよね?
という判断です。
ご理解の程お願い申し上げます。
尚、送信元(From)は固定のメールアドレスになりますが、返信先(Reply)はユーザーのメールアドレスになるので、
返信作業には影響ありません。
まずはこういったことを前提として、
その上でどうしても以前のバージョンの仕様のように送信元(From)をユーザーのメールアドレスとしたいという場合は以下の方法で可能です。
※トラブル防止のためにもクライアントのフォームで実施する場合は事前にクライアントにそういったリスクがあることを伝えたほうが無難です。
■管理者宛メールの送信元をユーザーのメールアドレスにする手順
mail.phpの以下の記述を探して下さい。1箇所しかないのでファイル内検索をすればすぐに見つかります。
$header="From: $from\n";
これを以下のように変更するだけです。
※$fromを$post_mailとするだけです。
$header="From: $post_mail\n";
これで完了です。念のためテスト送信を実施して反映されていることを確認して下さい。
ご利用について
HTMLやCSSなどをある程度理解されている方を対象としています。
設置、カスタマイズ方法などのサポートは行っておりませんのでご了承ください。
管理人1人で運営していますので。。。
設置法、フォーム(タグ)、CSS等に関するサポートは有料にて承ります。
有料サポートはこちら
不具合等があれば遠慮なくご連絡ください。
お問い合わせはこちら
動作確認済PHPバージョン
PHP4.3.9~PHP8.1
動作確認済レンタルサーバー
- エックスサーバー [PR]
※個人的にはここが好きで、もうずっとここです。このサーバーで困ることはまずないでしょう。
- ロリポップ! [PR]
※ただしここはWAF機能がONの場合、CMSプログラムで問題が発生する可能性が高いです。詳細はこちら
またサーバーがブラックリストに登録されてしまいメール系のプログラムで受信できない大問題も多々確認されています。詳細はこちら ただコスパ的には有りだと思います。
- カゴヤのレンタルサーバー [PR]
ここは高機能、高スペック、良心的な価格でありながら風俗系のサイトがOKという非常に貴重なサーバーです。個人的には風俗系のサイトであればこのサーバー以外の選択肢はないと思ってます。
- さくらのレンタルサーバ [PR]
その他一般的なレンタルサーバーであれば問題なく動作するはずですが、
すべての環境(サーバー)での動作を保証するものではありませんのでご了承下さい。
問題が出る可能性が高い、またはそのままでは必ず問題が出ることが分かっているサーバー
※現状私自身が把握している範囲です。(実際に確認していますのでちゃんと根拠もあります)
1,Yahoo系(ジオプラス、ウェブホスティングとも)※Softbankも含む
2,KDDI系(CPI含む)
3,NTT系(WebArena(suiteX)、NTTビズリンク(BizLink))
※プロバイダー系は特に問題が多いです。(個人的には絶対に借りてはいけないと考えています)
4,スマイルサーバー
5,ファーストサーバ
特にCPI、NTT系、スマイルサーバー、ファーストサーバで問題がある場合はこちらも参照下さい
経験上、結局は「餅は餅屋です」。プロバイダー系はプラン、金額に関係なく特に問題が多いです。サーバーの問題で時間を取られるのは非常に無駄ですし、その先ずっと影響しますのでサーバー選びは慎重にされることをオススメします。
特に理由がなければあえてこれらのサーバーは借りないほうが得策でしょう。高いから良い、安いからダメという安易なものでもありませんので難しいところですね。(まぁ安いには安いなりの理由があるのですが・・)
ご利用規約
・無料版プログラムはフリーウェアです。ただし、著作権は放棄するものではありません。
・プログラムの著作権表示リンク(ページ下部にある当サイトへのリンク)を無断で削除することはできません。
(一律2,000円+消費税の削除依頼をいただいた場合を除く)
・プログラムの再配布、再販売は禁止です。
※ただしクライアントへの納品などでシステム費用、設置費用として請求されるのは問題ありません。
・プログラムによって何らかの不利益、損害が生じても一切の責任を負いません。
あらかじめご了承の上ご使用ください。
もし何らかのトラブルがあった場合には、ご相談いただければ解決策が見つかるかもしれません。
(クライアントへの原因の説明など)
・プログラムは全ての環境(サーバー)での動作を保証するものではありません。
・改変等は自由ですが、自己責任でお願いします。
・有料版をご購入いただいた場合、初期不良を除き、ご使用後の返金には応じ兼ねます。
・有料版(著作権リンク削除含む)は1サイト(同一ドメイン)内であれば複製の上で複数利用可能です。
2サイト目以降は都度サイトより購入申込みが必要になります。
※サブドメインはその性質上、別サイト(別ドメイン)とみなします。
ダウンロードいただいた時点で利用規約に同意したものとみなされます。
著作権表記リンク削除について
削除をご依頼されたい方は1サイトあたり2000円になります。
ただし、このページの【MailForm01】フリー版のメールフォームに限り、ご自身で削除できる方は削除いただいて構いません。その場合、料金お支払いの必要もございません。
また、このページのフリー版メールフォームについてのみですが、著作権リンク表示があるのはデフォルトの送信完了画面のみです。
自身で完了画面(サンクスページ)を用意し、ファイル内でURLを指定しリダイレクト設定すれば著作権リンク自体発生しません。これはmail.php内の設定箇所で設定可能です。
(これらはあくまでも【MailForm01】フリー版のみの特例です。)
自身で著作権表示を削除する自信が無い、またはカンパとして^^;お支払いいただける方は以下よりお申込みいただければと思います。
著作権表示リンク削除ご依頼はこちらです
カスタマイズ、設置代行について
カスタマイズ(改造等)方法などのサポートは行っておりません。
カスタマイズや仕様変更、設置代行などは2,000円~の有料にて承ります。
フォームページとセットでの設置代行も承ります。※4,000円程度(項目数により変動有り)
ご依頼・お見積もりはこちらです
カスタマイズ実績例
- プルダウン、またはラジオボタンの選択状態によって、送信先を振り分けたい(有料版として販売しました)
- 確認画面と自動返信メールで特定の項目(ファイル内で指定可能にします)を表示しない(hidden要素等)
- 確認画面に既存のサイトのデザインを反映させたい
- 郵便番号を入力したら自動で住所が入力されるようにしたい(Javascriptにて実装します)
確認画面や自動返信メールで複数の特定の項目を連結させたい(日付、郵便番号、電話番号や住所等)
デフォルトの機能として追加しました。
- 必須チェックをリアルタイムで行いたい(Javascriptにて確認画面に行くこと無くチェックします)
- 複数の数字入力などを自動で計算させたい
- 抽選を行いたい(プレゼントや各種応募など)
- フォームのある項目の選択状態に応じて完了画面(メッセージ等)を切り替えたい
- 送信内容をデータベースに保存して管理画面上で閲覧、及びCSVをダウンロードできるようにしたい(システム制作として承ります)
その他柔軟に対応しますので、どんなことでもまずはお気軽にご相談下さい。
チェックボックス使用時の注意点
※name属性の値を配列形式(用語は知らなくてもOKです)にする必要があります。(phpファイル内にも説明があります)
通常name属性は name="名前" とかにしますが、チェックボックスは同じname属性の値がフォーム内に複数存在することになるため、すべてname="名前[]"としてください。値の後ろにカッコを2つ追加します。これだけです。また同梱しているサンプルのcontact.htmlを見ていただければ分かると思います。
セキュリティ(脆弱性)対策について
当プログラムで行なっている対策をご紹介します。
一般的に考えうるリスクには対策を施しています。
クロスサイト・スクリプティング対策(XSS)
HTMLタグはhtmlspecialcharsにて適切にエスケープ(サニタイズ)していますので、ページ上でHTMLタグが有効になることはありません。
また念のため送信メールに対しても同じようにエスケープしています。メールはテキスト形式で送信していますので、本来は問題ありませんが、仮にhtml形式で受信したとしてもhtmlタグが有効になることはありません。
メールヘッダ改ざん対策
メールヘッダを改ざんされることによって大量送信の踏み台にされるなどのリスクがありますので、メールヘッダにはユーザー入力のメールアドレス以外は固定値としています。またこの入力されたメールアドレスも形式チェックを行っています。また@マークが1つで有るかどうかもチェックしますので、1つのメールアドレス以外が含まれることはありません。
外部サイトからのPOST送信対策
※CSRF(クロスサイトリクエストフォージェリ)対策
ワンタイムトークン(PHPセッション)によるスパム対策、CSRF対策、及び簡易版のリファラチェックを導入しています。
外部からの意図しない不正な送信などは受け付けません。
更新履歴
2024/05/24 改善アップデート(ver2.0.4)
メーラー上でのメール管理を便利にする機能として管理者宛メールの送信元(差出人)にユーザーが入力したメールアドレスを表示できる機能を追加。
この機能は配布版の標準ではOFFになっていますので必要に応じてONとしてください。
mail.phpの「$from_add = 1;」という箇所です。
「なりすまし」扱いによってメールが届かない問題を回避するため、2021/10/26のアップデートで管理者宛メールの送信元(差出人)メールアドレスを$fromで設定したメールアドレスとしましたが、
それによってメーラー上ではすべて同じ送信元(差出人)となるため使い勝手が悪くなるというデメリットがありました。
それを改善するため、送信元(差出人)にユーザーのメールアドレスを含めることでメーラー上での管理がしやすくなる機能です。
例 example@gmail.com <from@sample.jp>
この場合、example@gmail.comがユーザーのメールアドレス、from@sample.jpが$fromで設定したメールアドレスです。
こうすることでメーラー上では「example@gmail.com」でも「from@sample.jp」でも検索ができます。
またこのようにしても送信元メールアドレスはあくまでも「from@sample.jp」となるため、「なりすまし」とはなりません。(ただし、すべての環境での保証はできません)
■古いバージョンのプログラムへの反映について
もし古いバージョンのプログラムへ導入されたい場合は以下手順で可能です。
mail.php内の以下を探してください。1箇所しかありません。
$header="From: $from\n";
↓以下に変更してください。そのままコピペOKです。
動作確認にて管理者宛のメールの送信元(差出人)が意図したとおりになっていることを確認してください。
上記のとおり、送信元(差出人)が以下のようになります。
入力したメールアドレス<$fromに設定しているメールアドレス>
2022/02/01 軽微なバグの修正アップデート(ver2.0.3)
-- 該当する製品名およびバージョン
ver2.0.0~ver2.0.2(2021/05/20~2022/02/01までにダウンロードいただいたメールフォームプログラム)
全角→半角変換機能を利用していて、かつtextareaの項目を設定し、改行を含む入力をされた場合、確認画面以降で改行タグが入り込んでしまう不具合を修正しました。
全角→半角変換機能はデフォルトではOFFであること、及び、通常は電話番号や郵便番号、メールアドレスなどの項目に設定することが多く、textareaを使ったコメント欄に使うことは極稀であることから、これまでバグの存在が発覚しておりませんでした。
2021/05/20の脆弱性対策のためのアップデート時に全角→半角変換処理に一部変更を加えたことにより発生した不具合でした。
ご報告いただいたS様にはこの場を借りて感謝申し上げます。
修正方法:
該当する方は極々少数だと思いますし、必ずしも修正する必要はありませんが、必要に応じて修正して下さい。
1,mail.php内の「//確認画面の入力内容出力用関数」を探して下さい。
(1箇所しかありませんのでファイル内検索ですぐに見つかります)
その関数内の以下の記述を探して下さい。
この記述を以下記述の上に移動して下さい。
2,mail.php内の「//全角→半角変換」の関数を探して下さい。
以下の記述を
$out = h(mb_convert_kana($out,'a',$encode));
以下に変更して下さい。
$out = mb_convert_kana($out,'a',$encode);
※h()を削除しただけです。
以上です。
2021/11/11 軽微な修正によるアップデート(ver2.0.2)
不要となった記述の削除と通常は影響のない程度のCSSの軽微な修正。
2021/10/26 改善アップデート(ver2.0.1)
管理者宛メールの送信元メールアドレスを固定のメールアドレスとする改修を実施。
これまで管理者宛メールの送信元メールアドレスはユーザーが入力したメールアドレスとしていましたが、
受信環境によっては迷惑メール(なりすまし)扱いされることがあるため、元々付いていた機能でもあるユーザー宛の自動返信メールの送信元メールアドレスを管理者宛のメールでも送信元としました。
返信先(reply)はユーザーのメールアドレスとなりますので返信作業には特に影響はありません。
2021/05/20 反射型クロスサイトスクリプティングの脆弱性発覚について(ver2.0.0)
JPCERT/CC 脆弱性コーディネーショングループ様よりご連絡をいただいた、ある特定の条件下で発生する脆弱性に対応するためソースコードの一部を修正しました。また既存ファイルの修正方法についてもこのページに掲載致しました。
実際には複数の条件が揃わなければ発生せず、また特定の機能をONにしている必要があることから、現在設置中のフォームが実際に問題となる可能性は低いと考えていますが、念のため以下手順にて修正いただきますようお願い致します。
尚、条件の1つとして「全角英数字→半角」に変換する機能をONにしていることが条件となりますのでOFFの場合は特に問題ありません。(配布版のデフォルトではOFFです)
設置サイト、及びそのサイトの運営者(管理者)、関係者等が直接被害を受けるようなものではありません。
尚、今現在実害の報告等はいただいておりません。
セキュリティについては十分に注意、検証しておりましたが、結果としてこのような事態となり、お手数、ご迷惑をおかけし大変申し訳ございませんでした。
今後このようなことが無いよう細心の注意を払って参る所存です。
-- 脆弱性に該当する製品名およびバージョン
PHP多機能メールフォームプログラムのmail.phpファイルの上部に記載の最終更新日が
2014年12月12日から2018年7月27日までのバージョン。(無料版、有料版とも対象)
-- 脆弱性の内容
悪意のある第三者が作成した罠ページへ誘導された場合に、特定のリンクをクリックさせることによって任意のスクリプトが実行される可能性。
-- 脆弱性への対応方法と適用方法
最新版をダウンロードいただき、既存のmail.phpを差し替えていただくか、
以下手順にて既存ファイル(mail.php)を修正して下さい。 1箇所のみです。
mail.phpの507行目付近の以下の箇所(バージョンなどによっては行数が異なります)
※ファイル内で1箇所しかありませんので間違うことはありません。
※「全角→半角変換」の関数内の記述です。
$out = mb_convert_kana($out,'a',$encode);
↓以下のように修正いただくか、そのままコピペください。
$out = h(mb_convert_kana($out,'a',$encode));
またはソースコードを修正されたくない場合は
以下の設定を確認していただき、「1」になっている場合は「0」にすることでもOKです。
※ただし、この機能はOFFになります。
//全角英数字→半角変換を行うかどうか。(する=1, しない=0)
$hankaku = 0;
お手数ですが、修正後は必ず送信テストを行っていただき、問題の無いことをご確認下さい。
問題が出た場合にはお気軽にお問い合わせよりご連絡下さい。
-- 謝辞
apple502j様並びに情報処理推進機構 IPA様、JPCERT/CC 脆弱性コーディネーショングループ様にはこの場を借りて感謝申し上げます。
2020/05/08 PHPのバージョンが最新の7.4の場合に特定の環境で「Deprecated」エラーが出る問題を修正しました。
PHPのバージョンが7.4以降の場合、get_magic_quotes_gpc()関数が非推奨となったため、環境によってはDeprecatedエラーが表示される場合があるためです。
旧バージョンをお使いの方はお手数おかけしますが、下記修正方法をご参照の上で修正してください。
※今現在はPHP7.4未満であっても先々を考慮し、出来る限り修正されることをお勧め致します。
【対象バージョン】
2020/05/08以前にダウンロードされた全バージョン。
【原因】
PHPのバージョンが7.4以降の場合、get_magic_quotes_gpc()関数が非推奨となったため、環境によってはDeprecatedエラーが表示される場合があります。
【修正方法】
修正方法は以下となります。
mail.phpをエディタソフトなどで開いて「get_magic_quotes_gpc()」の文字をファイル内検索して下さい。
フリー版の場合は2箇所、有料版の全機能搭載版の場合は4箇所あります。
あとはその行を1行まるっと削除するだけです。
または先頭にスラッシュ2つ「//」を付けてコメントアウトして下さい。
例 //if(get_magic_quotes_gpc()) ・・・・・
これでエラー表示が消えるはずですので確認して下さい。
get_magic_quotes_gpc()関数はmagic_quotes_gpcという設定がONかどうかチェックするためのものですが、 「magic_quotes_gpc」自体はPHP5.4で完全廃止されたため、本来は不要な記述ですが、古いバージョンでの利用も考慮し念の為に残しています。
ですので、PHP5以上であれば不要な機能なので削除して構わないのです。
2018/08/06 EUC-JP版の不具合修正
※EUC-JP版独自の問題であるため、文字コードがEUC-JP以外のプログラムは関係ありません)
主な変更点
アップデートによって機種依存文字の置換処理を実装しましたが、EUC-JP版のメールフォームの場合にその処理が原因(ミスマッチ)で特定の文字が文字化けするという現象が確認されましたので修正しました。
UTF-8以外の文字コードのメールフォームプログラムではこの機種依存文字の置換処理を無効化する必要がありました。 (Shift_JIS版は当初から無効化していました)
すでに配布版にも修正を実施しましたので、
2018年7月28日~8月6日までの期間にEUC-JP版をダウンロード頂いた方は、お手数おかけしますが、 今一度ダウンロードいただくか、またはmail.phpの置換処理の設定箇所で以下のように内容を空にして無効化して下さい。
//変換前の文字
$replaceStr['before'] = array();
//変換後の文字
$replaceStr['after'] = array();
文字コードがEUCの場合はUTF-8とは機種依存文字の扱いが異なるため、現実的に置換処理を実装すべきでなかったということでした。
今はEUC-JPの利用が少ないということもあり、検証が十分でなかったと反省しております。ご報告いただいたI様にはこの場を借りて感謝申し上げます。
2018/07/28 スパム対策とセキュリティの強化、及び機能追加のアップデート
主な変更点
※いずれもmail.phpで設定可能です。
1,ワンタイムトークン(PHPセッション)によるスパム対策、CSRF対策(デフォルトはON)
PHPのセッションを使ったスパム対策、CSRF対策であるワンタイムトークンを実装しました。
経験上、スパムに対して非常に有効です。(ただし、手口も随時変わるため将来的なことまでは分かりません)
※ただし、この機能を使う場合は送信確認画面の表示が必須です。(デフォルトではONになっています)
【重要】ガラケーは機種によってはクッキーが使えないためガラケーの利用も想定してる場合はOFFにして下さい(PC、スマホは問題ないです)
尚、セッションによるトークン機能はあくまでも裏で動作しているものであるため、フォームを使う側も管理する側も通常のフォームと何ら変わりありません。特に意識する機会もありません。(何らかの負担やデメリットが増えるものではありません)
そうなると本当に機能しているのか?と疑問に思うかもしれませんが、外部のサイトからmail.phpに送信してみていただくか、または完了ページへのリダイレクト機能をOFFにして、入力→確認→送信のあとにブラウザのF5キーで再送信してみると「ページ遷移エラー」と表示され、トークンが機能して送信できないことを確認できます。
今まで配布版に導入していなかった主な理由は以下です。(この下に展開されます)
1,ガラケーの非対応問題(これが一番の理由です)
PHPのセッションはブラウザのクッキーを使用しますが、ガラケーの場合、機種によってはクッキーが使えないためガラケーの利用も想定している場合に導入できないという問題がある。
それでも知らずに使っていた場合にはガラケーからの問い合わせができなくなってしまうという致命的なリスクが有る。
※この問題を当サイト内などでアナウンスしても全員に認識してもらうのは現実的に不可能と考えられる。
※そもそも問い合わせするユーザーの環境を事前に把握することは不可能ということもある。
(PCサイトであってもガラケーで閲覧、問い合わせするユーザーも当然いると考えられるため)
2,稀にセッションがデフォルトの状態では使えないサーバーも存在していることもある。
3,当プログラムは確認画面の有り、無しを選択できますが、確認画面無しとした場合は入力フォーム側にワンタイムトークン用の記述を行う必要があり、その場合、入力フォーム側も拡張子を.phpとする必要があるなど、様々な問題が絡み、導入の敷居が一気に高まる。そのためワンタイムトークンを導入すると現実的に確認画面有りでなければならないものとなってしまう。
4,ページ遷移の仕方によっては「ドキュメントが有効期限切れです」と表示されてしまう。
たとえば入力フォーム→確認画面→戻る→ブラウザの進むボタンとするとは「ドキュメントが有効期限切れです」と表示されます。一般ユーザーはこういったページ遷移はまず行わないと思いますが、導入される方がテスト時などにこういったエラーが出た場合に戸惑うことが想定される。
5,元々デフォルトの機能で付いているリファラチェックでも一応は対策となる
※配布版のデフォルトではOFFとなっています。
こういった事情があり、今までは導入を見送っておりました。
ただ、
・現代ではガラケーが圧倒的に少なくなった(またはほぼ無視できる)
・現代ではPHPのセッションが使えないサーバーはほぼない
・スパムが増えてきている(手口もより巧妙になってきている)※これが一番の理由です。
・ON、OFF出来るように実装した。
などの現状から配布版への実装を決定しました。またワンタイムトークン機能は簡単にON、OFF出来るようにしましたので、たとえばガラケーでの問い合わせも想定しているフォームの場合は
OFFにすることで対処できます。
尚、当サイトで配布しているCMSプログラムについてはすべてCSRF対策としてワンタイムトークン機能をすでに実装済です。(CMSの場合は管理画面には管理者のみがアクセスするためメールフォームのような問題が起きないため)
2,自動返信メールの送信元メールアドレスを設定できるようにしました。
今までは管理者のメールアドレスがユーザー宛の自動返信メールの送信元に設定されていましたが、自動返信メールの送信元と受信するアドレスを分けたい場合も考慮し、追加しました。
3,-fオプションによるエンベロープFrom(Return-Path)の設定(デフォルトはOFF)
メール送信時にmail関数の第5引数に-fオプションによるエンベロープFrom(Return-Path)を設定できるようにしました。稀にサーバーによってはこの設定が必須の場合もある、また環境によってはこれを適切に設定したほうがスパム扱いされにくいなどの理由から追加しました。
ただ、これの良し悪しはケースバイケースでもあり、判断が難しいところです。Return-Pathに設定されるメールアドレスはmail.phpで設定した送信元メールアドレス($from)です。基本的にはこの送信元メールアドレス($from)のドメインが設置先サイトのドメインと同じ場合のみONとして下さい。でないとスパム扱いされる可能性が高まります。またサーバーのSendmail系の設定によっては逆にスパム扱いされる可能性が高まることもあるため、あくまでも必要に応じてONとして下さい。またONとした場合は十分に動作検証を行って下さい。
この件の詳細は以下ページもご参考下さい。
フォームから送信されたメールが迷惑メール扱いされる場合の対策
尚、これをONにすると、ユーザーが入力したメールアドレスへの自動返信メールで送信先が見つからなかった場合に管理者宛に「Mail Delivery System」から「Undelivered Mail Returned to Sender」というメールが届きます。
※宛先不明で戻ってきたことを意味します。
4,機種依存文字の変換(常にON)
㈱や①などの機種依存文字はメール内で文字化け(?と表示)してしまうため、確認画面の表示の段階で置換処理を行うようにしました。置換する対象文字はmail.phpにて自由に設定できます。デフォルトではメジャーな機種依存文字をいくつか設定していますので必要に応じて自由に追加下さい。
5,レスポンシブ対応としました。
配布版のcontact.html及びmail.phpのhead部にレスポンシブ用のCSSを記述しています。
ただし、あくまでも必要最低限のCSSのみとしていますので、設置されるサイトに合わせて修正、または追加などを自由に行なって下さい。(もちろんデフォルトの記述を無視してもOKです)
以上です。
十分に検証を行った上でリリースしていますが、アップデート直後は環境などによっては未知のバグが無いとも限りません。もしお気づきの点などがありましたらお問い合わせより遠慮なくご報告いただければと思います。
2015/10/20
フォームでメールアドレスが入力されていない場合で、かつ自動返信メールをONにしている場合、サーバーによっては送信時にエラー表示されてしまう可能性があるものをメールアドレスが入力されている場合のみ送信するよう修正しました。(極々稀なケースですので基本的には問題ありません)
2014/12/12
主な変更点
1,電話番号や郵便番号、日時などを複数の入力箇所に分けている場合に任意の連結文字(ハイフンなど)で連結可能になりました。また、入力文字の末尾に任意の文字列(単位等)を追加できるようになりました。
今までは単純に入力文字だけが表示されるものでしたので、たとえば「人数」や「日時」入力箇所では数字が表示されるだけでしたが、入力文字の後ろに「人」や「月」、「日」などが追加可能となりました。
表示例 【人数】10人、【金額】10,000円、【日時】10月11日12時50分
(追加文字が「円」が含まれる場合でかつ半角数字のみの場合には自動で3桁ごとにカンマが付きます)
この機能はあくまでもオプションです。必要が無ければ使う必要はありませんし、特に意識する必要もありません。今までとおりの使用法で問題ありません。
こちらのマニュアルを以下に用意しましたので、必要に応じてご参照下さい。
項目連結、文字列追加オプションの解説
2,入力された全角英数字を半角に変換できるオプションを追加しました。デフォルトはOFFになります。ファイル内の設定箇所のコメントを参考に必要に応じてご使用下さい。
2014/12/10
主な変更点
・必須項目に数字の「0」のみを入力した場合に未入力となってしまう不具合を修正しました。
2014/7/10
主な変更点
・PHP5.1以上の場合のみデフォルトのタイムゾーン設定を行うよう修正。
これはPHP5.1以上の場合で、サーバー側でデフォルトのタイムゾーンが設定されていない場合にエラーが表示されることを防止するためになります。(ほとんどのサーバーではデフォルトのタイムゾーンが設定されていますが、稀に設定されていないことがあるため)
「よくある質問」にて対処法を掲載しておりましたが、本体に実装しました。
・クロスサイトスクリプティングの脆弱性発覚に伴うコードの一部修正を行いました。
現在配布しているものはすでに修正済ですので、これからダウンロードされる方は問題ありません。
詳細については以下をご確認下さい。
クロスサイトスクリプティングの脆弱性対策について
2014/1/28
主な変更点
・プログラムの動作には特に影響はありませんでしたが、必須設定を設定した際に、
入力項目(type="text")、プルダウン(select)の場合には「○○が未入力です」、
チェックボックス(type="checkbox")、ラジオボタン(type="radio")の場合には「○○が未選択です」
と確認画面で表示されますが、この順番がフォーム内容の順番通りではなく、「○○が未入力です」がまとめて上段に表示され、「○○が未選択です」が下段にまとめて表示されていたものをフォーム内容の順番通りに表示されるよう修正しました。
2014/1/27
主な変更点
・昨日ダウンロードファイルを1つに統合としましたが、やはり文字コード毎にダウンロードファイルを分けました。
これは一部サーバーでphp.iniの設定「mbstring.encoding_translation」が「ON」になっている場合にこれを「OFF」にしないと現実的には運用が難しいということが発覚したためです。「ON」になってしまっているサーバーでの症状や対処法などは以下にまとめましたのでご参考下さい。
※ただデフォルトは「OFF」のため「ON」となっているサーバーはごくごく少数です。
http://www.php-factory.net/blog/?id=7976352e60aac7ec0b
・「確認画面を表示しない」と設定した場合に、管理者宛送信メール内の「問い合わせのページURL」の箇所が空欄になってしまうバグを修正しました。
2014/1/26
主な変更点
・メンテンナンス性向上のため、ダウンロードファイルを1つとしました。1ファイルでShift-JIS、EUC-JP、UTF-8に対応可能としました。(デフォルトはUTF-8) やはり文字コード毎に分けました。
・メンテナンス性、作業性、コードの可読性向上のため、大部分を関数化するなどソースコードの大幅な修正を行いました。変数名も必要に応じて変更しています。
・メールアドレス入力欄を必須にしたくない場合で、「メールアドレスの形式チェック」をONにしていると必須扱いとなっていたものを入力された場合のみチェックするよう修正しました。
2013/6/19
主な変更点
・PHP5.4に対応しました。以前配布中のものはPHP5.3までしか対応しておりませんので、PHP5.4で設置予定の方は現在配布中の最新版をダウンロードください。
・自動返信メールで「○○様」と表示させたい場合に、以前は「name="名前"」とする必要がありましたが、name属性の値を指定できるよう変更しました。
2013/6/15
主な変更点
・Shift_JIS版で「表」、「申」、「ソ」などがname属性の値に含まれている場合、円マーク(¥)が付与される不具合を修正しました。サーバーのphp.iniの設定で「magic_quotes_gpc」が「On」になっている場合に発生します。SHift_JIS版の場合はその他の日本語でも同様の不具合が発生する可能性がありますのでご了承下さい。
※これはテスト時にすぐに分かるものなので、テスト時に問題が無ければ以降も問題ありません。(起こったり起こらなかったりということは基本的にありませんので)
・EUC-JP版を追加しました。
2013/4/19
主な変更点
・ご要望の多かったBcc設定を可能に。(デフォルトはOFF)
・自動返信メールの送信者欄に表示される名前を設定可能に(すべてのメーラーでの確認はしておりませんので、万が一お使いのメーラーで文字化け等が起きる場合には設定箇所を空(”)にしてください)
・スパム対策にリファラ(直前に見ていたページのURL)を取り、お問い合わせページとプログラムのドメインが違う場合には送信できないように設定が可能に。(デフォルトはOFF)
※ただし、これでスパムが完全に防げるわけではありませんのでご了承下さい。
・メールアドレスの形式チェックを導入しました。(デフォルトはON)
(メール入力欄のname属性の値が「Email」である必要があります)
※これらすべては配布中のmail.php内にて設定可能です。コメントを参考に設定下さい。
2012/11/25
主な変更点
tetsu様よりご指摘いただいた、「確認画面を表示しない」かつ「必須項目を設定する」と設定した場合、必須項目の確認をスルーしてしまうバグを修正しました。この場をお借りしてtetsu様に感謝申し上げます。
2012/10/28
主な変更点
・オリジナルの署名表記が可能に。(デフォルトは無し)
・確認画面にオリジナルのデザインを反映したい場合、反映しやすいようコードを変更(コメントを参考にHTMLの編集などが可能)※ただし、変更は自己責任で。
・確認画面でコメントの改行が反映されるようコードを修正。
・管理者宛のメールに「問い合わせのページURL」を追加。(問い合わせページのURLを表示)