收取郵件就是編寫乙個mua作為客戶端,從mda把郵件獲取到使用者的電腦或者手機上。收取郵件最常用的協議是pop協議,目前版本號是3,俗稱pop3。
python內建乙個poplib
模組,實現了pop3協議,可以直接用來收郵件。
注意到pop3協議收取的不是乙個已經可以閱讀的郵件本身,而是郵件的原始文字,這和smtp協議很像,smtp傳送的也是經過編碼後的一大段文字。
要把pop3收取的文字變成可以閱讀的郵件,還需要用email
模組提供的各種類來解析原始文字,變成可閱讀的郵件物件。
所以,收取郵件分兩步:
第二部:用email
解析原始文字,還原為郵件物件。
# -*- coding: utf-8 -*-
"""created on wed dec 12 08:47:07 2018
@author: yufeng
"""import poplib
from email.parser import parser
from email.header import decode_header
from email.utils import parseaddr
# 輸入郵件位址, 密碼 和 pop3伺服器的位址
email =
input
('email: '
)password =
input
('password: '
)pop3_server =
"pop3.sina.com"
defguess_charset
(msg)
: charset = msg.get_charset(
)if charset is
none
: content_type = msg.get(
'content-type',''
).lower(
) pos = content_type.find(
'charset='
)if pos >=0:
charset = content_type[pos +8:
].strip(
)return charset
defdecode_str
(s):
value, charset = decode_header(s)[0
]if charset:
value = value.decode(charset)
return value
defprint_info
(msg, indent=0)
: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 '
%(name, addr)
print
('%s%s: %s'%(
' '
* indent, header, value))if
(msg.is_multipart())
: parts = msg.get_payload(
)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)
)# 連線到pop3伺服器
server = poplib.pop3(pop3_server)
# 可以開啟或關閉除錯資訊
server.set_debuglevel(1)
# 列印pop3伺服器的歡迎文字
print
(server.getwelcome(
).decode(
'utf-8'))
# 身份驗證
server.user(email)
server.pass_(password)
# stat()返回郵件數量和占用空間
print
("message: %s. size: %s"
% server.stat())
# list()返回所有郵件的編號
resp, mails, octets = server.
list()
# 可以檢視返回的列表類似[b'1 82923', b'2 2184', ...]
print
(mails)
# 獲取最新一封郵件, 注意索引號從1開始:
index =
len(mails)
resp, lines, octets = server.retr(index)
# lines儲存了郵件的原始文字的每一行,
# 可以獲得整個郵件的原始文字:
msg_content = b'\r\n'
.join(lines)
.decode(
'utf-8'
)# 稍後解析出郵件:
msg = parser(
).parsestr(msg_content)
print_info(msg)
# 可以根據郵件索引號直接從伺服器刪除郵件:
# server.dele(index)
# 關閉連線:
server.quit(
)
先使用之前的smtp協議傳送一封測試郵件,然後執行**接收郵件
from: test to: 接收郵件測試賬號 subject: 基於smtp協議傳送郵件的測試
part 0
--------------------
text: python使用pop3收取郵件...
part 1
--------------------
attachment: image/png
*cmd* 'quit'
python之POP3收取郵件
電子郵件 pop3收取郵件 收取郵件通常用的是pop協議,目前版本號為3,俗稱pop3。我們需要編寫乙個mua從mda上收取郵件。我們要用到python中的兩個模組,poplib和email,分為兩大步驟 首先引入poplib模組 import poplib email input email 輸入...
協議 POP3簡單郵件傳輸協議
post office protocol version 3 郵局協議版本3 rfc1939 user username 認可 pass password 認可 執行成功則狀態轉換 apop name,digest 認可 一種安全傳輸口令的辦法,執行成功導 致狀態轉換,請參見rfc 1321 sta...
pop3協議簡介
8學院 vb教程 發布日期 2008年07月09日 將本文收藏到 收藏到本地 在internet,pop3 postofficeprotocol3 協議通常被用來接收電子郵件。這個協議很容易學,因為它只包含12個命令 其中有3個你完全可以忽略它們的存在 這些命令被客戶端計算機用來傳送給遠端伺服器。反...