我一直在尝试使用'import poplib'来访问gmail,因为我在设置中打开了Pop-但是我实际上如何检查消息的'发件人'地址,然后基于它运行一些东西?另外,从消息中删除“正文”文本的命令是什么?
3 回答
有模块 rfc822
我猜来自 poplib 的消息可以从服务器下载。
然后放入一个文件
>>> f = StringIO.StringIO(message)
>>> import rfc822
并传递给
>>> rfc822.Message(f)
试试这个.. 并查看模块文档。我希望它有所帮助。
还有另一个python模块:
>>> import email
>>> email.message_from_string(...)
这应该为您提供对标题的读取访问权限,并且还支持多种格式的正文内容。
以下是使用 imaplib 获取 GMail 收件箱中每封邮件的主题和发件人的方法。
import imaplib
from email.parser import HeaderParser
conn = imaplib.IMAP4_SSL('imap.gmail.com')
conn.login('username@gmail.com', 'password')
# Select the mail box
status, messages = conn.select('INBOX')
if status != "OK":
print "Incorrect mail box"
exit()
if int(messages[0]) > 0:
for message_number in range(1,int(messages[0])+1):
data = conn.fetch(message_number, '(BODY[HEADER])')
parser = HeaderParser()
msg = parser.parsestr(data[1][0][1])
print "Subject: %s" % msg['subject']
print "From: %s" % msg['from']
您可能需要更多信息。从官方 imaplib 文档开始。
从文档中:
POP3.retr(which)
Retrieve whole message number which, and set its seen flag. Result is in form (response, ['line', ...], octets).
因此,假设您已将 的结果retr()
放入名为 的变量response
中,则消息的行将作为列表存储在response[1]
. 通过RFC 2822,我们知道标头与邮件正文之间用空行分隔。邮件的发件人将在From:
标题行中。所以我们可以遍历消息的行,当我们得到一个空行时停止,当我们看到以 . 开头的行时为我们的发送者设置一个变量From:
。
sender = None
for line in response[1]:
if line.startswith("From: "):
sender = line.partition(" ")[2].strip()
elif line == "":
break
如果您打算对标头做很多事情,那么按标头名称将它们放入字典中可能会很有用。由于每个标题都可以出现多次,因此字典中的每个值都应该是一个列表。
headers = {}
for line in response[1]:
if line == "":
break
line = line.partition(" ")
key = line[0].strip().rstrip(":")
value = line[2].stirp()
headers.setdefault(key, []).append(value)
在此之后,您可以使用headers["From"][0]
获取消息的发件人。
我想展示执行此操作的基本方法,因为它不是很复杂,但 Python 可以为您完成大部分工作。同样,假设您的retr()
结果在response
:
import email
# convert our message back to a string and parse it
headers = email.parsefromstring("\n".join(response[0]), headersonly=True)
print headers["From"] # prints the sender
您可以在电子邮件模块的文档中找到有关消息对象的更多信息。
From:
除了电子邮件地址之外,电子邮件消息的行可能还有其他文本,例如发件人的姓名。您可以使用正则表达式提取电子邮件地址:
sender = re.find(r".*[ <](.+@.+)\b", headers["From"]).match(1)