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

时间:2015-02-14 13:17:51

标签: php html forms 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!'; 
  }
}

?>

3 个答案:

答案 0 :(得分:1)

假设您的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代码应该按照上面的形式工作。当然,您可能希望将性别字段更改为radiogroup / dropdown和/或将消息更改为textarea。

<?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这么简单,运行顺畅,配置太少。

答案 1 :(得分:1)

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:标题中的地址不是电子邮件的实际发件人,则指定{{>真实的发件人{{ 1}}标题。例如:

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

    From:
  • 通过垃圾邮件过滤器发送来自其他域名的电子邮件可能会对您不利。您可能需要SPF record才能确保电子邮件通过。

  • 您可能最好使用功能齐全的电子邮件类,例如PHPMailer而不是粗略的mail ($to, $subject, $body, $headers, "-f '$email'"); 功能。

另见

文档

堆栈溢出

答案 2 :(得分:1)

首先在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!'; 
  }
}