0

我已经在许多 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;
   }
}

?>
4

1 回答 1

3

你的代码有点冒险——你在使用它们之前没有测试所有这些 $_POST 值的存在,这可能会导致 PHP 输出警告消息。如果输出了这些警告,那么您的header()重定向将失败并出现通常的headers already sent错误。

需要检查的一些事项:

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

b) 如果dreamhost 允许或可以提供它,请检查邮件服务器日志以查看PHP 移交电子邮件后那里发生的情况——记住,PHP 的mail() 相当于将信封放入邮箱中——实际上并没有传递邮件。

c) 您可能需要考虑改用PHPMailerSwiftMailer,这两种方法都可以为您提供更好的诊断信息,以防出现问题。

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

于 2012-08-16T21:06:03.580 回答