python之POP3收取郵件

2021-09-05 07:35:11 字數 4727 閱讀 8928

電子郵件

pop3收取郵件

收取郵件通常用的是pop協議,目前版本號為3,俗稱pop3。

我們需要編寫乙個mua從mda上收取郵件。

我們要用到python中的兩個模組,poplib和email,分為兩大步驟:

首先引入poplib模組:

import poplib

email = input('email:')                # 輸入郵箱位址

password = input('password:')          # 輸入密碼

pop3_server = input('pop3_server:')    # 輸入pop3伺服器位址12

3連線pop3伺服器:

server = poplib.pop3(pop3_server)

server.set_debuglevel(1)                      # 開啟調式資訊

print(server.getwelcome().decode('utf-8'))    # 列印pop3伺服器歡迎資訊12

3需要注意的是,如果使用的郵箱pop服務有加密,則需要以加密的方法連線伺服器,像這樣:

server = poplib.pop3_ssl(pop3_server)

進行身份認證:

server.user(email)

server.pass_(password)12

print('messages:%s. size:%s' % server.stat())     # 返回郵件數目和占用空間

resp, mails, octets = server.list()               # 獲取郵件列表

print(mails)                                      # 列印所有郵件編號及相應的大小12

3這裡stat()可以獲取郵件總數目及占用空間。

list()可以獲取每一封郵件的編號即占用空間。

獲取一封郵件:

index = len(mails)                                 # index為郵件總數目                            

resp, lines, octets = server.retr(index)           # 獲取最新一封郵件的資訊

msg_content = b'\r\n'.join(lines).decode('utf-8')  # 獲得整個郵件的原始文字12

3retr()可以返回郵件的全部文字,其中lines儲存的是文字的每一行內容。

接下來就是解析文字的部分,後面會介紹:

msg = parser().parsestr(msg_content)             # 解析郵件原始文字

最後關閉連線:

server.quit()

解析郵件

解析郵件的過程與構造郵件正好相反。

首先,引入必要的模組:

from email.parser import parser            # 解析模組

from email.header import decode_header     # 用於獲取標頭檔案的編碼資訊

from email.utils import pasrseaddr         # 用於格式化郵件資訊

import poplib

由於在解析郵件的過程中,會遇到編碼問題,需要進行相應的解碼才能正常顯示。

所以我們需要先定義相關函式用以解碼。

def decode_str(s):

value, charset = decode_header(s)[0]

if charset:

value = valur.decode(charset)           # 如果文字中存在編碼資訊,則進行相應的解碼

return value

針對郵件的文字內容,我們需要檢測編碼,否則,非utf-8編碼的郵件都無法正常顯示,我們定義乙個guess_charset函式:

def guess_charset(msg):

charset = msg.get_charset()                             # 直接用get_charset()方法獲取編碼

if charset is none:                                     # 如果獲取不到,則在原始文字中尋找

content_type = msg.get('content-type', '').lower()  

pos = content_type.find('charset=')                 # 找'charset='這個字串

if pos >=0:                                         # 如果有,則獲取該字串後面的編碼資訊

charset = content_type[pos+8:].strip()

return charset

這裡lower()是把字串全改為小寫表示。

strip()是去除字串前後的空格字元。

準備好編碼的問題,就開始正式解析郵件吧。

把郵件內容解析為message物件:

msg = parser().parsestr(msg_content)

由於這個message物件可能巢狀著其他mimebase物件,所以我們要遞迴地列印出mseeage的層次結構:

def print_info(msg, indent=0):                              # indent用於縮排顯示

# 首先列印郵件的發件人,收件人和主題

if indent == 0:

for header in ['from', 'to', 'subject']:

value = msg.get(header, '')

if value:

if header == 'subject':                     # 解碼主題資訊

value = decode_str(value)

else:                                       # 解碼發件人和收件人資訊

hdr, addr = parseaddr(value)

name = decode_str(hdr)

value = u'%s <%s>' % (name, addr)

print('%s%s: %s' % ('  '* indent, header, value))   #'  ' *indent可以列印出2*indent個空格

# 將組合郵件物件分離,         

if (msg.is_multipart()):

parts = msg.get_payload()                           # 拿取msg的子物件

for n, part in enumerate(parts):

print('%spart %s' % ('  ' * indent, n))

print('%s--------------------' % ('  ' * indent))

print_info(part,indent + 1)

# 逐一列印郵件物件

else:

content_type = msg.get_content_type()               # 獲取郵件物件格式

if content_type == 'text/plain' or content_type == 'text/html':  # 如果為文字郵件,則直接列印

content = msg.get_payload(decode=true)

charset = guess_charset(msg)                     # 檢測編碼

if charset:

content = content.decode(charset)           # 解碼

print('%stext: %s' % ('  ' * indent, content))  # 列印內容

else:

print('%sattachment: %s' % ('  ' * indent, content_type))  # 否則為附件,獲取附件資訊

我們執行上面的**,把顯示結果如下:

+ok qqmail pop3 server v1.0 service ready(qqmail v2.0)

messages:19. size:1335886

from: 三貝

to: ******xx

subject: pop3測試

part 0

--------------------

part 0

--------------------

text: 你好,正在使用pop3收取郵件。

part 1

--------------------

text: 你好,正在使用...

part 1

--------------------

attachment: image/png

18從列印的結構我們可以看出,這封郵件是乙個mimemultipart,分為兩部分:

第一部分又是乙個mimemultipart,這一部分包含乙個純文字格式的mimetext和html格式的mimetext;

第二部分是乙個image檔案。

小結

基於POP3協議收取郵件

收取郵件就是編寫乙個mua作為客戶端,從mda把郵件獲取到使用者的電腦或者手機上。收取郵件最常用的協議是pop協議,目前版本號是3,俗稱pop3。python內建乙個poplib模組,實現了pop3協議,可以直接用來收郵件。注意到pop3協議收取的不是乙個已經可以閱讀的郵件本身,而是郵件的原始文字,...

協議 POP3簡單郵件傳輸協議

post office protocol version 3 郵局協議版本3 rfc1939 user username 認可 pass password 認可 執行成功則狀態轉換 apop name,digest 認可 一種安全傳輸口令的辦法,執行成功導 致狀態轉換,請參見rfc 1321 sta...

深入了解郵件接收協議POP3

什麼是pop 大家一聽這個pop,讀起來有點像是中文中的泡泡,其實這是乙個英文術語的縮寫。pop的全稱是 post office protocol,即郵局協議,用於電子郵件的接收,它使用tcp的110埠。現在常用的是第三版 所以簡稱為 pop3。pop3仍採用client server工作模式,cl...