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