Python 3.x 检查电子邮件收件箱是否为空(imaplib、python3)

Python 3.x 检查电子邮件收件箱是否为空(imaplib、python3),python-3.x,imap,Python 3.x,Imap,我正在写一个脚本,可以阅读电子邮件,然后根据标题回答一些问题。它每隔一段时间检查一次收件箱,然后对收件箱中的任何电子邮件做出响应。最后,它会将所有已读电子邮件移动到已删除文件夹: import time import sys import imaplib import smtplib import getpass import email import email.header import datetime EMAIL_ACCOUNT = "YOUR_EMAIL_ACCOUNT" PW =

我正在写一个脚本,可以阅读电子邮件,然后根据标题回答一些问题。它每隔一段时间检查一次收件箱,然后对收件箱中的任何电子邮件做出响应。最后,它会将所有已读电子邮件移动到已删除文件夹:

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总是“OK”。 我试图查看IMAP文档,但没有找到任何可以评估状态的
search
参数

检查(在本例中)收件箱是否为空的正确方法是什么


提前感谢您的帮助

如果没有消息,则IMAP对所有消息的搜索将返回OK和0消息。换句话说,OK表示服务器能够按照您的意愿解释和执行它。备选方案为否(例如权限问题)或不好(例如语法错误)。状态OK,结果为零表示为空,另一个状态表示您不知道


顺便说一句,我建议你只在最后一次调用expunge,而不是在每个商店之后。它也会这样做,并且运行得更快。

我找到了问题的正确答案:
rv,data=Mailbox.search()
data
变量中返回一个简单字符串。我只是没有打印出正确的,每次都会被覆盖

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

越简单越好。我将接受阿恩特的回答,因为我从那里得到了帮助。

非常感谢您的帮助!我在IMAP纪录片中也发现了这一点,并发现它不可能是正确的。
数据
返回为
b['0']
,但如何将其与语句匹配?我试过
data==“0”
data==“0”
data==“b'0']”
,但这些都不起作用。(我还更改了代码中的explunge部分,谢谢)恐怕我对python不是很了解,但是如果不是数据的话,
怎么样?我在python代码中看到了这一点。顺便说一句,如果答案值得“非常感谢”,你应该接受。我相信这是一个橙色的图标。