Python imaplib не может выбрать () пользовательские ярлыки gmail

#python #email #gmail #imap #imaplib

#python #Адрес электронной почты #gmail #imap #imaplib

Вопрос:

У меня есть бот, который я пишу, используя imaplib на python, чтобы получать электронные письма из gmail и выводить из них некоторые полезные данные. Однако я столкнулся с проблемой выбора папки «Входящие»; существующая система сортировки использует пользовательские метки для разделения писем от разных клиентов. Я частично воспроизвел эту систему в своем тестовом электронном письме, но imaplib.select() выдает сообщение «imaplib.IMAP4.error: ошибка ВЫБОРА команды: BAD [b’could not parse command’]» с пользовательскими метками. Скриншот прикреплен У моего бота нет проблем с папками gmail по умолчанию, получением входящих сообщений или [Gmail] / Spam. В этом случае позже в коде появляется ошибка, связанная с совершенно другой проблемой, которую мне еще предстоит исправить. Дело, однако, в том, что imaplib.select() успешно работает с почтовыми ящиками по умолчанию, а не только с пользовательскими метками.

Способ работы моего кода заключается в том, что он просматривает все доступные почтовые ящики, сравнивает его с введенным пользователем именем и, если они совпадают, сохраняет имя и присваивает логическому значению значение true, чтобы сигнализировать о том, что оно нашло совпадение. Затем он проверяет, было ли совпадение (существует введенный пользователем почтовый ящик), в противном случае выдается сообщение об ошибке и выполняется сброс. Затем он пытается выбрать почтовый ящик, который ввел пользователь.

Я проверил, что переменная, в которую программа сохраняет имя почтового ящика, соответствует тому, что указано в качестве имени в команде imap.list(). Я понятия не имею, в чем проблема.

Я мог бы обойти этот процесс, перебрав всю почту, чтобы найти письма, которые я ищу, но гораздо эффективнее использовать существующую систему сортировки из-за огромного количества писем в учетной записи, которую я буду использовать.

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ: код прикреплен после запроса. Спасибо человеку, который сказал мне это сделать.

 '''
Fetches emails from the specified inbox and outputs them to a popup
'''
def fetchEmails(self):
    #create an imap object. Must be local otherwise we can only establish a single connection
    #imap states are kinda bad
    imap = imaplib.IMAP4_SSL(host="imap.gmail.com", port="993")
    #Login and fetch a list of available inboxes
    imap.login(username.get(), password.get())
    type, inboxList = imap.list()
        
    #Set a reference boolean and iterate through the list
    inboxNameExists = False
    for i in inboxList:
        #Finds the name of the inbox
        name = self.inboxNameParser(i.decode())
            
        #If the given inbox name is encountered, set its existence to true and break
        if name.casefold().__eq__(inboxName.get().casefold()):
            inboxNameExists = True
            break
        
        #If the inbox name does not exist, break and give error message
        if inboxNameExists != True:
            self.logout(imap)
            tk.messagebox.showerror("Disconnected!", "That Inbox does not exist.")
            return
        
    '''
    If/else to correctly feed the imap.select() method the inbox name
    Apparently inboxes containing spaces require quoations before and after
        
    Selects the inbox and pushes it to a variable
    two actually but the first is unnecessary(?)
    imap is weird
    '''
    if(name.count(" ") > 0):
        status, messages = imap.select("""   name   """)
    else:
        status, messages = imap.select(name);
    
    #Int containing total number of emails in inbox
    messages = int(messages[0])
        
    #If there are no messages disconnect and show an infobox
    if messages == 0:
        self.logout(imap)
        tk.messagebox.showinfo("Disconnected!", "The inbox is empty.")
        
    self.mailboxLoop(imap, messages)
 

Выяснил проблему после нескольких часов общения с другом. Как оказалось, проблема заключалась в том, что imap.select() требует кавычек вокруг имени почтового ящика, если оно содержит пробелы. Так что imap.select («ВХОДЯЩИЕ») подойдет, но с пробелами вам понадобится imap.select(«»» «Имя метки» «»»)

Вы можете видеть, что это отражено в коде, который я опубликовал с последним оператором if / else .

Комментарии:

1. Пожалуйста, укажите код в вопросе. (Фотографии текста неприемлемы для SO; люди должны иметь возможность искать код и сообщения об ошибках и получать результаты, понимаете?)

Ответ №1:

Python imaplib требует, чтобы имена почтовых ящиков с пробелами были окружены апостроф. Так что imap.select(«ВХОДЯЩИЕ») подойдет, но с пробелами вам понадобится imap.select(«»» «Имя метки» «»»).