計網 郵件收發 python3 6POP3課設

2021-09-24 23:39:51 字數 4381 閱讀 6835

輪子就不造了,你們直接看鏈結總體的概念,但是這個編碼是python2的

關於郵件收發【兩個圖稍微理解一下】

我的課設是pop3的實現,所以主要寫這個部分我遇到的問題,關於下文的mimemultipart,attachment,可以取看看上面鏈結的smtp部分的傳送帶附件的郵件

1.了解一下背景知識:py2-》py3

2.心酸路程

3.具體**及解說

關於pop3協議

# 先從msg物件獲取編碼:

charset = msg.get_charset()

if charset is none:

# 如果獲取不到,再從content-type欄位獲取:【在主函式裡把msg輸出看看就知道為什麼了】

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

pos = content_type.find('charset=')

if pos >= 0:

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

return charset

def decode_str(s):

#郵件的subject或者email中包含的名字都是經過編碼後的str,要正常顯示,就必須decode

#decode_header()可能會返回乙個list,這裡我們只取第乙個元素

value, charset = decode_header(s)[0]

if charset:

value = value.decode(charset)

return value

# 遞迴地列印出message物件的層次結構

# indent用於縮排顯示:

def print_info(msg, indent=0):

if indent == 0:

# 郵件的from, to, subject存在於根物件上:

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

value = msg.get(header,'')

#print(value)

if value:

if header=="subject":

# 需要解碼subject字串:

value = decode_str(value)#只取了第乙個郵件位址

elif header=='date':

value = u'%s %s' % (header,value[0:24])

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()):

# 如果郵件物件是乙個mimemultipart,

# get_payload()返回list,包含所有的子物件:

parts = msg.get_payload()

for n, part in enumerate(parts):

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

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

# 遞迴列印每乙個子物件

print_info(part, indent + 1)

else:

# 郵件物件不是乙個mimemultipart,

# 就根據content_type判斷:

content_type = msg.get_content_type()

if content_type=='text/plain' or content_type=='text/html':

# 純文字或html內容:

content = msg.get_payload(decode=true)

# 要檢測文字編碼:

charset = guess_charset(msg)

if charset:

content = content.decode(charset)

#可選:輸出加密狀態下的text內容

#print(content)

content=base64.b64decode(content).decode(charset,'ignore')

print('%stext: %s' %(' '*indent,content))

else:

# 不是文字,作為附件處理:

print('%sattachment: %s' %(' ' * indent,content_type))

email =input('email: ')#確定過,qq郵箱不能用,163郵箱可以,其他還沒探索過

password =input('password: ')#輸入的是郵箱的授權碼!=登入郵箱的密碼

pop3_server =input('pop3 server: ')#例如'pop3.163.com'

# 連線到pop3伺服器:例如pop.163.com

server = poplib.pop3_ssl(pop3_server)

#server = poplib.pop3(pop3_server)

#可以開啟或關閉除錯資訊:

#server.set_debuglevel(1)

#可選:列印pop3伺服器的歡迎文字:

print(server.getwelcome().decode('utf-8'))

#身份認證:

server.user(email)

server.pass_(password)

# stat()返回郵件數量和占用空間:

print('messages: %s. size: %s' % server.stat())

# list()返回所有郵件的編號:

resp, mails, octets = server.list()

# 可以檢視返回的列表類似['1 82923', '2 2184', ...][轉成utf-8模式]

#返回列表的原形式[b'1 82923' , b'2 2184' , ...]

mails2=

for i in mails:

j=str(i.decode('utf-8'))

print(mails2)

# 獲取最新一封郵件, 注意索引號從1開始:

index=len(mails)

# lines儲存了郵件的原始文字的每一行,它是個列表

resp, lines, octets = server.retr(index)

#轉成utf-8和字串

lines2=

for i in lines:

j=str(i.decode('utf-8'))

#通過join銜接,可以獲得整個郵件的原始文字:

msg_content = '\t\n'.join(lines2)

#print(msg_content)

# 解析郵件:這裡輸出msg是個亂的,還沒有真正的解析

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

msg = parser().parsestr(msg_content)

#可選:列印msg方便確定具體編碼方式和text加密設定

#print(msg)

# 慎重:將直接從伺服器刪除郵件:

# server.dele(len(mails))

# 列印郵件內容:

print_info(msg)

# 關閉連線:

server.quit()

Python3實現郵件群發

1 在 mysql 資料庫建立 mail 資料庫,並建立 mail 表 2 將郵箱的電子郵件位址存在於mail 表中 3 編寫 python 程式 coding utf 8 import smtplib from email.mime.text import mimetext import time...

初識python3郵件傳送

前不久學習了一下python是如何傳送郵件到指定郵箱,python使用版本為python3.7。usr bin python3 匯入smtplib包,引用對應外掛程式 import smtplib from email.mime.text import mimetext from email.uti...

python3接收 解析郵件

python3可以使用poplib.pop3進行郵件接收,具體如下 import poplib from email.parser import parser def get email email,password,host mail.163.com connect to pop3 server ...