Help us understand the problem. What is going on with this article?

お問い合わせフォームからのメール送信が実装できたので書きます。

スクリーンショット 2020-05-05 15.58.11.png
ダンサーの傍、webデザインや制作、プログラミングをやってます。
4月〜はダンサー自粛中ですので自分の大道芸の方のLPをリニューアルしようと思いデザインとフォームの修正をはじめました。
デザインの方は、まだ途中ですが、とりあえず機能を実装を終わらせようと、せっかくなのでメールフォームから送信!ってできるようにするか〜と思い実装始めたらまんまとはまりまくりました。

mb_send_mail関数ではgmailが届かない??!

いろんな記事を読んで、「このままコピペして、変数さえ変更すれば簡単じゃ〜ん」と甘くみていたらもうエラーエラーの連続でした。
で、色々読んでいくとmail関数というものがあったり、その中でもSTMP送信?なにそれ?レベルだったのですが、私はXサーバーを借りて、それでやってるので、ここはどうやら関係なさそう。ちなみに私はこのあたりの知識が皆無なので割愛します。

PHPのmb_send_mailでメールが届かない原因と特定のメールアドレスだけ届かない原因

送信の流れ

本当は確認画面を表示して、そこから送信の流れに持って行きたかったのですが
最終的にはLP上のフォームに入力→送信ボタン→送信完了(送信内容を送信相手に受信させる)
という流れになりました。
index.php→send.php

煩雑ですがこちらがコードです

index.php
 <?php
        session_start();

        //クリックジャッキング対策
        header('X-FRAME-OPTIONS: SAMEORIGIN');

        // トークン生成
        if (!isset($_SESSION['token'])) {
            $_SESSION['token'] = sha1(random_bytes(30));
        }

        // HTML特殊文字をエスケープする関数
        function escape($str) {
            return htmlspecialchars($str,ENT_QUOTES,'UTF-8');
        }
    ?>

中略

            <div class="form">     
                <h2>Contact</h2>
                <p>お仕事のご依頼などこちらからお問い合わせください</p>

                <form action="functions/send.php" method="Post">      
                    <div class="form-title">
                        <dl>
                            <dt>お名前
                                <dd>
                                    <div>
                                        <input type="text" name="namedata"  placeholder="例) 花子" class="inputText namearea" required>
                                    </div>                              
                                </dd>
                            </dt>
                            <dt>
                                E-mail
                                <dd>
                                    <div>
                                        <input type="text" name="mailarea"  placeholder="例)info@gmail.com" class="inputText mailarea" required>             
                                    </div>
                                </dd>
                            </dt>
                            <dt>
                                お問い合わせ内容
                                <dd>
                                <textarea name="textboxdata" placeholder="お問い合わせ内容を入力" class="inputText textboxarea" required>
                                </textarea>
                                </dd>
                            </dt>
                        </dl>                       
                        <div class="makesurebox">
                            <input type="submit" class="btnStyle1" value="送信する" />
                        </div>                               
                        </div>
                    </form>
            </div>

form actionで次に送りたいsend.phpに飛ぶように
actionはpostです。
次にsend.phpです。最初は確認ページなども作っていたのでフォルダをfunctionsというのを作って入れています。なのでfunctions/send.phpを指定してます。

functions/send.php
<body>
    <?php          
        header("Content-Type:text/html; charset=UTF-8"); 
        mb_language("Japanese");
        mb_internal_encoding("UTF-8");

        $to = "hogehogeinfo@gmail.com";
        $title = "お問い合わせがありました";

        // メール本文
        $message = "名前:" . $_POST["namedata"] . "\n本文:" . $_POST["textboxdata"];

            if (!mail($to, $title, $message, "From: " . $_POST["mailarea"])) {
            exit("error");
            }
     ?>  
        <!--送信完了ページの文言-->
        <div class="sendpg">
            <h4>送信完了しました</h4>
            <p>お問い合わせありがとうございました!</p>
            <div class="btnStyle3">
                <a href="../index.php">Topに戻る</a>
            </div>
        </div>       
    </body>

to は自分の受信させたいメールアドレス
title はメールのタイトル

$messageにお問い合わせ元、メアド、名前といった最低必要条件のみ、とりあえず入れます。index.phpのフォームで入力された値をそのままぶち込みます(自分宛のメールだからとりあえず)

そのあとのmail関数ですが、ここがmb_send_mail関数だとエラーでメールが届かなかったところです。どうやらgmailがはねられてしまうらしい、、?この辺が謎なんですが。なのでmail関数で対応しました。

mail($to, $title, $message, "From: " . $_POST["mailarea"])
//自分のメアド、メールのタイトル、メール本文、送信元

この4つを入れて、今回はこれらが!な時はエラーを出す
という指定をしています。

PHPほとんど勉強したことがなくて、挙動がちょっとイマイチよくわかってないんですが(phpの問題ではないのか?)
mb_send_mail関数でつまずいている方はmail関数のこちらで試してみてください。
参考にさせていただいたのは以下の記事です、こちらはmb_send_mailを使ってますが、ここをmail関数に変更しました。

メールの送信
メールを送信 - mail()、mb_send_mail()

結構、意味がわからないところがたくさんありすぎて、PHPちゃんと勉強してみようかなと思いました。Twitterで泣き言をよく呟いてます。

acro_y
本業はポールダンサー・エアリアルダンサーです instagram: @u_ki_acropole 副業ブロガー インストラクター エンジニア見習い webデザイン やってます。 個人開発したポールダンスの自主練習のためのwebサービス https://poletricks.herokuapp.com
http://simpledancer.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした