質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Postfix

Postfixは、電子メールサーバソフトウェアで、 メールを配送するシステムMTAの一種です。

Q&A

2回答

5014閲覧

PHPでWEBのフォームと自動返信メール

退会済みユーザー

退会済みユーザー

総合スコア0

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Postfix

Postfixは、電子メールサーバソフトウェアで、 メールを配送するシステムMTAの一種です。

0グッド

1クリップ

投稿2018/09/13 11:47

編集2018/09/14 04:24

前提・実現したいこと

PHPでWEBのフォームと自動返信メールの実装の練習をしているのですが、
自動返信メールが届きません。

詳細

プログラミング初学者で、PHPを勉強し始めた者です。

MacにてPHPで自動返信メールフォームの実装の練習の為、以下のサイトのコードを、
簡易ウェブサーバー(ターミナルでrootにて $php -S 127.0.0.1:8080)で実行したところ、ブラウザ上でPHPにてフォームは表示され、”送信が完了しました”の画面までエラーなく進みますが、フォームに入力されたアドレス('email')にメールが届きません。
https://gray-code.com/php/make-the-form-vol3/

PHPのフォームは、閲覧者がnameとemailを入力後、確認画面が表示され、
さらにsubmitするとPOSTで受け取ったemailにメール送信+運営側(自分)へも確認メールが届く仕組みです。

※逆に書くとややこしくなるのかもしれませんが、PHPにいくつかのコードを追加する前、
($header関連と、'運営側への返信メール情報'を追加する前)
に一度試した時にはフォームに入力したメールアドレスへ期待通りメールが受信されました。
しかしその後、追加でそれらを書いた後に送信できなくなり、
もう一度送信できた状況を再現しようとコードを戻してみても、受信されない状況になってしまいました。

ブラウザ上でのPHPの実行・操作中はターミナル上では127.0.0.1:●●●●● [200]: /
というログがでるだけでエラーらしきものはありません。

コードはサイトを参考に自分で書きましたが、
最終的にサイトに載ってるもの(下記URL)を丸々コピーしても同じ状況でした。
https://github.com/gray-code/make-the-form/blob/master/vol3/index.php

送信先のメールアドレスはgmailのアドレスで、
全てのメールアドレスや迷惑メールなどを確認してもPHPによって送られるはずのメールはありませんでした。(他のメールや自身あてのメールは問題なく確認できました。)
フォームに入力するアドレスを変更し別のアドレスへ送信した場合も、
その別アドレスでメール受信は確認できませんでした。

コード追加前に一度送信できている点は引っかかるのですが、
この状況で確認すべき設定等ございましたらおご教示お願いいたします。
プログラミング自体ド素人で、PHPもPostfixやターミナル上の操作・設定なども殆ど初めて行うものでした。
如何せん独学の為、不足している情報も多々あるかと思います。
お手数ですが少し噛み砕いてご確認・ご説明やアドバイスいただけると嬉しいです。

lang

