2009-08-04 4 views
48

Мне интересно инициировать определенное действие при получении электронной почты с определенного адреса по определенной теме. Чтобы это сделать, мне нужно реализовать мониторинг моего почтового ящика, проверяя каждую входящую почту (в частности, я использую gmail). Что это самый простой способ сделать это?Проверка электронной почты с помощью Python

ответ

69

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() 

Вам просто нужно будет запустить этот сценарий как хрон. Не знаете, на какой платформе вы работаете, поэтому YMMV о том, как это делается.

+1

Большое спасибо !!! Он отлично работает. Единственная проблема, с которой я сталкиваюсь сейчас, это то, что мне нужно получить только новые сообщения. Конечно, можно получить все сообщения, а затем сравнить старый список с новым. Однако мне интересно , если есть лучший способ сделать это, если для этого был встроенный метод. – Sasha

+2

В режиме POP gmail позволяет вам получать сообщение только один раз. Последующие соединения не покажут вам сообщение. Если одна из двух вещей не происходит: у вас включен режим «недавнего режима»? См. Здесь: http://mail.google.com/support/bin/answer.py?answer=47948 о том, как его отключить. В качестве альтернативы, если gmail на самом деле дает вам один и тот же адрес электронной почты каждый раз, это может быть связано с тем, что метод quit() не вызывается в вашем поп-соединении. Есть ли исключение, которое может быть поднято, но не поймано до вызова? Затем gmail отправит вам одну и ту же почту. – mazelife

+0

Выход Нет. – GLHF

1

Я нашел pretty good snippet, когда захотел сделать то же самое (и пример использует gmail). Также посмотрите на это google search results.

+2

Ссылка не работает. – Elazar

+0

такой же ссылка из web.archive.org: [Быстрая и грязная проверка сервера электронной почты, python] (http://web.archive.org/web/20090119142342/http://snippets.dzone.com/posts/show/4024) – davedwards

18

Gmail предоставляет атом feed для новых сообщений электронной почты. Вы должны иметь возможность отслеживать это путем аутентификации с помощью py cURL (или какой-либо другой сетевой библиотеки) и вытаскивать фид. Выполнение запроса GET для каждого нового сообщения должно означать его как прочитанное, поэтому вам не нужно будет отслеживать, какие электронные письма вы прочитали.

+0

Любая идея, как отправить правильная информация для авторизации? – PascalVKooten

+0

@PascalvKooten поздний ответ, но формат https: // : @ mail.google.com/mail/feed/atom/ Если включена двухфакторная аутентификация, вы должны создать пароль для приложения: https://support.google.com/accounts/answer/185833?hl=nl – Whitebird

+0

@Whitebird По-прежнему стоит исследовать. Думаю, мой интерес к этому асинхронен; теперь, когда у меня есть ответ, я все равно могу побеседовать с ним^_^Спасибо! – PascalVKooten

8

Хотя я не был специфичен для Python, я всегда любил procmail везде, где я мог его установить ...!

Просто используйте как некоторые из ваших линий действий для условий по вашему выбору. | pathtoyourscript (вертикальная полоса AKA, за которой следует сценарий, который вы хотите исполнить в этих случаях), и ваша почта получает в соответствии с условиями вашего выбора сценарий по вашему выбору, чтобы он делал все, что захотел, - трудно думать о более общем подходе к «инициировать действия по вашему выбору после получения писем, которые отвечают вашим конкретным условиям! Конечно, нет ограничений на то, сколько условий вы можете проверить, сколько строк действий одно условие может вызвать (только приложить все линии действия, которые вы хотите в { } скобки), и т.д., и т.д.

+0

Procmail действительно не решит проблему запуска действия (если данное действие не отправляет сообщение). –

+5

@J. Питерсон, ты шутишь, правда ?! '| pathtoyourscript', и вы можете начать свой сценарий выбора и направить свою почту на него, когда ваши любимые условия будут удовлетворены, а скрипт может делать что угодно - как это НЕ «запускает действие» ?! –

0

недавно я решил эту проблему с помощью Procmail и питона

Прочитайте документацию для procmail. Вы можете сказать ему, чтобы отправить все входящие сообщения электронной почты для питона сценария, как это в специальный 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 
4

Люди, кажется, накачанный о Лэмсон:

https://github.com/zedshaw/lamson

Это SMTP-сервер полностью написанный на Python. Я уверен, что вы могли бы использовать это, чтобы делать все, что вам нужно - просто пересылайте сообщения Gmail на этот SMTP-сервер, а затем делайте то, что хотите.

Однако, я думаю, что, возможно, проще всего выполнить рекомендацию по подаче ATOM выше.

EDIT: Lamson был оставлен

+0

лосось - это вилка, пытаясь достичь питона 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

Я вернулся к этому обрыву, потому что что-то беспокоило меня ... Таким образом, не только общий алгоритм проверки является ошибочным, но и логическим op в if-s является неправильным. if ('@' и '.') В n: всегда будет выглядеть только для '.', Потому что булевский op будет '@' и ',' будет оцениваться как '.'. И не заставляйте меня начинать со второго, если. – Todor

Смежные вопросы