piton

2011-02-05 22 views
6

kullanarak posta almak için nasıl piton kullanarak e-posta almak istiyorum. Şimdiye kadar bu konuya ulaşabildim ama bedeni değil. İşte ben kullanıyorum kodudur:piton

import poplib 
from email import parser 
pop_conn = poplib.POP3_SSL('pop.gmail.com') 
pop_conn.user('myusername') 
pop_conn.pass_('mypassword') 
#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'] 
    print message['body'] 
pop_conn.quit() 

Sorunum bu kodu çalıştırdığınızda düzgün vücut Konusu ancak döner olmasıdır. Yani "Test" konusu ile bir e-posta gönderirseniz ve "Bu bir test mesajı" olan beden ise IDLE'de bu şekilde görünür.

>>>>Tester >>>>None 

yüzden konuyu ancak vücut değerlendirmek doğru gibi görünüyor, ben ayrıştırma yöntemi sağ olduğunu düşünüyorum? Mesele şu ki, bu kütüphaneler hakkında, hem bir özneyi hem de bir bedeni döndürecek şekilde, nasıl değiştirileceğini anlamaya yetecek kadar bilgim yok.

cevap

5

Eğer

print message.keys() 

çalıştırmak, bir bak bakalım istediğiniz get_payload() yöntemdir edeceğiz gibi e-posta ayrıştırıcı, bir body anahtarı içermeyen bir email.message.Message nesneyi döndürür:

for message in messages: 
    print message['subject'] 
    print message.get_payload() 
pop_conn.quit() 

Ancak bu çok parçalı mesajlar söz konusu olduğunda karmaşıklaşır; get_payload(), her biri Message nesnesi olan bir parça listesi döndürür. Çok satırlı iletinin belirli bir bölümünü, bölümün bölümünü döndüren IndexError değerini artırırsa veya TypeError iletinin çok parçalı değilse yükseltmesini sağlayarak get_payload(i)'u kullanarak alabilirsiniz.

Gustavo Costa De Oliveir'in belirttiği gibi, parçaları sırayla almak için walk() yöntemini kullanabilirsiniz; bu, iletinin parçalarının ve alt bölümlerinin derinlemesine ilk geçişini sağlar.

http://docs.python.org/library/email.message.html#email.message.Message adresindeki email.parser modülüyle ilgili daha fazla şey var. E-posta bölümleri arasında derinliği ilk

for part in message.walk(): 
    if part.get_content_type(): 
     body = part.get_payload(decode=True) 

walk() fonksiyon yineler ve aradığınız:

8

nesne mesajı bir vücudu yok, böyle, çok sayıda parça ayrıştırmak gerekir İçerik türü olan parçalar için. İçerik türleri text/plain veya text/html olabilir ve bazen bir e-postada her ikisi de olabilir (content_type mesajı multipart/alternative olarak ayarlanmışsa). u IMAP4'ü kullanmak istiyorsanız

2

aynı zamanda mesajın doğru kodlamada iyi getiri verileri bazı dilli içeriği silme

 

charset = part.get_content_charset() 
content = part.get_payload(decode=True) 
content = content.decode(charset).encode('utf-8') 
 
0

içerir. outlook piton kitaplığı kullanın, burada indirmek:

print mail.mailbody() 
print mail.mailsubject() 
print mail.mailfrom() 
print mail.mailto() 
:

import outlook 
mail = outlook.Outlook() 
mail.login('[email protected]','yourpassword') 
mail.inbox() 
print mail.unread() 

email elemanı alınamadı için: https://github.com/awangga/outlook gelen kutunuzdan okunmamış e-posta almak için