Я адаптировал скрипт из http://tech.franzone.blog/2012/11/24/listing-imap-mailboxes-with-python/ для идентификации каждого почтового ящика на моем сервере электронной почты IMAP4.Следующий скрипт предназначен для резервного копирования сообщений электронной почты на сервере.
Сценарий, приведенный ниже, работает нормально, КРОМЕ, если целевой почтовый ящик содержит символ амперсанда (например, «Здесь и там»).Каждый раз, когда я запускаю сценарий в почтовом ящике, содержащем амперсанд, в журнале появляется сообщение «ОШИБКА: невозможно открыть почтовый ящик».Обратите внимание, что почтовый ящик уже заключен в кавычки.Во всяком случае, я попытался &
вместо &
безуспешно.Идеи?
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