电子邮件表单字段的PHP脚本不会发送所有字段,也不会始终发送

时间:2012-08-16 21:01:08

标签: php email

我已经在许多php电子邮件脚本上来回使用,甚至购买了Formtoemailpro(http://formtoemail.com/),现在我正在使用这个。我最终收到了来自此脚本(和f2ep)的一封电子邮件,但它只发送了标签和部分名称以及电子邮件地址,而不是其他任何字段。当我检查回声时,确实知道每个变量应被定义为什么。

我正在使用dreamhost作为我的托管计划。我在尝试的每个脚本上都得到类似的结果 - 如果有的话,会显示电子邮件中的一个或多个字段。我用来测试的电子邮件是我个人的Gmail帐户,但我的客户想要使用的电子邮件是他们使用新域/托管设置的电子邮件 - 我相信它是一个谷歌应用程序帐户。

我有什么基本的错误吗? 我也愿意改进脚本。

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;
   }
}

?>

1 个答案:

答案 0 :(得分:3)

您的代码存在一定的风险 - 在使用它们之前,您不会测试所有这些$ _POST值的存在,这可能导致PHP输出警告消息。如果输出了这些警告,则header()重定向将失败,并显示headers already sent错误。

要检查的一些事项:

a)mail()的返回值。现在你假设它成功了。你应该测试一个布尔值false,表明PHP和SMTP服务器之间爆炸了。

b)如果dreamhost允许或者可以提供它,请检查邮件服务器日志以查看PHP移交电子邮件后发生的情况 - 记住,PHP的邮件()相当于在信箱中丢弃信封 - 它实际上没有发送邮件。

c)您可能需要考虑切换到PHPMailerSwiftMailer,这样可以在出现问题时为您提供更好的诊断信息。

d)您应该执行if ($_SERVER['REQUEST_METHOD'] == 'POST') { ... }而不是检查表单字段。 REQUEST_METHOD是100%可靠的,而检查formfields取决于你没有改变任何东西。