如何检查某个地址的电子邮件服务器(gmail)并根据该地址运行某些内容?

时间:2012-04-08 15:00:09

标签: python email pop3

我一直在尝试使用'import poplib'来访问gmail,因为我在设置中打开了Pop,但是我如何才能检查消息中的'from'地址然后根据它运行?另外,从消息中删除“正文”文本的命令是什么?

3 个答案:

答案 0 :(得分:0)

有模块rfc822

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

然后放入文件

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

并传递给

>>> rfc822.Message(f)

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


还有另一个python模块:

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

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

答案 1 :(得分: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']

您可能需要更多信息。从official imaplib documentation开始。

答案 2 :(得分:0)

来自documentation

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

您可以在email module的文档中找到有关消息对象的更多信息。

电子邮件的From:行可能包含电子邮件地址以外的其他文本,例如发件人姓名。您可以使用正则表达式提取电子邮件地址:

sender = re.find(r".*[ <](.+@.+)\b", headers["From"]).match(1)