php的mail()正在覆盖'from'电子邮件地址

时间:2013-09-25 04:01:44

标签: php email

我正在使用PHP的邮件() - 来自我们网站的电子邮件被成功发送和接收。

用户“theArtist”在我们的网站上出售一幅画。用户“RichGuy”看到它,我们的网站有一个表格,RichGuy将他的电子邮件地址和消息输入“theArtist”。

当“RichGuy”填写此表单并点击“发送”时,我们的PHP代码会从数据库中检索艺术家的电子邮件地址,并使其成为mail()调用中使用的“收件人”电子邮件地址。由于RichGuy刚刚在该表单上输入了回复电子邮件,因此“RichGuy@gmail.com”用于调用mail()的“From:”标题。

我设置了两个虚拟电子邮件帐户来测试我们的mail()代码,一个用于发送邮件(RichGuy @gmail.com和一个用于接收邮件(theArtist@hotmail.com)。

我的真实姓名是问题,因为它显示在收件人收到的邮件的“发件人”部分。我的真实姓名和我的Hotmail电子邮件是 的 FredSmith@hotmail.com 即可。请注意,“艺术家”也是一个hotmail.com帐户,不确定这是否有影响。我已经有了很多年的FredSmith@hotmail.com账号。另外两个“虚拟”帐户是新的,仅用于测试此mail()代码。

这是PHP代码:

 $sendTo = "theArtist@hotmail.com";
 $subject = "I want that painting now!";
 $theMsg =  "That's a fine abstract piece, I'll buy it.";
 $headers = "From: RichGuy@gmail.com";

 if(mail($sendTo, $subject, $theMsg, $headers))
 {
       // success
 }

以上电子邮件已成功收到theArtist@hotmail.com - 这是“艺术家”收到的内容:


我现在想要那幅画!

Fred Smith (RichGuy@gmail.com)

致:theArtist@hotmail.com

来自:RichGuy@gmail.com

发送:星期二9/24/13 8:20 PM

致:theArtist@hotmail.com

这是一个很好的抽象作品,我会买它。


为什么我的真实姓名Fred Smith出现在Artist@hotmail.com这样的电子邮件中?尽管我使用了2个虚拟电子邮件帐户,使用我的真实姓名进行身份验证,但是幕后是mail()吗?我在本地主机Web服务器和在Web上运行的临时服务器上看到了相同的行为。

所以我试图强制解决问题如下:

 $sendTo = "theArtist@hotmail.com";
 $subject = "I want a deal on that painting";
 $theMsg =  "How about a discount on your painting?";
 $headers = "From: RichGuy@gmail.com";
 if(mail($sendTo, $subject, $theMsg, $headers, '-fRichGuy@gmail.com'))

没有变化。我的真实姓名,弗雷德史密斯,在发件人的电子邮件地址之前以某种方式加了解,RichGuy @ gmail.com -


我想要那幅画的交易

Fred Smith (RichGuy@gmail.com)

致:theArtist@hotmail.com

来自:RichGuy@gmail.com

发送:星期二9/24/13 8:20 PM

致:theArtist@hotmail.com

你的画作折扣怎么样?


这可能是某种身份验证问题吗? mail()是否有可能识别出“ah-HAH,网站的真正'所有者'是Fred Smith,因此我们无法在RichGuy@gmail.com上进行身份验证,也无法在theArtist@hotmail.com上进行身份验证,我们必须在发送电子邮件之前进行身份验证关于FredSmith。“

顺便说一句,我检查了我的localhost网络服务器上的sendmail debug.log,并且没有记录电子邮件的“Fred Smith”。

2 个答案:

答案 0 :(得分:1)

检查PHP.ini [邮件功能]配置部分,我的猜测是它出现如下:

[mail function]
SMTP = smtp.live.com
smtp_port = 25
auth_username = FredSmith@hotmail.com
auth_password = fredspassword

外发邮件很可能使用您的普通帐户使用Hotmail进行身份验证,然后添加发件人标头。许多ISP现在阻止SMTP,因此这通常是从本地开发环境中获取SMTP的唯一方法。

答案 1 :(得分:1)

以下是我解决这个问题的方法:

$sendername = strtok($senderEmail, "@");
$headers = "From: " . $sendername . " <" . $senderEmail . ">\r\n";

我只是将发件人的电子邮件“句柄”发送到“@”符号,并使用格式“theSendersName”格式化邮件“发件人”标题,然后就可以了。

相关问题