Python:如何在收件箱没有邮件的情况下循环检查邮件?

1 投票
1 回答
2065 浏览
提问于 2025-04-16 13:45
import serial
import imaplib
from time import sleep

IMAP_SERVER='imap.gmail.com'
IMAP_PORT=993
ser= serial.Serial ('/dev/ttyACM0',9600)

M = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT)
rc, resp = M.login('user@gmail.com', 'password')
print rc, resp

while True: 
    M.select()
    for msg_num in M.search("INBOX", "UNDELETED")[1][0].split():
        msg = M.fetch('1', '(BODY.PEEK[TEXT])') 
        String = msg[1][0][1][139:161]
        print String
        if String == "This is just a test...":
            ser.write('0')
    sleep(1)

我刚开始学习Python编程,以上这段Python代码是我想用来做一个程序的。当我在终端运行这段代码时,它会告诉我我的账户已经通过验证,然后显示在字符139到161之间的信息,示例邮件中的内容是:

这只是一个测试...

这个内容会在终端上打印出来。如果我把收件箱里的消息删除,终端会显示:

String = msg[1][0][1][139:161]
TypeError: 'NoneType' object is unsubscriptable

我觉得这是因为我的收件箱里没有任何消息。现在我想做的是,如果没有消息,就一直重复运行,直到我的收件箱里出现消息,然后根据消息的内容采取相应的行动。

1 个回答

0

一个简单粗暴的解决办法是捕捉到这个 TypeError 错误。可以这样做:

try:
    String = msg[1][0][1][139:161]
except TypeError:
    continue

不过,这个方法还有改进的空间。首先,你可以使用

if 'This is just a test...' in String:
    # ...

而不是把你的消息内容切成一片一片的,依赖于准确的位置。你也可以确认一下 msg[1][0] 是否是你想要的内容元组,或者遍历 msg 中的项目,直到找到它。

你可能还会对阅读 PEP 8 感兴趣。如果你能遵循这个规范,其他人会更容易快速理解你的代码。

撰写回答