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 に答える