2009-08-04 24 views
48

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

答えて

69

GmailではGmailの設定パネルでオンにすることができPOP経由で接続する機能を提供し、放棄されています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ジョブとして実行するだけで済みます。あなたがどのようなプラットフォームをしているのかわからないので、YMMVはどのように行われているのですか?

+1

はどうもありがとうございました!!! 素晴らしいです。 私の今の唯一の問題は、新しいメッセージだけを取得する必要があることです。もちろん、すべてのメッセージを取得し、古いリストと新しいメッセージを比較することは可能です。しかし、私は の方が良い方法があれば、そのための方法が組み込まれていれば不思議です。 – Sasha

+2

POPモードでは、gmailはメッセージを1回だけ取り出すことができます。それ以降の接続ではメッセージは表示されません。 2つのうちの1つが起こっていない限り、「最近のモード」がオンになっていますか?無効にする方法については、http://mail.google.com/support/bin/answer.py?answer=47948こちらをご覧ください。 また、gmailが毎回同じメールを実際に送信している場合は、pop接続でquit()メソッドが呼び出されていない可能性があります。おそらくそれが発生しているが、終了する前にキャッチされていない例外はありますか?それからgmailはあなたに同じメールを送ります。 – mazelife

+0

出力はなしです。 – GLHF

1

私はこの同じことをしたいときにpretty good snippetを見つけました(例ではGmailを使用しています)。また、google search resultsもチェックしてください。

+2

リンクが壊れています。 – Elazar

+0

同じリンクからweb.archive。ORG:[クイックと汚い電子メールサーバチェッカー、パイソン](http://web.archive.org/web/20090119142342/http://snippets.dzone.com/posts/show/4024) – davedwards

18

Gmailは、新しいメールメッセージにアトムfeedを提供します。これを監視するには、py cURL(またはその他のネットライブラリ)で認証し、フィードをプルダウンする必要があります。新しいメッセージごとにGETリクエストを作成すると、それを読み取り済みとしてマークする必要があります。そのため、読んだメールを追跡する必要はありません。

+0

送信するためにどのように任意のアイデア正当な情報が承認されるか? – PascalVKooten

+0

@PascalvKooten late answerですが、フォーマットはhttps:// @mail.google.com/mail/feed/atom/ 2因子認証が有効な場合は、https:///support.google.com/accounts/answer/185833?hl=nl – Whitebird

+0

@Whitebird調査する価値はあります。私はこれに興味があるのは非同期だと思う。今私は答えを持っている私はまだ^ _ ^ありがとう! – PascalVKooten

8

Python固有のものではありませんが、いつでも私がインストールできるのはprocmailです。

| pathtoyourscript(この場合、実行するスクリプトに続く縦棒AKAパイプ)、あなたの選択した条件の下であなたのメールがあなたの選択した条件のためにパイプされますあなたが望むものを何でもしようとするためにあなたが選んだスクリプト - あなたの特定の条件を満たすメールを受け取ったときにあなたが選んだ行動を引き起こすためのより一般的なアプローチを考えるのは難しい!!もちろん、どれくらい多くの条件中括弧内にあるすべてのアクション行を囲んでください)

+0

Procmailは実際にアクションを引き起こす問題を解決しません(問題のアクションがメッセージを送信している場合を除く)。 –

+5

@J。ピーターソン、冗談だよね? '|あなたの好きな条件が満たされたときにあなたのスクリプトを起動して、あなたのメールをパイプすることができます。そして、スクリプトは何でもすることができます - どのように "アクションをトリガする"ではありませんか? –

0

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

procmailのドキュメントをお読みください。あなたは、Pythonは、あなたはおそらく、電子メールでやりたいことができ何かを行うことができます利用できる「電子メール」のパッケージを持っている

:0: 
| ./scripts/ppm_processor.py 

特別procmailの設定ファイルに次のように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 
4

人々はラムソンについて汲み上げているように見える:

https://github.com/zedshaw/lamson

それはPythonで書かれたSMTPサーバーです。私はあなたが必要とする全てを行うためにそれを活用できると確信しています - 単にそのSMTPサーバーにGmailメッセージを転送してから、あなたがすることをしてください。

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

EDIT:ラムソンは

+0

サーモンは、Python 3に到達しようと、フォークである - それははるかに最近触れている - https://github.com/moggers87/salmon – user2692263

-7
print('please enter str') 
def email(n=str):  
    if ('@' and '.') in n: 
     z=n.find('@') 
     c=n.find('.') 
     if type(n[:z] and n[z:c] and n[c:])==str: 
      print('valid email') 
     else: 
      print('Invalid email') 
    else: 
     print('Invalid email') 
+5

これは私が今まで見たことのない最も恐ろしい、最も間違った完全な、そして間違った電子メールの検証です。私がそのエラーを指摘するなら、私はどこから始めるべきか分からないでしょう。いつでもどこでもそれを使用しないでください。 – Todor

+0

私は何かが私を悩ませてしまったので、これをスナップしました。検証のための一般的なアルゴリズムに欠陥がありますが、if-sの論理演算が間違っています。 もし(「@」と「 『)のN:』。 『 は常にだけを探します、ブールopが『@』と』、」と評価されるため、「」。 そして、私は2番目の場合に開始されません。 – Todor

関連する問題