通过电子邮件发送表单字段的 PHP 脚本不会发送所有字段,并且并不总是发送


PHP script to email form fields is not sending all fields and doesn't always send

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

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

我有什么基本的东西弄

错了吗?我也愿意对脚本进行改进。

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

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

要检查的一些事项:

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

b) 如果 dreamhost 允许或可以提供它,请检查邮件服务器日志,看看 PHP 交出电子邮件后会发生什么 - 请记住,PHP 的 mail() 相当于在邮箱中放置一个信封 - 它实际上并没有传递邮件。

c) 您可能需要考虑切换到 PHPMailer 或 SwiftMailer,这两者都会为您提供更好的诊断消息,以防出现问题。

d) 您应该执行if ($_SERVER['REQUEST_METHOD'] == 'POST') { ... }而不是检查表单字段。REQUEST_METHOD是 100% 可靠的,而检查模板字段取决于您不更改任何内容。