Python:如果没有收件箱中的消息,如何通过循环检查电子邮件?

时间:2011-03-15 17:25:28

标签: python imaplib gmail-imap

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 :(得分: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。如果你坚持下去,其他人更有可能快速阅读你的代码。