Python-邮件批量处理-已读状态或移动

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

通常,我们会碰到想批量把邮件处理的情况,例如:

1. 把邮箱INBOX中的所有邮件置为已读
2. 把邮箱INBOX中的邮件全部移入到一个备份目录中,例如bak

但是可能客户端支持的不是很好,这时,我们可以使用python库来轻松处理
通过参考python库中的IMAP4_SSL的用法,以及rfc3501文档中FLAGS支持的标记位,我们可以知道怎么来处理。

参考rfc3501中的 2.3.2 Flags Message Attribute,我们可以找出一个邮件的状态位有那些:
\Seen  Message has been read
\Answered Message has been answered
\Flagged Message is "flagged" for urgent/special attention
\Deleted Message is "deleted" for removal by later EXPUNGE
\Draft  Message has not completed composition (marked as a draft).
\Recent  Message is "recently" arrived in this mailbox.
其中,我们重点关注\Seen---已读标记,\Deleted---删除标记,该标记在后续执行expunge后会确定删除。

IMAP4_SSL库提供了对rfc3501中使用的支持:
login(user, password) login to sever
create(mailbox) Create new mailbox named mailbox.
select(mailbox='INBOX', readonly=False)  Select a mailbox.
copy(message_set, new_mailbox) Copy message_set messages onto end of new_mailbox.
fetch(message_set, message_parts)  Fetch (parts of) messages.
search(charset, criterion[, ...]) Search mailbox for matching messages. charset may be None
recent() Prompt server for an update.
store(message_set, command, flag_list) Alters flag dispositions for messages in mailbox.
expunge() Permanently remove deleted items from selected mailbox.
close() Close currently selected mailbox.Deleted messages are removed from writable mailbox.
shutdown() Close connection established in open
其中,我们重点关注store方法,store方法可以用于对邮件FLAGS的置位

例子1如下:是置位为已读的处理例子,适用与处理sohu邮箱的INBOX中邮件:
主要借助store方法,把所有INBOX中的邮件,都添加\Seen标记

#!/usr/bin/python
from imaplib import IMAP4_SSL
import sys
if (len(sys.argv) != 3):
    print("Useage: {} user passowrd".format(sys.argv[0]))
    sys.exit(1)

user=sys.argv[1]
userpass=sys.argv[2]

#set all mail in INBOX seen 
s=IMAP4_SSL('imap.sohu.com', 993)
s.login(user, userpass)
rsp, msgs=s.select('INBOX')
seq='1:{}'.format(eval(msgs[0]))
s.store((seq), '+FLAGS', '(\\Seen)')
s.close()
s.logout()
print('IMAP: set {} mails to \Seen flag '.format(eval(msgs[0])))

例子2如下,是把INBOX中邮件都移入到bak中,并删除掉INBOX中邮件:
主要借助copy方法把邮件复制到bak中,并借助store方法置位\\Deleted标记

#!/usr/bin/python
from imaplib import IMAP4_SSL
import sys
if (len(sys.argv) != 4):
    print("Useage: {} user passowrd destmailbox".format(sys.argv[0]))
    sys.exit(1)

user=sys.argv[1]
userpass=sys.argv[2]
destmailbox=sys.argv[3]

#login 
s=IMAP4_SSL('imap.sohu.com', 993)
s.login(user, userpass)

#move mail to bak
rsp, msgs=s.select(destmailbox)
if (rsp == 'NO'):
    s.create(destmailbox)
    print('IMAP: create mail box ' + destmailbox)
rsp, msgs=s.select('INBOX')
if (eval(msgs[0]) == 0):
    print('INBOX is empty, no need to move')
    sys.exit()
seq='1:{}'.format(eval(msgs[0]))
s.copy((seq), destmailbox)
s.store((seq), '+FLAGS', '(\\Deleted)')
s.close()
s.logout()
print('IMAP: move {} mails to {}'.format(eval(msgs[0]), destmailbox))

除了上面两个例子中常用的情况,也能通过IMAP提供的方法做一些其它定制处理:
例如批量把含有某关键字的信息的邮件找出来,移入到特定信箱等。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

参考:https://docs.python.org/3/library/imaplib.html
参考:https://tools.ietf.org/html/rfc3501#section-6.4.6
参考:https://stackoverflow.com/questions/3527933/move-an-email-in-gmail-with-python-and-imaplib
 

你可能感兴趣的:(Python,Python)