【问题标题】:php's mail() is overriding the 'from' email addressphp 的 mail() 覆盖了“发件人”电子邮件地址
【发布时间】: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 这些地址都不是真实的。
  • 任何人都可以拥有这些电子邮件。垃圾邮件发送者很容易从此页面收到电子邮件。

标签: php email


【解决方案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 的唯一方法。

【讨论】:

  • @StigM 谢谢,我在我的 localhost Web 服务器上的 /sendmail 文件夹中的 sendmail.ini 文件中找到了您在我的 sendmail.ini 文件中描述的那些 auth_ 设置。所以我想我对身份验证的怀疑是正确的。我的托管服务提供商还必须以相同的方式设置 sendmail.ini,以便在我与他们注册托管我们的网站时,对他们为我创建的 Fred Smith 帐户名进行身份验证。我可以更改本地主机的 sendmail.ini,但如果可能的话,我宁愿想办法让 mail() 覆盖它,因为我怀疑我的托管服务提供商会让我在他们的网络服务器上修改 sendmail.ini。
  • @CFHcoder 一个很好的解决方案是使用Swift Mailer,它有一些“邮件传输”选项。如果您可以使用另一个 SMTP 服务器进行发送,那么您可以使用 Swift_SmtpTransport 指向该服务器。
  • @Dagon 官方不,它们是无效的,但是 auth_ 字段存在于 Win32 实现中。 Win32 PHP 需要对 SMTP 进行身份验证,因为 PHP 正在处理 SMTP 本身(没有 sendmail 配置以允许身份验证设置)。
【解决方案2】:

我是这样解决这个问题的:

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

我只是将发件人的电子邮件“句柄”放在“@”符号处,并使用“theSendersName”格式设置邮件“发件人”标头的格式,然后就成功了。

【讨论】:

    猜你喜欢
    • 2014-09-22
    • 2017-11-05
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2016-01-21
    • 2017-07-21
    相关资源
    最近更新 更多