2009-06-04 38 views

Trả lời

54
import imaplib 
obj = imaplib.IMAP4_SSL('imap.gmail.com','993') 
obj.login('username','password') 
obj.select() 
obj.search(None,'UnSeen') 
+5

Tôi thực sự thích giải pháp này. Nói chung sạch sẽ chỉ với một lần nhập. Để lấy số bạn muốn: len (obj.search (Không, 'UnSeen') [1] [0] .split()) –

+0

Tôi có thể lấy các thông điệp và đối tượng với giải pháp này không? – DataGreed

+1

@DataGreed: Với tìm kiếm, bạn chỉ nhận được id thư, nhưng sau đó bạn có thể sử dụng nó với "obj.fetch (..." để nhận thư bạn muốn. Xem liên kết này ví dụ về cách thực hiện điều đó: http : //yuji.wordpress.com/2011/06/22/python-imaplib-imap-example-with-gmail/ –

-1

Sử dụng Gmail.py

file = open("filename","r") 
usr = file.readline() 
pwd = file.readline() 
gmail = GmailClient() 
gmail.login(usr, pwd) 
unreadMail = gmail.get_inbox_conversations(is_unread=True) 
print unreadMail 

Gets thông tin đăng nhập từ một tập tin văn bản giả định tên đăng nhập và mật khẩu là trên dòng riêng biệt.

+4

Tôi đã kiểm tra nguồn module, những gì nó làm cho nó mở gmail trong chế độ html và phân tích trang. Thật tệ! http://www.holovaty.com/code/gmail.py –

+0

readline bao gồm một dòng mới, mà bạn không muốn ở đây. –

+1

Nadia đúng. Điều này sẽ lãng phí thời gian và băng thông đáng kể. –

25

tôi khuyên bạn nên sử dụng Gmail atom feed

Nó cũng đơn giản như thế này:

import urllib 

url = 'https://mail.google.com/mail/feed/atom/' 
opener = urllib.FancyURLopener() 
f = opener.open(url) 
feed = f.read() 

Sau đó bạn có thể sử dụng chức năng phân tích thức ăn trong bài viết này tốt đẹp: Check Gmail the pythonic way

+2

+1 giải pháp tốt đẹp giúp tránh mọi hoạt động kinh doanh imap/pop! –

+3

Có gì xấu về IMAP? Lưu ý rằng đoạn mã này chưa hoàn thành, mặc dù "đơn giản như thế này". –

+0

Cũng lưu ý rằng giải pháp này sẽ nhắc người dùng nhập tên người dùng, mật khẩu trên TTY. Tuy nhiên, bạn có thể phân lớp trình mở để xử lý việc này. –

1

Một khi bạn đã đăng nhập trong (làm điều này bằng tay hoặc với gmail.py), bạn nên sử dụng nguồn cấp dữ liệu.

Nó nằm ở đây: http://mail.google.com/mail/feed/atom

Đó là cách Google hiện nó. Dưới đây là một liên kết để mở rộng js chrome của họ: http://dev.chromium.org/developers/design-documents/extensions/samples/gmail.zip

Sau đó bạn sẽ có thể phân tích cú pháp xml trông như thế này:

<?xml version="1.0" encoding="UTF-8"?> 
<feed version="0.3" xmlns="http://purl.org/atom/ns#"> 
<title>Gmail - Inbox for [email protected]</title> 
<tagline>New messages in your Gmail Inbox</tagline> 
<fullcount>142</fullcount> 
24

Vâng, tôi sẽ đi trước và giải thích rõ ràng một imaplib giải pháp như Cletus đề xuất. Tôi không hiểu tại sao mọi người cảm thấy cần phải sử dụng gmail.py hoặc Atom cho việc này. Loại điều này là những gì IMAP được thiết kế cho. Gmail.py đặc biệt nghiêm trọng vì nó thực sự phân tích cú pháp HTML của Gmail. Điều đó có thể cần thiết cho một số điều, nhưng không phải để có được một số lượng tin nhắn!

import imaplib, re 
conn = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
conn.login(username, password) 
unreadCount = re.search("UNSEEN (\d+)", conn.status("INBOX", "(UNSEEN)")[1][0]).group(1) 

Soạn thảo regex có thể cải thiện hiệu suất một chút.

+1

Trong khi tôi đồng ý IMAP là cách để đi đến đây, có một số vấn đề về tính di động có thể xảy ra. Vì các phương thức khác đang sử dụng các kết nối HTTP, chúng có thể hoạt động hiệu quả khi IMAP không (trong các môi trường hạn chế như Google App Engine hoặc trên các mạng không bị hạn chế lưu lượng truy cập HTTP). – Tom

+8

Tom, đó là sự thật. Nhưng OP không nói họ đang đối phó với những hạn chế đó, nên chúng ta không nên phát minh ra chúng sớm. –

7

Đối với việc thực hiện đầy đủ về đọc giá trị từ thức ăn nguyên tử:

import urllib2 
import base64 
from xml.dom.minidom import parse 

def gmail_unread_count(user, password): 
    """ 
     Takes a Gmail user name and password and returns the unread 
     messages count as an integer. 
    """ 
    # Build the authentication string 
    b64auth = base64.encodestring("%s:%s" % (user, password)) 
    auth = "Basic " + b64auth 

    # Build the request 
    req = urllib2.Request("https://mail.google.com/mail/feed/atom/") 
    req.add_header("Authorization", auth) 
    handle = urllib2.urlopen(req) 

    # Build an XML dom tree of the feed 
    dom = parse(handle) 
    handle.close() 

    # Get the "fullcount" xml object 
    count_obj = dom.getElementsByTagName("fullcount")[0] 
    # get its text and convert it to an integer 
    return int(count_obj.firstChild.wholeText) 
Các vấn đề liên quan