電子郵件
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...