我的PHP表单不会给我发电子邮件


My PHP form wont send me an email

我有一个相当简单的HTML/PHP表单,只需要将数据发送到我的电子邮件中。我使用的电子邮件与网站使用的域不同。我已经被这个问题困扰了好几个小时,似乎找不到解决办法。有人能看一下吗?

<?php
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$message = $_POST['message'];
$gender = $_POST['gender'];
$user_name = $_POST['user_name'];
$email = $_POST['email"];
$message = $_POST['message'];
$from = $_POST['user_name']; 
$to = 'example@email.com'; 
$subject = 'Comment';

$body = "From: $first_name'n From: $last_name'n Sex: $gender'n Username: $user_name'n E-Mail: $email'n Message:'n $message";
if ($_POST['submit']) {
  if (mail ($to, $subject, $body, $from)) { 
    echo 'Your message has been sent!';
  } else { 
    echo 'Something went wrong, go back and try again!'; 
  }
}
?>

假设您的PHP代码文件是sendMail.PHP

让它成为form.html

<form name="sendMail" id="sendMail" action="sendMail.php" method="post">
    <input type="text" name="first_name" /> 
    <input type="text" name="last_name" /> 
    <input type="text" name="message" /> 
    <input type="text" name="gender" /> 
    <input type="text" name="user_name" /> 
    <input type="text" name="email" />
    <input type="submit" name="submit" />
</form>

基本上,您的PHP代码应该按照上面的形式工作。当然,您可能希望将性别字段更改为单选组/下拉列表和/或将消息更改为文本区域。

<?php
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$message = $_POST['message'];
$gender = $_POST['gender'];
$user_name = $_POST['user_name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = $_POST['user_name']; 
$to = 'example@email.com'; 
$subject = 'Comment';

$body = "From: $first_name'n From: $last_name'n Sex: $gender'n Username: $user_name'n E-Mail: $email'n Message:'n $message";
if ($_POST['submit']) {
    if (mail ($to, $subject, $body, $from)) { 
        echo 'Your message has been sent!';
    }
    else { 
        echo 'Something went wrong, go back and try again!'; 
    }
}
?>

有一点需要纠正,即$email = $_POST['email"];应该是$email = $_POST['email'];

您应该确保PHP邮件设置必须正确设置。我建议你使用PHPMailer,它非常简单,运行平稳,配置太少。

只需在第一个if条件中写入isset()。

请再次尝试上面的代码。

$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$message = $_POST['message'];
$gender = $_POST['gender'];
$user_name = $_POST['user_name'];
$email = $_POST['email"];
$message = $_POST['message'];
$from = $_POST['user_name']; 
$to = 'example@email.com'; 
$subject = 'Comment';

$body = "From: $first_name'n From: $last_name'n Sex: $gender'n Username: $user_name'n E-Mail: $email'n Message:'n $message";
if (isset($_POST['submit'])) {
  if (mail ($to, $subject, $body, $from)) { 
    echo 'Your message has been sent!';
  } else { 
    echo 'Something went wrong, go back and try again!'; 
  }
}

PHP

mail()函数的第四个参数应该是附加电子邮件头的列表。您正在向它传递用户名。你应该有这样的东西:

$email = $_POST['email'];
$email = preg_replace('/[[:cntrl:]]/', '', $email);
$headers = "From: $email'r'n";
...
mail ($to, $subject, $body, $headers);

第二行过滤掉电子邮件地址中的控制字符。如果没有这一点,恶意用户可以插入换行符来添加他们自己的电子邮件头,例如发送未经请求的垃圾邮件的CC:头。

混合域

此外,您可能不被允许从与您的网站(或邮件服务器)不同的域名发送具有From:地址的电子邮件。您可以联系服务器/网站的管理员,询问您的选择。

需要考虑的一些事项:

  • 您可以尝试使用本地From:地址,并将实际(外部)电子邮件地址保留在Reply-To:标头中。例如:

      $headers  = "From: Me@mydomain.example'r'n";
      $headers .= "Reply-To: Someone@otherdomain.example'r'n";
    

    不过,有些电子邮件客户端可能不尊重Reply-To:标头。

  • 如果From:标头中的地址不是电子邮件的实际发件人,则Sender:标头中指定实际发件人。例如:

      $headers  = "From: Someone@otherdomain.example'r'n";
      $headers .= "Sender: Me@mydomain.example'r'n";
    
  • 可能需要在邮件传输代理的附加参数中指定From:地址:

      mail ($to, $subject, $body, $headers, "-f '$email'");
    
  • 通过SPAM过滤器,从不同域名发送电子邮件可能会对您不利。您可能需要SPF记录来确保您的电子邮件能够通过。

  • 您最好使用功能齐全的电子邮件类,如PHPMailer,而不是粗糙的mail()函数。

另请参阅

文件

  • RFC 5322-互联网消息格式:3.6.2。发起人字段
  • PHP mail()函数
  • SPF-发件人策略框架

堆栈溢出

  • 将电子邮件作为服务发送给他人时,我应该使用"回复"标题吗
  • 如何确保以编程方式发送的电子邮件不会自动标记为垃圾邮件
  • 使用成员';的潜在问题;s";从";地址和";发送者";收割台