1

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

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

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

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

我的真实姓名是问题所在,因为它显示在收件人收到的消息的“发件人”部分。我的真实姓名和我的 hotmail 电子邮件是 FredSmith@hotmail.com。请注意,“theArtist”也是 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 已成功接收到上述电子邮件 - 这是“theArtist”收到的内容:


我现在就想要那幅画!

弗雷德·史密斯(RichGuy@gmail.com)

至:theArtist@hotmail.com

来自:RichGuy@gmail.com

发送时间:2013 年 9 月 24 日星期二晚上 8:20

至:theArtist@hotmail.com

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


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

所以我试图强迫这个问题如下:

 $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'))

没变。我的真名Fred Smith 不知怎的就在发件人的电子邮件地址 RichGuy@gmail.com 之前加上了——


我想就那幅画达成协议

弗雷德·史密斯(RichGuy@gmail.com)

至:theArtist@hotmail.com

来自:RichGuy@gmail.com

发送时间:2013 年 9 月 24 日星期二晚上 8:20

至:theArtist@hotmail.com

你的画打折怎么样?


这可能是某种身份验证问题吗?
mail() 是否有可能识别“啊-哈哈,该站点的真正“所有者”是 Fred Smith,因此我们无法在 RichGuy@gmail.com 或 theArtist@hotmail.com 上进行身份验证,我们必须在发送电子邮件之前进行身份验证在弗雷德史密斯身上。”

顺便说一句,我检查了我的本地主机 Web 服务器上的 sendmail debug.log 并且没有与电子邮件消息一起记录在那里的“Fred Smith”。

4

2 回答 2

1

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

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

我只是将发件人的电子邮件“句柄”放在“@”符号处,并使用“theSendersName”格式格式化邮件“发件人”标题,它就起作用了。

于 2013-10-11T01:10:44.503 回答
1

检查 PHP.ini [mail function] 配置部分,我猜它如下所示:

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

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

于 2013-09-25T04:11:27.900 回答