0

Formtoemailpro (http://formtoemail.com/) を購入したこともあり、これを使って多くの php メール スクリプトを行ったり来たりしてきましたが、今のところこれを使用しています。このスクリプト (および f2ep) から 1 通の電子メールを受信しましたが、ラベルと名前の一部と電子メール アドレスのみが送信され、他のフィールドは送信されませんでした。エコーで確認したところ、各変数が何として定義されているかがわかりました。

ホスティングプランとしてdreamhostを使用しています。試したすべてのスクリプトで同様の結果が得られます。電子メールに 1 つ以上のフィールドがあれば表示されます。テストに使用したメールは個人の Gmail アカウントですが、クライアントが使用したいと考えているメールは、新しいドメイン/ホスティングで設定したもので、Google Apps アカウントだと思います。

私が間違っている基本的なことはありますか? また、スクリプトの改善にもオープンです。

html:

   <form name="form1" id="form1" method="post" action="formtest.php"> 
   <span class="formtext">

    <p>
      <label for="nameFirst">First Name:</label>   
      <input type="text" name="nameFirst" id="nameFirst" />
    </p>
    <p>
      <label for="nameLast">Last Name:</label>
      <input type="text" name="nameLast" id="nameLast" />
    </p>
    <p>
      <label for="email">E-mail: </label>
      <input type="text" name="email" id="email" />
    </p>
    <p>
      <label for="phone"> Phone:</label>
      <input type="text" name="phone" id="phone" />
    </p>
    <p>
      <label for="subject">Reason for contacting us?</label>
        <br />
      <select name="subject"  id="subject">
        <option>Request more information</option>
        <option>Recommend a project</option>
        <option>Suggest a resource</option>
        <option>Get us to help a community</option>
      </select>
    </p>
    <p>
      <label for="messagebox" class="formtext">Message:</label>
      <br>
      <textarea name="messagebox" id="messagebox" cols="45" rows="5"></textarea>
    </p>
    <p>
      <input type="submit" name="submit" id="button" value="Send" />
    </p>
  </span>
</form>

php:

<?php

  $to = "foo@example.com";
  $subject = $_POST['subject'];
  $name = $_POST['nameFirst'].$_POST['nameLast'];
  $phone = $_POST['phone'];
  $email = $_POST['email'];
  $message = $_POST['messagebox'];


if(isset($_POST['submit'])) {

  $body = "From: {$name}\n Phone: {$phone}\n E-Mail: {$email}\n Message:\n {$message}";

  $headers = "From: ". $name . " <" . $email . ">\r\n";
  $headers .= "Reply-To:". $email ."\r\n";

  mail($to, $subject, $body, $headers);

  // redirect 
  header('Location: ThankYouContact.html');
  } 


// Error Checking http://bit.ly/NDhVrm
 /* if (@mail($to, $subject, $message)) { //@ suppresses error msg
    echo('<p>Mail sent successfully.</p>'); 
  } else { 
    echo('<p>Mail could not be sent.</p>'); 
  } */


// Function to validate against any email injection attempts
function IsInjected($str)
{
  $injections = array('(\n+)',
              '(\r+)',
              '(\t+)',
              '(%0A+)',
              '(%0D+)',
              '(%08+)',
              '(%09+)'
              );
  $inject = join('|', $injections);
  $inject = "/$inject/i";
  if(preg_match($inject,$str))
     {
     return true;
   }
   else
     {
     return false;
   }
}

?>
4

1 に答える 1

3

あなたのコードはやや危険です。使用する前に $_POST 値がすべて存在するかどうかをテストしていないため、PHP が警告メッセージを出力する可能性があります。これらの警告が出力された場合、header()リダイレクトは通常のheaders already sentエラーで失敗します。

確認事項:

a) の戻り値mail()。今、あなたはそれが成功したと仮定しています。PHP と SMTP サーバーの間で問題が発生したことを示すブール値の false をテストする必要があります。

b) dreamhost がそれを許可または提供できる場合は、メール サーバーのログをチェックして、PHP が電子メールを引き渡した後に何が起こるかを確認してください。メールを配信します。

c) 代わりにPHPMailerまたはSwiftMailerに切り替えることを検討することをお勧めします。どちらも、問題が発生した場合にはるかに優れた診断メッセージを提供します。

if ($_SERVER['REQUEST_METHOD'] == 'POST') { ... }d)フォーム フィールドをチェックする代わりに実行する必要があります。REQUEST_METHOD は 100% 信頼できますが、フォームフィールドのチェックは何も変更しないことに依存します。

于 2012-08-16T21:06:03.580 に答える