#-*-coding: utf-8-*-
#python 27
#xiaodeng
#python 之 poplibmodule download and parse mail
#https: //github.com/michaelliao/learn-python/blob/master/email/fetchmail_pop3.py
import poplib, email
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
#Coding processing
def guess_charset (msg):
charset = msg.get_charset () # Get encoding from msg object
if charset is None:
content_type = msg.get (‘Content-Type’, ‘‘) .lower () #
if ‘charset’ in content_type:
charset = content_type.split (‘charset =‘) [1] .strip ()
return charset
return charset
# 数据 decode
def decode_str (s):
value, charset = decode_header (s) [0] #data, data encoding method, from email.header import decode_header
if charset:
value = value.decode (charset)
return value
#print_ingoFunction:
def print_info (msg, indent = 0): #indent for indent display
if indent == 0:
for header in [‘From’, ‘To’, ‘Subject’]: #From, to, and subject of the mail exist on the root object
value = msg.get (header, ‘‘)
if value:
if header == ‘Subject’:
value = decode_str (value) # Need to decode subject string
else:
#Decode mail address
hdr, addr = parseaddr (value)
name = decode_str (hdr)
value = ‘% s’% (addr)
print ‘% s:% s’% (header, value)
print ‘-‘ * 20
if (msg.is_multipart ()):
#If the mail object is an is_multipart, get_payload () returns a list containing all child objects
parts = msg.get_payload () # loop to get list items
for n, part in enumerate (parts):
#print (‘% spart% s’% (‘‘ * indent, n))
#print (‘% s ------------‘% (‘‘ * indent))
#Recursively print without a child object
print_info (part, indent + 1)
else:
#Mail object is not an is_multipart, just judge based on content_type
content_type = msg.get_content_type () # Data type
if content_type == ‘text / plain’ or content_type == ‘text / html’: # plain text html text
#Plain text or html content
content = msg.get_payload (decode = True) #Get the string of the text object instead of the object itself
charset = guess_charset (msg) #To detect text encoding
if charset: content = content.decode (charset)
content = ‘% s’% (content)
print content # Get the text content of the email. If there is only text, the print result will be exactly the same as that seen in the email
else:
print ‘not text’
#Link to pop3 server
server = poplib.POP3 (‘pop.163.com’)
#Print pop3 server welcome object
# server.getwelcome ()
#Authentication
email = ‘[email protected]’
password = ‘xxxx’
server.user (email) #Enter the email address
server.pass_ (password) #Enter password
#print (‘Messages:% s. Size:% s’% server.stat ()) # Messages: 3. Size: 36090
#Request message list, return the number of all messages; you can view the returned list similar to [‘1 82923’, ‘2 2184’, ...]
resp, mails, octets = server.list ()
#Get the latest email
#Poplib module's retr () function is used to download mail. Every time it happens to download a message, we have to pass the number of messages he wants to download.
#print mails # [‘1 2721’, ‘2 2784’, ‘3 2986’, ‘4 28987’, ‘5 10056’, ‘6 753’, ‘7 763’]
#Note that the index number starts from 1, then the latest email is the one with the largest index
lenString = len (mails)
resp, mailContent, octets = server.retr (lenString) #mailContent: mail content
#Parse mail: only need one line of code to parse mail content into Message object
msg = Parser (). parsestr (‘\ r \ n‘.join (mailContent))
#Print the message content, call the print_info function:
print_info (msg)
# server.dele (len (mails)) # Caution: Mail will be deleted directly from the server:
#Close the connection:
server.quit ()
‘‘ ‘
From: [email protected]
----------------------------------------
To: [email protected]
----------------------------------------
Subject: I am the title
----------------------------------------
Seeing me means the email was sent successfully
‘‘ ‘
Python's Poplib module downloads and resolves messages