电子邮件……我应该能够做到吗?

3

我有一个网站,example.com托管在godaddy上。我只是在玩PHP的mail函数,并将以下内容上传到了我的网站example.com

mail( "someone@yahoo.com", "test", "test message", "From: someone@gmail.com" );

为什么这可以成功?我的意思是,这不应该行得通吧?“发件人”地址的域名不是“@example.com”。然而,当我在someone@yahoo.com处检查我的电子邮件时,我收到了来自someone@gmail.com的消息……我怎么能(可能)在没有密码的情况下发送任何人的电子邮件帐户的电子邮件呢?

2
检查您在someone@yahoo.com收到的电子邮件的标题。它可能会显示消息的真实来源。据我所知,电子邮件被发送为具有标头和有效负载的数据包,并且与不同类型的数据包一样,您可以更改这些标头。它仍应显示发件人的IP地址,这应该与从someone@gmail.com发送的电子邮件的IP地址不同。(虽然我可能错了;我没有仔细阅读过这个) - avacariu
4个回答

4
这是可能的,也就是说,您可以在电子邮件头中放置任何内容,包括完全随意的发件人地址。尽管如此,您是正确的,注重安全的提供商通常会以一种方式配置其出站邮件服务,允许仅发送自该邮件所发送的服务器上的发件人地址;但他们不必这样做。
此外,在接收端,如果发件人地址属于与发送邮件服务器不相关联的域,那么这些邮件很可能最终进入垃圾邮件文件夹。
这是非常糟糕的实践(正如您已经知道的)。至于提供商是否有责任-它可以是信任的标志(如果您是服务器上唯一的用户或选择的少数客户之一),也可以是粗心大意。您可能有理由抱怨,因为如果您的网络托管邻居误用此功能发送垃圾邮件,则服务器的IP地址可能会被列入黑名单,导致从该服务器发出的任何电子邮件(合法或不合法)都会被捕获在垃圾邮件过滤器中。

1
@user 嗯,通常情况下,出站服务器会被配置为无法执行此操作。但这并不是强制性的。电子邮件是一个相当开放的系统,正因为如此,您不能完全信任发件人信息。 - Pekka
@user 请参考邮件(mail())文档中关于additional_parameters的解释:http://www.php.net/manual/zh/function.mail.php - Pekka

1

这是因为电子邮件格式规范的原因。 查看电子邮件头规范,您可以参考http://en.wikipedia.org/wiki/Email#Header_fields

这就是为什么收到电子邮件后,一个人永远不应该相信“发件人”信息的原因。


0

能否这样做基本上取决于你问谁。电子邮件RFC规定您应该这样做。最佳实践是,主机和ISP表示您不应该这样做。

因此,从PHP的角度来看。是的,你应该这样做

编辑: 顺便说一句,您并没有从某人的帐户发送邮件,您只是陈述您的电子邮件与实际情况不同。这基本上与向陌生人介绍自己为“比尔·克林顿”相同。如果接收者注意到了,他们会知道它是错误的。在现实世界中,因为您看起来不像他,在电子邮件世界中,您可以简单地测试发送服务器是否被允许从该特定域名进行信任。


你认为可以指定一个不属于发送服务器域的发件人地址吗?我认为不行,这是垃圾邮件滋生的开放邀请。 - Pekka
我同意你的观点,但是恐怕这并不改变我们需要遵循的规格要求。 - Rune FS

0

这就是为什么像Sender Policy Framework(SPF)和DomainKeys Identified Mail(DKIM)这样的系统被引入的原因。

SPF允许管理员定义特定域名的电子邮件应该从哪里发出。在您的示例中,假设已设置SPF记录,则记录将显示Go Daddy主机发送的邮件并非gmail.com域的授权发件人。接收该邮件并执行SPF验证的(Yahoo)邮件服务器可能会拒绝该邮件。

DKIM使用数字签名,使发送邮件服务器能够展示电子邮件来自于所声称的域名。在您的示例中,您无法对邮件进行签名并使其看起来像是真的来自Gmail,因为您没有他们的密钥。

这两个系统都需要正确设置SPF/DKIM记录,并且也需要处理其收件人的电子邮件的邮件服务器实际执行验证。

因此,请不要担心:这个问题正在得到解决 :-)


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