在 Python 中获取原始电子邮件发件人服务器
Get original e-mail sender server in Python
通过许多电子邮件服务,您可能会被骗,以为电子邮件是从其他地址发送的。
在 Python 中使用 smtplib
,您可以通过操纵 From
参数轻松实现这一技巧。
gmail
不容易出现这种情况,因为他们会打印显示 原始 服务器的 via
参数。
然而,我在任何地方都找不到的是 你如何在 Python 中检索原始(未被操纵的)服务器名称 ,与 gmail
相同与他们的 via
功能有关吗?
我已经尝试了 imaplib
和 email
库,但在那里我只能访问已经被操纵的发件人。
有什么想法吗?这是否仅与特定提供程序的配置相关(例如 Google
、Outlook
、hotmail
等),还是可以不管这些都做些什么?
这是我目前正在使用的部分代码(没有成功):
import imaplib
import email
obj = imaplib.IMAP4('imap', portn)
obj.login('username', 'password')
obj.select('INBOX')
uidl_list = [68720]
resp, data = obj.uid('FETCH', ','.join(map(str, uidl_list)) , '(BODY.PEEK[HEADER.FIELDS (From Subject)] RFC822.SIZE)')
从未听说过 via
字段。它与这个特定的提供者有关。
您可以查看邮件的 Received
header 以了解邮件通过了哪些 SMTP 服务器。假设这些不是伪造的,并且在整个过程中没有被修改(即假设您信任服务器),它们应该将您指向用户连接到的 SMTP 服务器以发送邮件。
示例:
Received: from mail-ot1-x333.google.com (mail-ot1-x333.google.com [IPv6:2617:f8c0:4864:20::331])
by smtp.domain.tld (Postfix) with ESMTPS id 6C488D0F8
for <user@domain.tld>; Mon, 19 Nov 2018 21:13:54 +0100 (CET)
Received: by mail-ot1-x333.google.com with SMTP id w25so38121669otm.11
for <user@domain.tld>; Mon, 19 Nov 2018 12:13:54 -0800 (PST)
连接到 mail-ot1-x333.google.com
的用户为 user@domain.tld
发布了一条消息。 SMTP 服务器添加了显示在底部的 Received
header。然后,它将消息发送到 domain.tld
,domain.tld
的 Postfix 服务器添加了出现在顶部的 header。
从 RFC 5321 开始,Received
header 始终添加在顶部。
An Internet mail program MUST NOT change or delete a Received: line
that was previously added to the message header section. SMTP
servers MUST prepend Received lines to messages; they MUST NOT change
the order of existing lines or insert Received lines in any other
location.
最后一个应该始终是表示用户连接到的 SMTP 服务器的那个。
请注意,From
域与用于发送邮件的 SMTP 服务器不匹配是有充分理由的。:
- ISP 强制用户使用他们自己的 SMTP 服务器
- 将多个电子邮件帐户与仅提供单一 SMTP 配置的邮件客户端一起使用
通过许多电子邮件服务,您可能会被骗,以为电子邮件是从其他地址发送的。
在 Python 中使用 smtplib
,您可以通过操纵 From
参数轻松实现这一技巧。
gmail
不容易出现这种情况,因为他们会打印显示 原始 服务器的 via
参数。
然而,我在任何地方都找不到的是 你如何在 Python 中检索原始(未被操纵的)服务器名称 ,与 gmail
相同与他们的 via
功能有关吗?
我已经尝试了 imaplib
和 email
库,但在那里我只能访问已经被操纵的发件人。
有什么想法吗?这是否仅与特定提供程序的配置相关(例如 Google
、Outlook
、hotmail
等),还是可以不管这些都做些什么?
这是我目前正在使用的部分代码(没有成功):
import imaplib
import email
obj = imaplib.IMAP4('imap', portn)
obj.login('username', 'password')
obj.select('INBOX')
uidl_list = [68720]
resp, data = obj.uid('FETCH', ','.join(map(str, uidl_list)) , '(BODY.PEEK[HEADER.FIELDS (From Subject)] RFC822.SIZE)')
从未听说过 via
字段。它与这个特定的提供者有关。
您可以查看邮件的 Received
header 以了解邮件通过了哪些 SMTP 服务器。假设这些不是伪造的,并且在整个过程中没有被修改(即假设您信任服务器),它们应该将您指向用户连接到的 SMTP 服务器以发送邮件。
示例:
Received: from mail-ot1-x333.google.com (mail-ot1-x333.google.com [IPv6:2617:f8c0:4864:20::331])
by smtp.domain.tld (Postfix) with ESMTPS id 6C488D0F8
for <user@domain.tld>; Mon, 19 Nov 2018 21:13:54 +0100 (CET)
Received: by mail-ot1-x333.google.com with SMTP id w25so38121669otm.11
for <user@domain.tld>; Mon, 19 Nov 2018 12:13:54 -0800 (PST)
连接到 mail-ot1-x333.google.com
的用户为 user@domain.tld
发布了一条消息。 SMTP 服务器添加了显示在底部的 Received
header。然后,它将消息发送到 domain.tld
,domain.tld
的 Postfix 服务器添加了出现在顶部的 header。
从 RFC 5321 开始,Received
header 始终添加在顶部。
An Internet mail program MUST NOT change or delete a Received: line
that was previously added to the message header section. SMTP
servers MUST prepend Received lines to messages; they MUST NOT change
the order of existing lines or insert Received lines in any other
location.
最后一个应该始终是表示用户连接到的 SMTP 服务器的那个。
请注意,From
域与用于发送邮件的 SMTP 服务器不匹配是有充分理由的。:
- ISP 强制用户使用他们自己的 SMTP 服务器
- 将多个电子邮件帐户与仅提供单一 SMTP 配置的邮件客户端一起使用