почтовый ящик imaplib с «&» не открывается - PullRequest
0 голосов
/ 27 февраля 2019

Я адаптировал скрипт из 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

1 Ответ

0 голосов
/ 27 февраля 2019

Да, почтовые ящики IMAP используют модифицированную кодировку UTF-7, в которой в качестве символа кодировки используется &.Я не верю, что в imaplib встроена кодировка UTF-7, но вы можете использовать команду LIST, чтобы получить фактическое имя папки.Это вероятно Inbox.Here &- There.Также обратите внимание, что пробелы могут требовать кавычек вокруг имени папки "Inbox.Here &- There"

...