1<?php 2// 変数の初期化 3$page_flag = 0; 4if( !empty($_POST['btn_confirm']) ) { 5 $page_flag = 1; 6} elseif( !empty($_POST['btn_submit']) ) { 7 $page_flag = 2; 8 // 変数とタイムゾーンを初期化 9 $header = null; 10 $auto_reply_subject = null; 11 $auto_reply_text = null; 12 $admin_reply_subject = null; 13 $admin_reply_text = null; 14 date_default_timezone_set('Asia/Tokyo'); 15 $header = "MIME-Version: 1.0\n"; 16 $header .= "From: GRAYCODE <noreply@gray-code.com>\n"; 17 $header .= "Reply-To: GRAYCODE <noreply@gray-code.com>\n"; 18 // 件名を設定 19 $auto_reply_subject = 'お問い合わせありがとうございます。'; 20 // 本文を設定 21 $auto_reply_text = "この度は、お問い合わせ頂き誠にありがとうございます。 22下記の内容でお問い合わせを受け付けました。\n\n"; 23 $auto_reply_text .= "お問い合わせ日時:" . date("Y-m-d H:i") . "\n"; 24 $auto_reply_text .= "氏名:" . $_POST['your_name'] . "\n"; 25 $auto_reply_text .= "メールアドレス:" . $_POST['email'] . "\n\n"; 26 $auto_reply_text .= "GRAYCODE 事務局"; 27 // 自動返信メール送信 28 mb_send_mail( $_POST['email'], $auto_reply_subject, $auto_reply_text, $header); 29 // 運営側へ送るメールの件名 30 $admin_reply_subject = "お問い合わせを受け付けました"; 31 // 本文を設定 32 $admin_reply_text = "下記の内容でお問い合わせがありました。\n\n"; 33 $admin_reply_text .= "お問い合わせ日時:" . date("Y-m-d H:i") . "\n"; 34 $admin_reply_text .= "氏名:" . $_POST['your_name'] . "\n"; 35 $admin_reply_text .= "メールアドレス:" . $_POST['email'] . "\n\n"; 36 // 管理者へメール送信 37 mb_send_mail( 'webmaster@gray-code.com', $admin_reply_subject, $admin_reply_text, $header); 38} 39?> 40 41<!DOCTYPE> 42<html lang="ja"> 43<head> 44<title>お問い合わせフォーム</title> 45<style rel="stylesheet" type="text/css"> 46body { 47 padding: 20px; 48 text-align: center; 49} 50h1 { 51 margin-bottom: 20px; 52 padding: 20px 0; 53 color: #209eff; 54 font-size: 122%; 55 border-top: 1px solid #999; 56 border-bottom: 1px solid #999; 57} 58input[type=text] { 59 padding: 5px 10px; 60 font-size: 86%; 61 border: none; 62 border-radius: 3px; 63 background: #ddf0ff; 64} 65input[name=btn_confirm], 66input[name=btn_submit], 67input[name=btn_back] { 68 margin-top: 10px; 69 padding: 5px 20px; 70 font-size: 100%; 71 color: #fff; 72 cursor: pointer; 73 border: none; 74 border-radius: 3px; 75 box-shadow: 0 3px 0 #2887d1; 76 background: #4eaaf1; 77} 78input[name=btn_back] { 79 margin-right: 20px; 80 box-shadow: 0 3px 0 #777; 81 background: #999; 82} 83.element_wrap { 84 margin-bottom: 10px; 85 padding: 10px 0; 86 border-bottom: 1px solid #ccc; 87 text-align: left; 88} 89label { 90 display: inline-block; 91 margin-bottom: 10px; 92 font-weight: bold; 93 width: 150px; 94} 95.element_wrap p { 96 display: inline-block; 97 margin: 0; 98 text-align: left; 99} 100</style> 101</head> 102<body> 103<h1>お問い合わせフォーム</h1> 104<?php if( $page_flag === 1 ): ?> 105 106<form method="post" action=""> 107 <div class="element_wrap"> 108 <label>氏名</label> 109 <p><?php echo $_POST['your_name']; ?></p> 110 </div> 111 <div class="element_wrap"> 112 <label>メールアドレス</label> 113 <p><?php echo $_POST['email']; ?></p> 114 </div> 115 <input type="submit" name="btn_back" value="戻る"> 116 <input type="submit" name="btn_submit" value="送信"> 117 <input type="hidden" name="your_name" value="<?php echo $_POST['your_name']; ?>"> 118 <input type="hidden" name="email" value="<?php echo $_POST['email']; ?>"> 119</form> 120 121<?php elseif( $page_flag === 2 ): ?> 122 123<p>送信が完了しました。</p> 124 125<?php else: ?> 126 127<form method="post" action=""> 128 <div class="element_wrap"> 129 <label>氏名</label> 130 <input type="text" name="your_name" value=""> 131 </div> 132 <div class="element_wrap"> 133 <label>メールアドレス</label> 134 <input type="text" name="email" value=""> 135 </div> 136 <input type="submit" name="btn_confirm" value="入力内容を確認する"> 137</form> 138 139<?php endif; ?> 140</body> 141</htm>

