【发布时间】:2013-09-25 04:01:44
【问题描述】:
我正在使用 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() 是否在幕后使用我的真实姓名进行身份验证?我在 localhost 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'))
没有变化。我的真实姓名,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”。
【问题讨论】:
-
已知某些主机会这样做以阻止用户发送伪装成其他人的电子邮件
-
当我还在 PHP 中编码时,我倾向于使用 Rmail;它使发送 HTML 邮件等变得非常容易。如果你想试一试,我可以从某个地方挖一份副本(作者似乎有 410'd 项目的站点,所以你不能直接得到它)。
-
这些电子邮件地址是真实的吗?在这种情况下,请使用假的。使用
@example.com域。 -
@shiplu.mokadd.im 这些地址都不是真实的。
-
任何人都可以拥有这些电子邮件。垃圾邮件发送者很容易从此页面收到电子邮件。