Я сделал эту небольшую программу, которая принимает некоторые входные данные (электронные письма), и, посмотрев, существуют ли они, ищет соответствующий идентификатор и удаляет его. Он работает (я использую его с crontab), но кажется лишним. У меня было несколько проблем с функцией разделения и декодирования, в основном потому, что декодирование дает мне списки строк, разделенных табуляцией. Хотелось бы оптимизировать код и избавиться от всего этого for
циклы, потому что код кажется длинным и неряшливым. Какие-нибудь советы?
bastards = [
"team@mail.kamernet.nl",
"supportdesk@kamernet.nl",
"noreply@pararius.nl",
]
with imaplib.IMAP4_SSL(host="imap.gmail.com",port=993) as imap:
imap.login(email,password)
imap.select('INBOX',readonly=False)
listy = []
for bastard in bastards:
resp_code, respy = imap.search(None, f'FROM {bastard}')
respy = respy[0].decode().split()
listy.append(respy)
listy = [x for x in listy if x]
for i in listy:
for j in i:
imap.store(j,'+FLAGS','\Deleted')
print('email_deleted')
imap.expunge()
imap.close()
imap.logout()
1 ответ
В listy
понимание может быть преобразовано в генератор:
def search_emails(imap, senders):
for sender in senders:
typ, data = imap.search(None, f'FROM {sender}')
msg_nums = data[0].decode().split()
# check for content here
if msg_nums:
yield msg_nums
with imaplib.IMAP4_SSL(host="imap.gmail.com", port=993) as imap:
imap.login(email, password)
imap.select('INBOX', readonly=False)
# also, visually breaking up the program with newlines
# makes it more readable
for email in search_emails(imap, senders):
for j in email:
imap.store(j, '+FLAGS', '\Deleted')
print('email_deleted')
Это оценивается лениво, поэтому вам не нужно хранить все свои электронные письма в списке, который вы отфильтруете позже. Он фильтрует их, когда вы перебираете генератор.
for j in email
Этот внутренний цикл не обязательно должен быть там, согласно документации на IMAP4.store
, он принимает набор сообщений, а не по одному:
~snip~
for emails in search_emails(imap, senders):
imap.store(emails, '+FLAGS', '\Deleted')
print('emails_deleted')
В официальных документах также нет decode
раздел при разборе вывода из IMAP4.search
:
typ, data = M.search(None, 'ALL')
for num in data[0].split(): # <------ Here
M.store(num, '+FLAGS', '\Deleted')
Я не использовал эту библиотеку, поэтому я не буду рассуждать о том, почему ваш фрагмент отличается, а просто примечание.
Имена переменных
Вещи как for i in iterable
а также for j in iterable
обычно подразумевают индексы. Я бы изменил имена здесь, чтобы точнее отображать то, что они есть, это делает код более читабельным.
Параметры функции
Добавьте пробелы между параметрами функции:
# go from this
imap.login(email,password)
# to this
imap.login(email, password)
Пароли
Вы можете использовать getpass
библиотека для запроса скрытого пароля:
from getpass import getpass
password = getpass()
Я не уверен, как вы сейчас реализуете хранение пароля, поскольку вы его не указали.
невероятное объяснение
— Алекс Д’аго