PHP ### 試したこと Postfixのmail systemを下記サイトを参考に設定しました。 https://blog.ch3cooh.jp/entry/20170704/1499130000 設定したのは上記のフォームに入力したものと同じgmailアカウントで rootにて`$sudo postfix start`を実行すると `postfix/postfix-script: fatal: the Postfix mail system is already running`と表示されました。 しかし `$ date | mail -s test (メールアドレス)` を実行してもメールは届きません。 ターミナル側に特にエラーメッセージはありません。 ブラウザ上のPHPの操作でも同様に届きません。 追記⑴ 9/13 22時頃 具体的な操作 ①rootで `$ sudo vim /etc/postfix/sasl_passwd` `smtp.gmail.com:587 (username)@gmail.com:(パスワード)` を入力保存 ②`$ sudo vim /etc/postfix/main.cf` `relayhost=smtp.gmail.com:587 smtp_sasl_auth_enable=yes smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd smtp_use_tls=yes smtp_tls_security_level=encrypt tls_random_source=dev:/dev/urandom smtp_sasl_security_options = noanonymous smtp_always_send_ehlo = yes smtp_sasl_mechanism_filter = plain compatibility_level = 2` を追記保存 ③`$ sudo postfix reload` →postfix/postfix-script: refreshing the Postfix mail systemと表示される。 追記⑵ (起動したいPHPのパスはMAMPのhtdocs>form_demoフォルダ内にあり、ここをrootとしてます。この位置は問題ないでしょうか? `/Applications/MAMP/htdocs/form_demo/index.php`) ①php.iniのsendmail_path `/Applications/MAMP/bin/php/php7.2.8/conf/php.ini` `; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path ;sendmail_path = ` のままでしたので、 `sendmail_path = /usr/sbin/sendmail -t -i` に変更し保存しました。(http://d.hatena.ne.jp/psquare/20140108/p1を参照) ②Gmailの「安全性の低いアプリからのアカウントへのアクセスを許可する」に関わる設定変更 →完了しました。即反映ではないとのことなので、しばらく様子をみます。 ③Postfixのリロード `sudo vim /etc/postfix/sasl_passwd` `sudo postmap /etc/postfix/sasl_passwd` (この実行のあとは特に反応なく次の行に改行されるのですが、それは問題ないのでしょうか?) `sudo postfix reload` 念のため再度この設定をやり直すと postfix/postfix-script: refreshing the Postfix mail system と表示されました。 ④メールのログ出力 参照URLの情報より、ターミナルでrootにて`cd /var/log` →`cat maillog | grep "from=<送信元メールアドレス>"`と実行したところ、 ファイル(orディレクトリ)がないとの表示でした。 (cat: maillog: No such file or directory) ターミナルの別ウィンドウで、 log stream --predicate '(process == "smtpd") || (process == "smtp")' --info を実行後、ブラウザ127.0.0.1:8080にてPHPを実行したところ relay=smtp.gmail.com[●●●.●●●.●●●.●●●]:587, delay=0.84, delays=0.05/0/0.79/0, dsn=4.7.5, status=deferred (TLS is required, but our TLS engine is unavailable) warning: Digest algorithm "md5" not found warning: disabling TLS support PostfixのTLS設定?を追加する必要があるのでしょうか。 ざっとググっただけでは理解が追いつかなかったので、もう少し調べてみます。 有用そうな情報がございましたらご回答いただけるとありがたいです。 ⑤ファイアウォール・パケットフィルタリングについて ファイアウォールについてはON-OFFでそれぞれ試してみたのですが変化がありませんでした。ファイアウォールもですがパケットフィルタリングについてはさらに無知でした・・・調べてみます。試した方が良い設定があれば教えていただけるとありがたいです。 ### 補足情報(FW/ツールのバージョンなど) ブラウザ Chrome PHP v7.2.9 Mac Sierra 10.12.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/09/13 12:00

コードはマークダウンのコード機能を使ってください。また見たところローカルPCに構築した環境のようですがローカルPCでメールを送信する場合、デフォルトのままでは送信できません。そのあたりは何か調べたりされましたか?
退会済みユーザー

