基於POP3協議收取郵件

2021-09-02 23:52:34 字數 4386 閱讀 1628

收取郵件就是編寫乙個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個你完全可以忽略它們的存在 這些命令被客戶端計算機用來傳送給遠端伺服器。反...