我改编了http://tech.franzone.blog/2012/11/24/listing-imap-mailboxes-with-python/中的脚本,以标识IMAP4电子邮件服务器上的每个邮箱。以下脚本旨在在服务器上备份电子邮件。
如果目标邮箱中包含与号字符(例如“ Here&there”),则下面的脚本可以正常工作。每当我在包含“&”号的邮箱上运行脚本时,都会在日志中收到“错误:无法打开邮箱”消息。请注意,邮箱已被引号引起来。无论如何,我尝试用&
代替&
失败了。想法?
import sys
import imaplib
IMAP_SERVER = '<email server name>'
EMAIL_ACCOUNT = str(sys.argv[1])
EMAIL_FOLDER = "Inbox.Here & there"
OUTPUT_DIRECTORY = '<local directory>' + EMAIL_ACCOUNT + '/' + EMAIL_FOLDER
PASSWORD = str(sys.argv[2])
localtime = time.asctime( time.localtime(time.time()) )
def process_mailbox(M):
"""
Dump all emails in the folder to files in output directory.
"""
logging.basicConfig(level=logging.DEBUG,
filename="DailyFullEmailBackup.log", filemode="a+", format="%(asctime)-15s, %(levelname)-8s %(message)s")
rv, data = M.search(None, "ALL")
if rv != 'OK':
logging.debug ("No messages found!")
return
for num in data[0].split():
rv, data = M.fetch(num, '(BODY.PEEK[])')
if rv != 'OK':
logging.debug ("ERROR getting message %s", num)
return
logging.debug ("Writing message %s", num)
f = open('%s/%s.eml' %(OUTPUT_DIRECTORY, num), 'wb')
f.write(data[0][1])
f.close()
def main():
logging.basicConfig(level=logging.DEBUG, filename="debug.log",
filemode="a+", format="%(asctime)-15s, %(levelname)-8s %(message)s")
logging.debug ("Begin.")
M = imaplib.IMAP4_SSL(IMAP_SERVER)
M.login(EMAIL_ACCOUNT, PASSWORD)
rv, data = M.select(EMAIL_FOLDER)
if rv == 'OK':
logging.debug ( "Processing mailbox: %s", EMAIL_ACCOUNT)
logging.debug ( "Processing folder: %s", EMAIL_FOLDER)
process_mailbox(M)
M.close()
else:
logging.debug ("ERROR: Unable to open mailbox %s", EMAIL_FOLDER)
M.logout()
if __name__ == "__main__":
main()
localtime = time.asctime( time.localtime(time.time()) )
print "Finish time: ", localtime
答案 0 :(得分:0)
是的,IMAP邮箱使用修改后的UTF-7编码,该编码使用&作为编码字符。我不相信imaplib具有内置的UTF-7编码,但是您可以使用LIST命令来获取文件夹的实际名称。可能是Inbox.Here &- There
。另外请注意,空格可能需要在文件夹名称"Inbox.Here &- There"