python+POP3實(shí)現(xiàn)批量下載郵件附件
最近新開(kāi)學(xué),接到了給老板的本科課程當(dāng)助教的工作,百十來(lái)號(hào)人一學(xué)期下來(lái)得有四五次作業(yè)發(fā)進(jìn)郵箱里,需要我來(lái)統(tǒng)計(jì)打分,想想挨個(gè)點(diǎn)進(jìn)去下載附件的過(guò)程就頭大,于是萌生了寫(xiě)個(gè)腳本來(lái)統(tǒng)計(jì)作業(yè)的想法。
其實(shí)python里收發(fā)郵件都有很方便的包,合理使用就好,可以解決絕大多數(shù)的郵件收發(fā)任務(wù)。但是這個(gè)腳本寫(xiě)下來(lái)還是花了不少時(shí)間,其中最大的一部分時(shí)間是花在了python的編碼問(wèn)題上,python2和python3的編碼預(yù)設(shè)有些許的不一樣,在python3中又取消了unicode這個(gè)方法,這就導(dǎo)致很多在python2中寫(xiě)的例程都沒(méi)法在3中運(yùn)行。
經(jīng)過(guò)修改以后下面的腳本可以從郵箱中獲取指定日期范圍內(nèi)的郵件附件,并存如指定目錄中。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import poplib
import email
import datetime
import time
import os
import xlrd
import xlwt
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
# 輸入郵件地址, 口令和POP3服務(wù)器地址:
email = 'xxxxxxxx@qq.com'
password = 'xxxxxxxxxxx'
pop3_server = 'pop.qq.com'
def decode_str(s):#字符編碼轉(zhuǎn)換
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
def get_att(msg):
import email
attachment_files = []
for part in msg.walk():
file_name = part.get_filename()#獲取附件名稱類型
contType = part.get_content_type()
if file_name:
h = email.header.Header(file_name)
dh = email.header.decode_header(h)#對(duì)附件名稱進(jìn)行解碼
filename = dh[0][0]
if dh[0][1]:
filename = decode_str(str(filename,dh[0][1]))#將附件名稱可讀化
print(filename)
#filename = filename.encode("utf-8")
data = part.get_payload(decode=True)#下載附件
att_file = open('E:\\L\\zy\\307\\' + filename, 'wb')#在指定目錄下創(chuàng)建文件,注意二進(jìn)制文件需要用wb模式打開(kāi)
attachment_files.append(filename)
att_file.write(data)#保存附件
att_file.close()
return attachment_files
# 連接到POP3服務(wù)器,有些郵箱服務(wù)器需要ssl加密,對(duì)于不需要加密的服務(wù)器可以使用poplib.POP3()
server = poplib.POP3_SSL(pop3_server)
server.set_debuglevel(1)
# 打印POP3服務(wù)器的歡迎文字:
print(server.getwelcome().decode('utf-8'))
# 身份認(rèn)證:
server.user(email)
server.pass_(password)
# 返回郵件數(shù)量和占用空間:
print('Messages: %s. Size: %s' % server.stat())
# list()返回所有郵件的編號(hào):
resp, mails, octets = server.list()
# 可以查看返回的列表類似[b'1 82923', b'2 2184', ...]
print(mails)
index = len(mails)
for i in range(index,0,-1):
#倒序遍歷郵件
resp, lines, octets = server.retr(i)
# lines存儲(chǔ)了郵件的原始文本的每一行,
#郵件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8')
#解析郵件:
msg = Parser().parsestr(msg_content)
#獲取郵件時(shí)間
date1 = time.strptime(msg.get("Date")[0:24],'%a, %d %b %Y %H:%M:%S') #格式化收件時(shí)間
date2 = time.strftime("%Y%m%d", date1)#郵件時(shí)間格式轉(zhuǎn)換
if (date2<'20180306')|(date2>'20180314'):
continue
f_list = get_att(msg)#獲取附件
#print_info(msg)
server.quit()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Flask框架中密碼的加鹽哈希加密和驗(yàn)證功能的用法詳解
加鹽加密就是在加密時(shí)混入一段隨機(jī)字符串,這段字符串便被稱為"鹽值",這里我們來(lái)看一下Python的Flask框架中密碼的加鹽哈希加密和驗(yàn)證功能的用法詳解:2016-06-06
用于業(yè)余項(xiàng)目的8個(gè)優(yōu)秀Python庫(kù)
今天小編就為大家分享一篇用于業(yè)余項(xiàng)目的8個(gè)大型Python庫(kù),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-09-09
Django網(wǎng)絡(luò)框架之HelloDjango項(xiàng)目創(chuàng)建教程
這篇文章主要介紹了Django網(wǎng)絡(luò)框架之HelloDjango項(xiàng)目創(chuàng)建,結(jié)合實(shí)例形式詳細(xì)分析了Django框架創(chuàng)建HelloDjango項(xiàng)目的具體步驟與詳細(xì)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-06-06
Python創(chuàng)建Getter和Setter的方法詳解
Getters?和?Setters?是幫助我們?cè)O(shè)置類變量或?qū)傩远鵁o(wú)需直接訪問(wèn)的方法,這篇文章主要和大家介紹了如何在Python中創(chuàng)建Getter和Setter,需要的可以參考下2023-10-10
python協(xié)程gevent案例 爬取斗魚(yú)圖片過(guò)程解析
這篇文章主要介紹了python協(xié)程gevent案例 爬取斗魚(yú)圖片過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python Pexpect庫(kù)的簡(jiǎn)單使用方法
這篇文章主要介紹了Python Pexpect庫(kù)的簡(jiǎn)單使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
一文搞懂Pandas數(shù)據(jù)透視的4個(gè)函數(shù)的使用
今天主要和大家分享Pandas中四種有關(guān)數(shù)據(jù)透視的通用函數(shù),在數(shù)據(jù)處理中遇到這類需求時(shí),能夠很好地應(yīng)對(duì),快跟隨小編一起學(xué)習(xí)一下吧2022-06-06

