2009-08-04 14 views
48

Chcę wywołać określone działanie po otrzymaniu wiadomości e-mail od określonego adresu o określonym temacie. Aby to zrobić, muszę zaimplementować monitorowanie mojej skrzynki pocztowej, sprawdzając każdą przychodzącą pocztę (w szczególności używam Gmaila). jaki jest najprostszy sposób to zrobić?Sprawdzanie poczty e-mail za pomocą Pythona

Odpowiedz

69

Gmail zapewnia możliwość podłączenia przez pop, które można włączyć w panelu ustawień Gmail. Python może łatwo nawiązać połączenia przez 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() 

Wystarczy uruchomić ten skrypt jako zadanie cron. Nie wiesz, na jakiej platformie jesteś, więc YMMV, jak to się robi.

+1

Dziękuję bardzo !!! Działa świetnie. Jedyny problem jaki mam teraz to to, że muszę pobrać tylko nowe wiadomości. Oczywiście możliwe jest pobranie wszystkich wiadomości, a następnie porównanie starej listy z nową. Jednak zastanawiam się, , czy istnieje lepszy sposób to zrobić, jeśli istnieje wbudowana metoda do tego. – Sasha

+2

W trybie POP Gmail zezwala tylko na jednorazowe pobranie wiadomości. Kolejne połączenia nie pokażą ci wiadomości. Chyba że jedna z dwóch rzeczy się dzieje: czy masz włączony tryb "ostatnio włączony"? Zobacz tutaj: http://mail.google.com/support/bin/answer.py?answer=47948, jak to wyłączyć. Alternatywnie, jeśli w Gmailu jest za każdym razem ten sam e-mail, może to być spowodowane tym, że metoda quit() nie jest wywoływana w Twoim połączeniu pop. Czy istnieje wyjątek, który może zostać podniesiony, ale nie został złapany przed wywołaniem rezygnacji? Następnie Gmail da ci tę samą pocztę. – mazelife

+0

Dane wyjściowe nie występują. – GLHF

1

Znalazłem pretty good snippet kiedy chciałem zrobić to samo (a przykład używa Gmaila). Sprawdź również na tym google search results.

+2

Link jest uszkodzony. – Elazar

+0

ten sam link z web.archive.org: [Szybkie i brudne narzędzie do sprawdzania serwera pocztowego, python] (http://web.archive.org/web/20090119142342/http://snippets.dzone.com/posts/show/4024) – davedwards

18

Gmail dostarcza atomowi feed dla nowych wiadomości e-mail. Powinieneś być w stanie to monitorować, uwierzytelniając się przy pomocy cURL (lub innej biblioteki sieciowej) i ściągając kanał. Wykonywanie żądania GET dla każdej nowej wiadomości powinno oznaczać ją jako przeczytaną, aby nie trzeba było śledzić przeczytanych e-maili.

+0

Każdy pomysł, jak wysłać odpowiednie informacje, które należy autoryzować? – PascalVKooten

+0

@ PascalvKołącz późną odpowiedź, ale format to https: // : @ mail.google.com/mail/feed/atom/ Jeśli włączone jest uwierzytelnianie dwuskładnikowe, powinieneś utworzyć hasło aplikacji: https://support.google.com/accounts/answer/185833?hl=pl – Whitebird

+0

@Whitebird Wciąż brzmi to warte zbadania. Myślę, że moje zainteresowanie jest asynchroniczne; teraz, gdy mam odpowiedź, wciąż mogę z tym pogodzić^_^Dzięki! – PascalVKooten

8

Chociaż nie jest to specyficzne dla Pythona, zawsze lubiłem procmail, gdziekolwiek mogłem go zainstalować ...!

Po prostu używaj jako niektórych linii działania dla warunków do wyboru | pathtoyourscript (pionowy pasek AKA pipe, a następnie skrypt, który chcesz wykonać w tych przypadkach) i twoja poczta zostanie wysłana, zgodnie z wybranymi przez ciebie warunkami, do wybrany przez ciebie skrypt, aby zrobił cokolwiek zechce - trudno wymyślić bardziej ogólne podejście do "wyzwalania akcji twojego wyboru po otrzymaniu maili spełniających twoje specyficzne warunki !! Oczywiście nie ma ograniczeń co do liczby warunków można sprawdzić, ilu kierunki działań jeden warunek może wywołać (tylko ująć wszystkie linie działania, które mają w { } szelki), itp, itd.

+0

Procmail naprawdę nie rozwiąże problemu uruchomienia akcji (chyba że dana akcja wysyła wiadomość). –

+5

@J. Peterson, żartujesz, prawda ?! '| pathtoyourscript' i możesz uruchomić wybrany przez siebie skrypt i przesłać do niego pocztę, gdy twoje ulubione warunki są spełnione, a skrypt może zrobić WSZYSTKO czego chce - jak to NIE "wywoływać akcji" ?! –

0

ja niedawno rozwiązał ten problem za pomocą procmail i Python

Przeczytaj dokumentację procmaila. Można powiedzieć, to wysłać e-mail do wszystkich przychodzących skrypt Pythona jak to w pliku konfiguracyjnym specjalnego procmail

:0: 
| ./scripts/ppm_processor.py 

Python posiada pakiet „email” dostępną że może zrobić wszystko, czego można chcieć zrobić z poczty elektronicznej. Przeczytać na poniższych nich ....

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

Ludzie wydają się być pompowana w górę o Lamson:

https://github.com/zedshaw/lamson

Jest to serwer SMTP w całości napisany w Pythonie. Jestem pewien, że możesz wykorzystać to do zrobienia wszystkiego, czego potrzebujesz - po prostu przesyłaj wiadomości z Gmaila na ten serwer SMTP, a następnie rób to, co chcesz.

Jednak uważam, że najprawdopodobniej najprościej jest wykonać powyższe zalecenie paszportu ATOM.

EDIT: Lamson został opuszczony

+0

łosoś jest widelcem, starając się dotrzeć do python 3 - jest o wiele bardziej ostatnio dotykany - 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

To jest najbardziej przerażająca, nieprawdziwie pełna i niepoprawna weryfikacja poczty e-mail, jaką kiedykolwiek widziałem; gdybym zwrócił uwagę na jej błędy, nie wiedziałbym od czego zacząć. Proszę, nigdy go nie używajcie. – Todor

+0

Wróciłem do tego snipped, ponieważ coś mi przeszkadzało ... Więc nie tylko ogólny algorytm sprawdzania poprawności jest wadliwy, ale logiczne op w if-s jest zupełnie błędne. jeśli ("@" i ".") W n: będzie zawsze wyglądać tylko dla ".", Ponieważ operacja boolowska "@" i "," zostanie obliczona na ".". I nie daj mi zacząć od drugiego, jeśli. – Todor

Powiązane problemy