#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(«»» «Имя метки» «»»).