我有一个相当简单的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";从";地址和";发送者";收割台