1
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

我相信这是因为我在收件箱中没有任何消息。现在我想做的是,如果没有消息可以一次又一次地运行,直到有消息出现在我的收件箱中,并在消息上执行相应的操作

4

1 回答 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感兴趣。如果您尽可能坚持下去,其他人更有可能快速阅读您的代码。

于 2011-03-15T17:35:55.993 回答