退会済みユーザー

2018/09/13 13:15

ご返信とアドバイスありがとうございます!マークダウン機能を使って編集してみます。Postfixから設定をいくつかしています。本文(試したこと)に追記させていただきました。MAMPというローカル環境を設定するソフトを入れたのですが、その後PHPの機能を利用してメール送信などするにはウェブサーバーである必要があるという情報を得て、PHPからhttp://127.0.0.1:8080/(ビルトインウェブサーバー)を起動するという方法を見て使っています。
CHERRY

2018/09/14 04:31

ちなみに MAMP も Web サーバーですよ。 まあ、メールの設定が必要なのは同じですが...
退会済みユーザー

退会済みユーザー

2018/09/15 06:43

ご返信ありがとうございます。そうなのですね…!いまいちサーバーの種類の認識ができてないのかもしれません。MAMPでも出来ないかも含め色々試しましたがTLSのエラーがどうしても出てしまいます。
m.ts10806

2018/09/15 06:53

MAMPが、というよりそれに含まれるApacheがWebサーバーですね。
guest

回答2

0

macOS ということで記載します。

rootにて$sudo postfix startを実行すると
postfix/postfix-script: fatal: the Postfix mail system is already runningと表示されました。

すでに Postfix が、起動している状態で、設定ファイルを書き換えた場合は、sudo postfix reload ( または sudo postfix stop して停止させてから sudo postfix start で起動。または Mac の再起動)を行わないと設定は反映されません。

rootで $ sudo vim /etc/postfix/sasl_passwd
smtp.gmail.com:587 (username)@gmail.com:(パスワード)
を入力保存

この後に sudo postmap /etc/postfix/sasl_passwd が必要ですが、実行されていますか?

実行していない場合、error: open database /etc/postfix/sasl_passwd.db: No such file or directory のエラーが発生していると思われます


Mac Sierra 10.12.6 でメールのログを確認するには、下記のコマンドを入力するとメールのログがリアルタイムに画面に表示されます。
(コマンドを実行するターミナルとは別に ログ表示用のターミナルウィンドウを開いて、下記のコマンドを実行してください。)

log stream --predicate '(process == "smtpd") || (process == "smtp")' --info

メールのログを確認しながらコマンドを実行して、エラーが表示された場合は、エラーメッセージを質問に追記してください。

投稿2018/09/14 02:32

編集2018/09/14 02:35
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/09/14 04:16

ご回答ありがとうございます! おかげさまでメールログの確認ができるようになったので、 問題解決に一歩前進といった感じがします。 エラーにあったTLSエンジンの有効化について調べてみます。
guest

0

macosユーザーじゃないけど気になった点を書き出してみます。

php.iniの設定値sendmail_pathは適切でしょうか。
phpから呼び出せるメール送信プログラムをここで指定しているので、
点検をお願いします。

また、phpプログラムの外側、メール送信プログラムに
必要な情報を引き渡して実行されるので、
当然php側(webサーバープロセス側)にはメール送信に関わるログが残りません。
適切にpostfixが構築され、sendmailに化けて(?)適切にpostfixに渡せているか、
(一時的にでも)ログ出力を強化すると良いでしょう。
Postfix トラブル調査でメールログを調べる手順

それと、gmail経由でメール送信するには、
送信に利用するgmailアカウントで「安全性の低いアプリからのアカウントへのアクセスを許可する」に関わる設定変更が必要です。
設定変更しても即反映されないため1~2日おいてから試してください。

また、言うまでもありませんが、ファイアウォールやパケットフィルタリングなどの設定も点検を。

投稿2018/09/14 01:27

編集2018/09/14 01:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/09/14 04:11

ご回答ありがとうございます! php.iniの設定値sendmail_path、Gmail、ファイアウォールやパケットフィルタリングのどれもが設定できていなかったので、本文中に記載した通り操作を試しました。 理解度が追いついていない部分があるので、さらに調べながらトライしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問