使用Python邮箱模块保存IMAP消息 [英] Saving IMAP messages with Python mailbox module
问题描述
我正在使用imaplib
从IMAP将消息下载到mbox(带有mailbox
模块):
I'm downloading messages from IMAP with imaplib
into a mbox (with mailbox
module):
import imaplib, mailbox
svr = imaplib.IMAP4_SSL('imap.gmail.com')
svr.login('myname@gmail.com', 'mypaswword')
resp, [countstr] = svr.select("[Gmail]/All Mail", True)
mbox = mailbox.mbox('mails.mbox')
for n in range(...):
resp, lst1 = svr.fetch(n, 'UID') # the UID of the message
resp, lst2 = svr.fetch(n, '(RFC822)') # the message itself
mbox.add(lst2[0][1]) # add the downloaded message to the mbox
#
# how to store the UID of this current mail inside mbox?
#
让我们下载UID = 1 .. 1000
的邮件.下次,我想从第1001条消息开始,而不是从1号消息开始.但是,mailbox.mbox
不会存储任何UID
.因此,下次我打开mbox文件时,将无法知道我们在哪里停了.
Let's download the mails with UID = 1 .. 1000
. Next time, I would like to begin at the 1001th message and not from the 1st. However, mailbox.mbox
does not store the UID
anywhre. So next time I will open the mbox file, it will be impossible to know where we stopped.
模块mailbox
是否有一种自然的方式来存储电子邮件的UID
?
Is there a natural way with the module mailbox
to store the UID
of the emails?
或者也许我不使用mailbox
+ imaplib
应该使用的方式?
Or maybe I don't use mailbox
+ imaplib
the way it should ?
推荐答案
我希望它会有用:
1)库和环境Win7 Anaconda3-4.3.1-Windows-x86_64.exe(新功能可用,但是我已经使用过
1) libraries and environment Win7 Anaconda3-4.3.1-Windows-x86_64.exe (new is available but that what I have used
2)列出所有邮箱:
import getpass, imaplib, sys
def main():
hostname = 'my.mail.server'
username = 'my_user_name'
m = imaplib.IMAP4_SSL(hostname)
m.login(username, 'passowrd')
try:
print('Capabilities:', m.capabilities)
print('Listing mailboxes ')
status, data = m.list()
print('Status:', repr(status))
print('Data:')
for datum in data:
print(repr(datum))
finally:
m.logout()
if __name__ == '__main__':
main()
3)使用上面生成的信息,我们可以将所有电子邮件从邮件服务器转储到目录:
3) Using generated above information we can dump all email messages from mail server to the directories:
import getpass, imaplib, sys, email, os , io
import codecs
BASE_NAME = 'msg_no_'
BASE_DIR = 'D:/my_email/'
def writeTofile(mailDir, partOfName, msg ):
## no need of dos backslash -- newDir = BASE_DIR + mailDir.replace('/', '\\')
newDir = BASE_DIR + mailDir
if not os.path.exists(newDir):
os.makedirs(newDir)
os.chdir(newDir)
# print('Dir:' + os.getcwd() )
file_name = BASE_NAME + partOfName + '.eml'
# print('Write:' + file_name)
fw = open(newDir + '/' + file_name,'w', encoding="utf-8")
fw.write( msg )
fw.close()
return
def processMailDir(m, mailDir):
print('MailDIR:' + mailDir)
m.select(mailbox=mailDir, readonly=True)
typ, data = m.search(None, 'ALL')
for num in data[0].split():
typ, data = m.fetch(num, '(RFC822)')
msg = email.message_from_bytes(data[0][1])
smsg = msg.as_bytes().decode(encoding='ISO-8859-1')
writeTofile(mailDir, num.decode(), smsg )
m.close()
return
def main():
if len(sys.argv) != 3:
hostname = 'my.mail.server'
username = 'my_username'
m = imaplib.IMAP4_SSL(hostname)
m.login(username, 'password')
else:
hostname, username = sys.argv[1:]
m = imaplib.IMAP4_SSL(hostname)
m.login(username, getpass.getpass())
try:
print('Start...')
processMailDir(m, 'INBOX')
processMailDir(m, 'Sent')
processMailDir(m, 'archive/2013/201301')
processMailDir(m, 'archive/2013/201302')
# etc.. etc.. simple as it can be but not simpler
print('Done...')
finally:
m.logout()
if __name__ == '__main__':
main()
以上将您的电子邮件转储至: D:\ my_email \ INBOX \ msg_no_1.eml ... msg_no203.eml
Above will dump your emails to: D:\my_email\INBOX\msg_no_1.eml ... msg_no203.eml
然后,您需要此秘密才能在Windows上打开eml:
then you need this secret to open eml's on windows:
Administrator: cmd.com:
assoc .eml=Outlook.File.eml
ftype Outlook.File.eml="C:\Program Files (x86)\Microsoft Office\Office12\OUTLOOK.EXE" /eml "%1"
亲爱的库存过剩检查员-请保持仁慈,我发现以上内容很有用;例如:smsg = msg.as_bytes().decode(encoding ='ISO-8859-1')花了很长时间才能弄清楚.
Dear stockoverflow censor - please be merciful, I would found above useful; for example this: smsg = msg.as_bytes().decode(encoding='ISO-8859-1') took a long to figure out.
这篇关于使用Python邮箱模块保存IMAP消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!