import poplib
import os
from email.parser import Parser
from email.parser import BytesParser
from email.header import decode_header
from email.utils import parseaddr
#解析消息頭中的字符串
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
#將郵件附件或內(nèi)容保存至文件
#即郵件中的附件數(shù)據(jù)寫入附件文件
def savefile(filename, data, path):
try:
filepath = path + filename
print('Save as: ' + filepath)
f = open(filepath, 'wb')
f.write(data)
except:
print(filepath + ' open failed')
finally:
f.close()
#獲取郵件的字符編碼,首先在message中尋找編碼,如果沒有,就在header的Content-Type中尋找
def guess_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
#然后調(diào)用message的walk循環(huán)處理郵件中的每一個子對象(包括文本、html、附件一次或多次)
#郵件頭屬性中的filename存在則該子對象是附件,對附件名稱進行編碼并將附件下載到指定目錄
#由于網(wǎng)絡(luò)上傳輸?shù)泥]件都是編碼以后的格式,需要在get_payload的時候指定decode=True來轉(zhuǎn)換成可輸出的編碼
#如果郵件是text或者h(yuǎn)tml格式,打印格式并輸出轉(zhuǎn)碼以后的子對象內(nèi)容
def print_info(msg,i):
subject = ""
print("+++++++++++++第%d封郵件+++++++++++++++"%i)
for header in ['From', 'To', 'Subject']:
value = msg.get(header, '')
if value:
if header == 'Subject':
subject = value = decode_str(value)
else:
hdr, addr = parseaddr(value)
name = decode_str(addr)
value = name + ' < ' + addr + ' > '
print(header + ':' + value)
for part in msg.walk():
filename = part.get_filename()
content_type = part.get_content_type()
charset = guess_charset(part)
if filename:
filename = decode_str(filename)
ext = os.path.splitext(filename)
if ext != None:
filename = subject + str(i) +ext[-1]
else:
filename = subject + str(i)
data = part.get_payload(decode = True)
if filename != None or filename != '':
print('存在附件附件名: ' + filename)
savefile(filename, data, mypath)
#下載正文
# else:
# email_content_type = ''
# content = ''
# if content_type == 'text/plain':
# email_content_type = 'text'
# elif content_type == 'text/html':
# email_content_type = 'html'
# if charset:
# content = part.get_payload(decode=True).decode(charset)
# print(email_content_type + ' ' + content)
server = poplib.POP3_SSL('pop.163.com')
server.user('13911118361')
server.pass_('dbzq000686')
# server = poplib.POP3('pop.nesc.cn')
# server.user('dbzqecm')
# server.pass_('dbzq000686')
mypath = 'E:/mail'
# stat()返回郵件數(shù)量和占用空間:
print('郵件總數(shù): %s. 大小: %s' % server.stat())
resp, mails, objects = server.list()
#print(mails)
for i in range(len(mails)):
k=i+1
#取出某一個郵件的全部信息
resp, lines, octets = server.retr(k)
#郵件取出的信息是bytes,轉(zhuǎn)換成Parser支持的str
lists = []
for e in lines:
try:
lists.append(e.decode())
except:
print(e)
msg_content = '\r\n'.join(lists)
msg = Parser().parsestr(msg_content)
print_info(msg,(k))
#server.dele(index)
#提交操作信息并退出
server.quit()
郵件下載demo
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 本文以下面這個類庫做為講解解《強大的php發(fā)送郵件類》點擊標(biāo)題可以去下該類庫。如果你需要查看更多的php類庫可以點...
- 上周公司的項目要求開發(fā)郵件發(fā)送功能。自己在網(wǎng)上跟著教程邊學(xué)邊做了一下午,現(xiàn)在基本開發(fā)完成了。由于一個同事也想看下該...