谷歌应用引擎中如何验证收件人电子邮件地址的发送者?

3
我正在尝试使用Google App Engine的Python SDK编写一个主要基于电子邮件的应用程序。我注意到Google 允许您通过其API接收电子邮件, 并且它很容易为您提供标准字段,如发件人、收件人、正文等。然而,如果我想验证电子邮件地址是否来自所说的发送者(类似Posterous为您执行的操作),我该怎么办?我无法访问任何电子邮件头,因此无法检查发送服务器的IP地址的MX记录或其他高级内容。有什么想法吗?
5个回答

2

实际上,虽然没有很好的文档记录,但这里的来源表明,形成方便的对象的原始mime消息可作为方便对象的.original属性获得——那是email.message.Message的实例,因此您应该能够从那里获取电子邮件标题。不过,我不确定这是否能让您在验证方面有所进展。


有趣的,很好的想法去搜索源代码。 - daveslab
@daveslab,谢谢--我很喜欢GAE SDK是开源的,这样我就可以弥补有时候文档不够充足的问题(至少对于应用程序级别发生的事情来说是如此,这是很多的--在生产运行中RPC调用背后的东西[[与使用开源模拟机制的SDK运行不同]]最好要有良好的文档记录;-)。 - Alex Martelli
说实话,我不知道它是开源的。这应该是一个很好的Python新手风格指南。 - daveslab
1
你甚至不需要使用 webapp 的邮件处理程序;实际上发布到你的电子邮件 URL 的是原始消息,你可以按照自己的方式处理它。 - Wooble

1
电子邮件通常不是一种可验证的媒介,除非您使用PGP或S/MIME签署它。如果您没有标题,您就没有任何内容可以验证。
您唯一能做的就是给该地址发送电子邮件,并要求该人确认他们确实发送了这条消息。这对欺诈性电子邮件发送者来说更难伪造(但并非不可能)。
或者您可以要求用户在每个消息中输入密码。

是的,@rjmunro,你说得对。感谢你的建议,在评论中我已经考虑过了,但出于上述原因我没有这样做。 - daveslab

1
Alex关于访问邮件头的说法是正确的,但这并不能让你验证邮件的实际发送者:任何人都可以使用任意想要的“发件人”地址发送电子邮件,因此不要依赖发件地址作为谁发送了邮件的权威证明。

0
如果这是注册过程的一部分或类似的内容,那么为什么不向(据说是)发起者发送一个“挑战”(例如,URL继续注册或其他操作,带有唯一且限时的密钥)?这样您可以验证电子邮件地址是否被伪造。
“大公司”(例如谷歌)经常使用此过程,肯定有原因。
如果不适合您的用例,请忽略我的建议。

更新:您可以让电子邮件在到达您的GAE应用程序之前通过另一个Web服务(待确定)进行中转吗?这样,您仍然可以利用GAE,同时将低处理开销的工作(例如电子邮件验证)放在其他地方完成。


谢谢,@jldupont,你说的很有道理。然而,问题不仅仅是针对注册,还包括持续使用。例如,Posterous允许您通过电子邮件发布博客文章,必须有某种方式每次验证您发送电子邮件时确实是您本人,而不是一些操纵标题的PHP脚本。这就是我要解决的问题。 - daveslab
@daveslab:我明白了。你不能让系统的用户在每封电子邮件中附加一个唯一的令牌吗?虽然这样可能会导致中间人攻击,但这也是一种方法,不是吗? - jldupont
@jldupont 是的,绝对没错,但从可用性的角度来看,这绝对很糟糕。即使我给他们一个相对容易记住的短语,比如“Money Cape”,并要求它必须出现在电子邮件中的某个位置,用户仍然需要费力去记住它。任何安全措施,如果其价值对用户来说不是立即显而易见的,都会让用户觉得这是一个不必要的障碍。 - daveslab
@daveslab:我收到你的讯息并清楚明白了。那么,我可以更新我的原始回答。 - jldupont

0

您只能使用DKIM验证发件人。GAE会自动使用DKIM对Google账户的电子邮件进行签名,但您需要一个外部服务(应通过http/https访问)来查询DNS并为您提供txt DNS字段。


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