PHP邮件的'From'头部出现问题

34

我正在构建一个网站,当用户注册时会向其发送电子邮件。

我的代码(要点):

<?php
$to = "helloworld@gmail.com";
$subject = "Test mail";
$message = "Hello! \nThis is a simple email message.";

$headers = "From: munged@gmail.com";
$headers .= "\r\nReply-To: munged@gmail.com";
$headers .= "\r\nX-Mailer: PHP/".phpversion();

mail($to,$subject,$message,$headers);

echo "Mail Sent.";
?> 

问题在于当邮件被发送时,发件人头部仍然保持为 munged@box123.bluehost.com,而回复地址会更改为指定的值。

box123.bluehost.com 是托管网站的服务器主机名。

那么我做错了什么?我该怎么做才能让“发件人”地址与“回复地址”地址相同?

这是我做错了什么,还是网络主机在玩猫腻?

8个回答

65

编辑:我刚刚注意到您正在尝试将 Gmail 地址用作发件人值。这是行不通的,ISP 在覆盖它方面是正确的。如果您想将回复重定向到您的发出的邮件,请使用reply-to

适用于许多 ISP 的有效地址的解决方法:

尝试在mail()命令中添加第五个参数:

mail($to,$subject,$message,$headers,"-f your@email.here");

1
我实际上没有使用“From: hithere@gmail.com”。我使用的是其他地址,但我猜你的意思是服务器不允许我以随意的身份发送邮件。但这是错误的! - jrharshath
21
抱歉,伙计,但那绝对正确!请查看您的垃圾邮件文件夹以获取相关证据。 :) - Pekka
2
所以我联系了我们网站主机的管理员,并将所需的电子邮件ID添加为“已授权”。现在它可以工作了。谢谢! - jrharshath
我也遇到了同样的问题,但加入这段代码后它并没有起作用? - Ana DEV

26
原帖发布者的服务器 (blueHost) 在其常见问题解答中提到了此问题。如文章206所述,由于我们的服务器要求您(或您的脚本)在电子邮件头部使用正确格式和有效的From:字段。如果From:字段未正确格式化、为空或电子邮件地址不存在于cPanel中,则From:地址将被更改为username@box###.bluehost.com。您必须更改正在使用的脚本以正确使用有效的From:头部。 应该正常工作的标头示例包括:

From: user@domain.com,From: "user" <user@domain.com>

以下标头示例将不会正常工作:

From: "user@domain.com",From: user @ domain.com,From: user@domain.com <user@domain.com>

我们的服务器不允许电子邮件地址的名称与电子邮件地址相同,也不接受对电子邮件地址的重复声明。
对于像Joomla和WordPress这样的脚本,您需要按照它们的文档正确格式化From字段。WordPress需要Mail From插件。

注意:您使用的电子邮件地址必须是在cPanel中创建的有效帐户。


2
你有一篇文章的链接可以添加到你的回答吗? - user212218
结果表明,在我的服务器上,发现发件人头部不能包含非英文字符(例如希伯来语)。转换为From: user@domain.com可行。 - Itay
原来如此,有几家供应商都有这个要求,却没有向用户沟通。谢谢!真的很难找到这个信息。 - undefined

20

我有同样的问题,去php.net网站查找后找到了正确的格式。
这是我的更新代码。

$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From:  ' . $fromName . ' <' . $fromEmail .'>' . " \r\n" .
            'Reply-To: '.  $fromEmail . "\r\n" .
            'X-Mailer: PHP/' . phpversion();

\r\n”应该在它自己的双引号(")内,单引号(')不起作用。


1
“\r\n” 应该放在双引号(")中,单引号(')是不起作用的。- 谢谢!那就是我的问题! - Collin Anderson
1
$fromName should also be enclosed in double quotes. If the variable contains certain characters (single or double quotes e.g. "John O'Malley", period e.g. "Suzy Q.", etc) it could be invalid without quotes. The correct line would be $headers .= 'From: "' . $fromName . '" <' . $fromEmail . '>' . "\r\n" . - Doktor J
1
'<'. $fromEmail . '>'这一位是对我有用的。只要我使用了这种格式,邮件就开始进来了。谢谢! - RalphTheWonderLlama

4
为了防止网络钓鱼,一些邮件服务器会禁止对发件人地址进行修改。

5
没错,但是可以使用已经注册到该服务器的域名作为发件人名称。强制将任何内容覆盖到服务器的基本主机名上是荒谬的。 - Pekka

1

我通过在Cpanel中添加电子邮件帐户并将同一电子邮件添加到标题栏中的字段来解决了这个问题,方法如下:

$header = 'From: XXXXXXXX <test@test.org>' . "\r\n";

1

我知道这是一个旧帖子,但我昨天刚转移到bluehost时也遇到了同样的问题。虽然它可能不是被选中的答案,但我支持bluehost文章206的回复。

我在控制面板中创建了一个有效的电子邮件,并将其用作我的发件人地址,它起作用了。


0

网络主机并不是真的在玩弄把戏。虽然它并不严格按照规则-但与一些旨在防止垃圾邮件的惊人发明相比,这并不是一个特别糟糕的。

如果您确实想要从“@gmail.com”发送邮件,为什么不直接使用gmail SMTP服务呢?如果您无法重新配置运行PHP的服务器,则有许多电子邮件包装工具可用,可以允许您指定自定义SMTP中继phpmailer很容易上手。

C。


你如何使用联系表单实现用户通过网站所有者的联系表单,通过服务器上的mailer.php和php mail()向网站所有者发送电子邮件? - SherylHohman
在互联网上搜索答案,向您的托管提供商询问,如果您没有解决方案,请在此网站或类似网站上发布一个新问题并测试答案。 - symcbean

0

我的共享主机上的头部无法正常工作,原因是我在头部中使用了我的hotmail电子邮件地址。 我在我的cpanel上创建了一个电子邮件,并将相同的电子邮件设置为头部,它就像魔法般地工作了!

 $header = 'From: ShopFive <site@mysite.org>' . "\r\n";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接