2017-01-10 4 views
1

連絡先を送信したメールを自分宛に電子メールで送信しますが、空のメールが受信されることがあります。私は、入力されたフィールドが空でないことを確認するためにバリデータのJavaScriptファイルを使用しました。空メールを受信する唯一の方法は、$_POSTが空であることです。私は、フォーム、JavaScriptファイル、およびPHPファイルを含む私のコードを含めました。

マイ形式:

<?php 

// configure 
$from = $_POST['email']; 
$sendTo = '[email protected]'; 
$fields = array('name' => 'Name', 'email' => 'Email', 'subject' => 'Subject', 'message' => 'Message'); 

try 
{ 
    $emailText = "\n=============================\n"; 

    foreach ($_POST as $key => $value) { 

     if (isset($fields[$key])) { 
      $emailText .= "$fields[$key]: $value\n"; 
     } 
    } 

    mail($sendTo, $subject, $emailText, "From: " . $from); 

    $responseArray = array('type' => 'success', 'message' => $okMessage); 
} 
catch (\Exception $e) 
{ 
    $responseArray = array('type' => 'danger', 'message' => $errorMessage); 
} 

if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    $encoded = json_encode($responseArray); 

    header('Content-Type: application/json'); 

    echo $encoded; 
} 
else { 
    echo $responseArray['message']; 
} 
:私が使用している

jQuery(function($) {'use strict', 
    var form = $('#main-contact-form') 
    var message = $('#error-message') 
    form.validator().on('submit', function (e) { 
     if (e.isDefaultPrevented()) { 
     message.fadeIn(); 
     } else { 

     e.preventDefault(); 
     $.ajax({ 
      type: "POST", 
      url: $(this).attr('action'), 
      data: form.serialize(), 
      beforeSend: function(){ 
       form.prepend(
        message 
         .html('<p>Sending...</p>') 
         .fadeIn() 
       ); 
      } 
     }).done(function(data){ 
      message.html('<p>' + data.message + '</p>').delay(2000).fadeOut(); 
      form.delay(2000).fadeOut(); 
      console.log("DONE"); 
     }); 
     } 
    }) 
}); 

sendmail.phpファイルは自分自身にフォームデータを送信するために:私のフィールドを検証するためのJavaScriptファイル

 <div class="row contact-wrap"> 
      <div id="error-message" style="display: none;" ><p>ERROR</p></div> 
      <form id="main-contact-form" class="contact-form" name="contact-form" method="post" action="sendemail.php" data-toggle="validator" role="form"> 
       <div class="col-sm-5 col-sm-offset-1"> 
        <div class="form-group"> 
         <label for="inputname" class="control-label">NAME</label> 
         <input type="text" name="name" id="inputname" class="form-control" data-error="Name required!" required> 
        </div> 
        <div class="form-group"> 
         <label for="inputemail" class="control-label">EMAIL</label> 
         <input type="email" name="email" id="inputemail" class="form-control" data-error="Email required!" required> 
        </div>      
       </div> 
       <div class="col-sm-5"> 
        <div class="form-group"> 
         <label for="inputsubject" class="control-label">SUBJECT</label> 
         <input type="text" name="subject" id="inputsubject" class="form-control" data-error="Subject required!" required> 
        </div> 
        <div class="form-group"> 
         <label for="inputmessage" class="control-label">MESSAGE</label> 
         <textarea name="message" id="inputmessage" class="form-control" rows="8" data-error="Message required!" required></textarea> 
        </div>       
        <div class="form-group"> 
         <button type="submit" name="submit" class="btn btn-primary btn-lg" required="required">SUBMIT</button> 
        </div> 
       </div> 
      </form> 
     </div> 

    <script src="js/main.js"></script> 
    <script src="js/validator.min.js"></script> 

main.js

+0

これらのメッセージを送信していますか、またはランダムに発生しているようですか? – Loaf

+0

私はランダムに空のメッセージを取得します。つまり、$ _POSTは空です。 – iamarnold

+0

PHPでメッセージの妥当性を検証してください。ユーザーが行った検証を削除したり、バイパスしたりすることは可能です。 PHPはそれをキャッチすることができます。クライアント側の – Loaf

答えて

1

sendmail.phpには、これらの条件が満たされている場合はのチェックがありません。これらの条件が満たされない場合はまたはにメールしてください。を送信しないでください。現在、電子メールは常に送信されます。

誰かまたは何か(スパイダー、クローラ、Googlebotなど)は、sendmail.phpにフォームを送信せずに直接アクセスしています。 sendmail.phpに提出するかどうかを確認:

if(!isset($_POST['submit'])) { 
    die("Scumbag, use the form!"); 
} 

、または各送信されたフィールドをチェックし、誰かが同様にあなたのスクリプトに直接submitまたは他のフィールドを投稿することが容易です。

もう少し堅牢なものについては、Cross-Site Request Forgeriesを参照してください。これも同様に役立ちます。

+0

ありがとうございます。何かがフォームを送信せずにsendmail.phpに直接アクセスしていることは意味があります。サーバー側の検証を追加し、必要なフィールドがある場合にのみ電子メールを送信します。 – iamarnold

関連する問題