web-dev-qa-db-ja.com

Pythonでメールをチェックする

特定の件名の特定のアドレスからメールを受信すると、特定のアクションをトリガーすることに興味があります。そのためには、メールボックスの監視を実装し、すべての受信メールをチェックする必要があります(特に、Gmailを使用しています)。それを行う最も簡単な方法は何ですか?

51
Sasha

GmailにはPOP経由で接続する機能があり、Gmail設定パネルで有効にできます。 Pythonは、POPを介した接続を非常に簡単に行うことができます。

import poplib
from email import parser

pop_conn = poplib.POP3_SSL('pop.gmail.com')
pop_conn.user('username')
pop_conn.pass_('password')
#Get messages from server:
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message intom an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
for message in messages:
    print message['subject']
pop_conn.quit()

このスクリプトをcronジョブとして実行するだけです。どのプラットフォームを使用しているのかわかりません。

71
mazelife

Gmailは、新しいメールメッセージに対してatom feed を提供します。pycURL(または他のネットライブラリ)で認証し、フィードをプルダウンすることでこれを監視できるはずです。 。新しいメッセージごとにGETリクエストを行うと、開封済みとしてマークされるので、どのメールを読んだかを追跡する必要はありません。

19
Dana the Sane

Python固有ではありませんが、私はいつも procmail どこにインストールしても好きでした...!

| pathtoyourscript(これらの場合に実行するスクリプトが続く垂直バーAKAパイプ)の選択条件のアクションラインの一部として使用すると、メールは、選択した条件の下で、好きなスクリプトを実行します。「特定の条件を満たすメールを受信したときに、選択したアクションをトリガーするより一般的なアプローチを考えるのは難しいです。もちろん、条件の数に制限はありません」 1つの条件でトリガーできるアクション行数(必要なすべてのアクション行を{ }中括弧で囲むだけ)などを確認できます。

8
Alex Martelli

人々はラムソンについて興奮しているようです:

https://github.com/zedshaw/lamson

それはすべてPythonで書かれたSMTPサーバーです。それを活用して、必要なことをすべて実行できると確信しています。GmailメッセージをそのSMTPサーバーに転送してから、必要なことを実行するだけです。

ただし、上記のATOMフィードの推奨事項を実行するのがおそらく最も簡単だと思います。

編集:ラムソンは放棄されました

4
Adam Nelson

これと同じことをしたいときに pretty good snippet を見つけました(そしてこの例ではgmailを使用しています)。これについても google検索結果 もご覧ください。

1
Kredns

私は最近、procmailとpythonを使用してこの問題を解決しました

Procmailのドキュメントを読んでください。すべての受信メールをpythonのような特別なprocmail構成ファイルのスクリプトに送信するように指示できます。

:0:
| ./scripts/ppm_processor.py

Pythonには、電子メールでやりたいことを何でもできる「電子メール」パッケージがあります。次のものを読んでください。

from email.generator import Generator
from email import Message
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.mime.multipart import MIMEMultipart
0
user122299