检查电子邮件收件箱是否为空(imaplib,python3)
check if email inbox is empty (imaplib, python3)
我正在编写一个脚本来读取电子邮件,然后根据 header 回复一些内容。它每隔一段时间检查收件箱,然后回复收件箱中的任何电子邮件。最后,它会将所有已读电子邮件移至已删除的文件夹:
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 搜索所有 returns OK 和 0 条消息。换句话说,OK 意味着服务器能够按照您的意愿解释和执行它。备选方案是 NO(例如权限问题)或 BAD(例如语法错误)。状态正常,零结果意味着空,另一个状态意味着你不知道。
顺便说一句,我建议您只在最后调用一次 expunge,而不是在每次存储之后调用。它会做同样的事情,而且 运行 更快。
我找到了问题的正确答案:
rv, data = Mailbox.search()
returns data
变量中的一个简单字符串。我只是没有打印出正确的,每次都会被覆盖。
if data == [b'']:
print("The mailbox is empty")
return
越简单越好。我会接受 arnt 的回答,因为我从那里得到了帮助。
我正在编写一个脚本来读取电子邮件,然后根据 header 回复一些内容。它每隔一段时间检查收件箱,然后回复收件箱中的任何电子邮件。最后,它会将所有已读电子邮件移至已删除的文件夹:
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 搜索所有 returns OK 和 0 条消息。换句话说,OK 意味着服务器能够按照您的意愿解释和执行它。备选方案是 NO(例如权限问题)或 BAD(例如语法错误)。状态正常,零结果意味着空,另一个状态意味着你不知道。
顺便说一句,我建议您只在最后调用一次 expunge,而不是在每次存储之后调用。它会做同样的事情,而且 运行 更快。
我找到了问题的正确答案:
rv, data = Mailbox.search()
returns data
变量中的一个简单字符串。我只是没有打印出正确的,每次都会被覆盖。
if data == [b'']:
print("The mailbox is empty")
return
越简单越好。我会接受 arnt 的回答,因为我从那里得到了帮助。