проверить, если почтовый ящик пуст (imaplib, python3) - PullRequest
0 голосов
/ 29 июня 2018

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

import time
import sys
import imaplib
import smtplib
import getpass
import email
import email.header
import datetime

EMAIL_ACCOUNT = "YOUR_EMAIL_ACCOUNT"
PW = "YOUR_PASSWORD"

EMAIL_FOLDER = "INBOX"

def process_mailbox(M):
    #try to log in to the mail server with your credentials
    try:
        rv, data = M.login(EMAIL_ACCOUNT, PW) 
        print(rv, data)
    except imaplib.IMAP4.error: #except an error and exit
        print ("LOGIN FAILED!")
        sys.exit(1)

    #set the mail server for reading mails          
    rv, data = M.select(EMAIL_FOLDER)
    print(rv, data)
    rv, data = M.search(None, "ALL") 

    # !!-----------------------------------------------------
    #here rv always return "OK" therefore the next if clause
    #also is always false although it should be True

    if rv != 'OK': #
        print("No messages found, when i tried at", datetime.datetime.now())
        return   

    for num in data[0].split():
        rv, data = Mailbox.fetch(num, '(RFC822)') #returns tuple fetch(message_set, message parts)    
        if rv != 'OK': #if rv (assigned above) is OK print an error message and return
            print("ERROR getting message", num)
            return

        msg = email.message_from_bytes(data[0][1])
        #decode the header and make a readable header
        hdr = email.header.make_header(email.header.decode_header(msg['Subject']))
        subject = str(hdr) #convert the header to a string

    for num in data[0].split(): #for all the mail in the directory
        box.store(num, '+FLAGS', '\\Deleted') #flag them as deleted

    box.expunge()  #and delete them all

    Mailbox.close() 
    Mailbox.logout()


while True:
    print("Processing mailbox...\n")
    Mailbox = imaplib.IMAP4_SSL('imap.gmail.com')
    process_mailbox(Mailbox)
    time.sleep(10)

Я где-то нашел код if rv != "OK":, но он, кажется, не работает правильно (больше?), Поскольку rv всегда в порядке, независимо от того, есть ли электронные письма во входящей почте. Я попытался просмотреть документацию IMAP, но не нашел аргументов для search, которые могли бы оценить состояние.

Как правильно проверить, является ли (в этом случае) входной почтовый ящик пустым?

Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Я нашел правильный ответ на проблему: rv, data = Mailbox.search() возвращает простую строку в переменной data. Я просто не распечатал правильную, которая перезаписывается каждый раз.

if data == [b'']: 
    print("The mailbox is empty")
    return

Так легко, как только можно. Я приму ответ Арнта, так как я получил оттуда помощь.

0 голосов
/ 29 июня 2018

Если сообщений нет, поиск IMAP для ALL возвращает OK и 0 сообщений. Другими словами, ОК означает, что сервер смог интерпретировать и выполнить его так, как вы хотели. Альтернативы - НЕТ (например, проблема с разрешениями) или BAD (например, ошибка синтаксиса). Состояние ОК и нулевые результаты означают пустой, другой статус означает, что вы не знаете.

Кстати, я предлагаю вам вызывать expunge только один раз, в конце, а не после каждого магазина. Он будет делать то же самое и работать быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...