2009-08-04 59 views
48

Tôi muốn kích hoạt một hành động nhất định khi nhận được email từ địa chỉ cụ thể với chủ đề cụ thể. Để có thể làm như vậy, tôi cần phải thực hiện theo dõi hộp thư của mình, kiểm tra mọi thư đến (cụ thể là tôi sử dụng gmail). cách dễ nhất để làm điều đó là gì?Kiểm tra email bằng Python

Trả lời

69

Gmail cung cấp khả năng kết nối qua POP mà bạn có thể bật trong bảng cài đặt gmail. Python có thể tạo các kết nối qua POP khá dễ dàng:

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

Bạn chỉ cần chạy tập lệnh này dưới dạng công việc định kỳ. Bạn không chắc chắn về nền tảng bạn đang sử dụng để YMMV thực hiện như thế nào.

+1

Cảm ơn bạn rất nhiều !!! Nó hoạt động rất tốt. Vấn đề duy nhất tôi có bây giờ là tôi chỉ cần truy xuất thư mới. Tất nhiên có thể truy xuất tất cả các tin nhắn và sau đó so sánh danh sách cũ với danh sách mới. Tuy nhiên tôi tự hỏi nếu có một cách tốt hơn để làm điều đó, nếu có một phương pháp được xây dựng trong đó. – Sasha

+2

Ở chế độ POP, gmail sẽ chỉ cho phép bạn truy xuất thư một lần. Các kết nối tiếp theo sẽ không hiển thị thông báo cho bạn. Trừ khi một trong 2 điều đang xảy ra: bạn có bật chế độ "chế độ gần đây" không? Xem tại đây: http://mail.google.com/support/bin/answer.py?answer=47948 về cách tắt tính năng đó. Hoặc, nếu gmail thực sự cung cấp cho bạn cùng một email mỗi lần, có thể là do phương thức quit() không được gọi trên kết nối pop của bạn. Có một ngoại lệ có lẽ đó là được nêu ra nhưng không bị bắt trước khi gọi bỏ thuốc lá? Sau đó, gmail sẽ cung cấp cho bạn cùng một thư. – mazelife

+0

Đầu ra là Không. – GLHF

1

Tôi đã tìm thấy pretty good snippet khi tôi muốn thực hiện điều tương tự này (và ví dụ sử dụng gmail). Ngoài ra, hãy xem google search results về điều này.

+2

Liên kết bị hỏng. – Elazar

+0

cùng một liên kết từ web.archive.org: [Trình kiểm tra máy chủ email nhanh và bẩn, trăn] (http://web.archive.org/web/20090119142342/http://snippets.dzone.com/posts/show/4024) – davedwards

18

Gmail cung cấp nguyên tử feed cho thư email mới. Bạn sẽ có thể theo dõi điều này bằng cách xác thực với py cURL (hoặc một số thư viện net khác) và kéo xuống nguồn cấp dữ liệu. Thực hiện yêu cầu GET cho mỗi thư mới sẽ đánh dấu nó là đã đọc, vì vậy bạn sẽ không phải theo dõi email nào bạn đã đọc.

+0

Bất kỳ ý tưởng nào về cách gửi thông tin phù hợp để được ủy quyền? – PascalVKooten

+0

@PascalvKooten trả lời muộn, nhưng định dạng là https: // : @ mail.google.com/mail/feed/atom/ Nếu xác thực hai yếu tố được bật, bạn nên tạo mật khẩu dành riêng cho ứng dụng: https://support.google.com/accounts/answer/185833?hl=nl – Whitebird

+0

@Whitebird Nó vẫn có vẻ đáng để điều tra. Tôi đoán sự quan tâm của tôi về điều này là không đồng bộ; bây giờ tôi có một câu trả lời tôi vẫn có thể gây rối với nó^_^Cảm ơn! – PascalVKooten

8

Mặc dù không phải Python cụ thể, tôi luôn yêu thích procmail ở bất cứ đâu tôi có thể cài đặt nó ...!

Chỉ sử dụng như một số dòng hành động cho các điều kiện bạn chọn | pathtoyourscript (ống AKA thanh dọc theo sau là tập lệnh bạn muốn thực hiện trong các trường hợp đó) và thư của bạn được chuyển theo đường ống, trong điều kiện bạn chọn, kịch bản của sự lựa chọn của bạn, để nó làm bất cứ điều gì nó muốn - khó nghĩ ra cách tiếp cận tổng quát hơn để "kích hoạt hành động bạn chọn khi nhận thư đáp ứng các điều kiện cụ thể của bạn !! Tất nhiên không có giới hạn bao nhiêu điều kiện bạn có thể kiểm tra xem có bao nhiêu dòng hành động mà một điều kiện duy nhất có thể kích hoạt (chỉ cần kèm theo tất cả các dòng hành động mà bạn muốn trong các dấu ngoặc đơn { }), v.v.

+0

Procmail thực sự sẽ không giải quyết được vấn đề kích hoạt hành động (trừ khi hành động được đề cập đang gửi một tin nhắn). –

+5

@J. Peterson, bạn đang đùa, phải không ?! '| pathtoyourscript' và bạn có thể bắt đầu kịch bản của bạn lựa chọn và gửi thư của bạn đến nó khi điều kiện yêu thích của bạn hài lòng, và kịch bản có thể làm bất cứ điều gì nó muốn - làm thế nào là không "kích hoạt một hành động" ?! –

0

Gần đây tôi đã giải quyết vấn đề này bằng cách sử dụng procmail và python

Đọc tài liệu dành cho procmail. Bạn có thể nói với nó để gửi tất cả các email gửi đến cho một kịch bản python như thế này trong một procmail đặc biệt tập tin cấu hình

:0: 
| ./scripts/ppm_processor.py 

Python có một "email" gói sẵn mà có thể làm bất cứ điều gì bạn có thể muốn làm gì với email. Đọc trên những cái sau ....

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

Con người dường như được bơm lên về Lamson:

https://github.com/zedshaw/lamson

Đây là một máy chủ SMTP viết hoàn toàn bằng Python. Tôi chắc rằng bạn có thể tận dụng điều đó để làm mọi thứ bạn cần - chỉ cần chuyển tiếp thư gmail tới máy chủ SMTP đó và sau đó thực hiện những gì bạn sẽ làm.

Tuy nhiên, tôi nghĩ rằng có thể dễ nhất để thực hiện đề xuất nguồn cấp dữ liệu ATOM ở trên.

EDIT: Lamson đã bị bỏ rơi

+0

cá hồi là một ngã ba, cố gắng để đạt đến python 3 - nó gần đây đã được xúc động - 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

Đó là xác thực email đáng sợ nhất, sai lệch nhất và không chính xác mà tôi từng thấy; nếu tôi chỉ ra lỗi của nó, tôi sẽ không biết bắt đầu từ đâu. Xin đừng bao giờ sử dụng nó, ở bất cứ đâu. – Todor

+0

Tôi quay trở lại điều này, bởi vì một cái gì đó làm phiền tôi ... Vì vậy, không chỉ các thuật toán chung để xác nhận là thiếu sót, nhưng op hợp lý trong if-s là đồng bằng sai. nếu ('@' và '.') Trong n: sẽ luôn chỉ xem '.', Vì boolean op sẽ '@' và ',' sẽ đánh giá '.'. Và đừng khiến tôi bắt đầu vào ngày thứ hai nếu. – Todor

Các vấn đề liên quan