2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at
スクリーンショット 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で泣き言をよく呟いてます。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?