1

我一直在尝试使用'import poplib'来访问gmail,因为我在设置中打开了Pop-但是我实际上如何检查消息的'发件人'地址,然后基于它运行一些东西?另外,从消息中删除“正文”文本的命令是什么?

4

3 回答 3

0

有模块 rfc822

我猜来自 poplib 的消息可以从服务器下载。

然后放入一个文件

>>> f = StringIO.StringIO(message)
>>> import rfc822

并传递给

>>> rfc822.Message(f)

试试这个.. 并查看模块文档。我希望它有所帮助。


还有另一个python模块:

>>> import email
>>> email.message_from_string(...)

这应该为您提供对标题的读取访问权限,并且还支持多种格式的正文内容。

于 2012-04-08T15:33:25.197 回答
0

以下是使用 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 文档开始。

于 2012-04-08T15:42:38.037 回答
0

文档中:

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)
于 2012-04-08T15:44:50.297 回答