Удаление электронной почты cron

Я сделал эту небольшую программу, которая принимает некоторые входные данные (электронные письма), и, посмотрев, существуют ли они, ищет соответствующий идентификатор и удаляет его. Он работает (я использую его с 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 ответ
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()

Я не уверен, как вы сейчас реализуете хранение пароля, поскольку вы его не указали.

  • невероятное объяснение

    – Алекс Д’аго

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *