Python自動(dòng)發(fā)送和收取郵件的方法
作為課代表,經(jīng)常要做的兩件事是:幫忙發(fā)作業(yè)和幫忙收作業(yè),而且很多時(shí)候是通過(guò)郵件來(lái)完成的,如果手動(dòng)一封一封的收取和發(fā)送就很浪費(fèi)時(shí)間——人生苦短,我用Python。
直接上代碼,不想了解細(xì)節(jié)原理直接拉到最后,我封裝成了兩個(gè)函數(shù),根據(jù)提示,輸入?yún)?shù),直接調(diào)用就行。親測(cè)可行
不想看細(xì)節(jié)這部分可以直接跳過(guò),但是運(yùn)行的時(shí)候要把這一塊也粘貼進(jìn)去。
導(dǎo)入相關(guān)庫(kù)
import smtplib,ssl
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email import encoders
import poplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
from email.header import Header
#解析消息頭中的字符串,沒(méi)有這個(gè)函數(shù),print出來(lái)的會(huì)使亂碼的頭部信息。如'=?gb18030?B?yrXWpL3hufsueGxz?='這種,通過(guò)decode,將其變?yōu)橹形?
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
#解碼郵件信息分為兩個(gè)步驟,第一個(gè)是取出頭部信息:首先取頭部信息,主要取出['From','To','Subject']
def get_header(msg):
for header in ['From', 'To', 'Subject']:
value = msg.get(header, '')
if value:
if header == 'Subject': #文章的標(biāo)題有專門(mén)的處理方法
value = decode_str(value)
elif header in ['From','To']:
hdr, addr = parseaddr(value) #地址也有專門(mén)的處理方法
name = decode_str(addr)
value=name
print(header + ':' + value)
#頭部信息已取出,獲取郵件的字符編碼,首先在message中尋找編碼,如果沒(méi)有,就在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
#郵件正文部分:取附件,郵件的正文部分在生成器中,msg.walk(),如果存在附件,則可以通過(guò).get_filename()的方式獲取文件名稱
def get_file(path, msg):
for part in msg.walk():
filename=part.get_filename()
if filename!=None: #如果存在附件
filename = decode_str(filename) #獲取的文件是亂碼名稱,通過(guò)一開(kāi)始定義的函數(shù)解碼
data = part.get_payload(decode = True) #取出文件正文內(nèi)容
f = open(path+filename, 'wb') #此處可以自己定義文件保存位置
f.write(data)
f.close()
print('附件',filename,'下載成功')
def get_content(msg):
for part in msg.walk():
content_type = part.get_content_type()
charset = guess_charset(part)
if part.get_filename()!=None: #如果有附件,則直接跳過(guò)
continue
email_content_type = ''
content = ''
if content_type == 'text/plain':
email_content_type = 'text'
elif content_type == 'text/html':
print('html 格式 跳過(guò)')
continue #不要html格式的郵件
email_content_type = 'html'
if charset:
try:
content = part.get_payload(decode=True).decode(charset)
except AttributeError:
print('type error')
except LookupError:
print("unknown encoding: utf-8")
if email_content_type =='':
continue #如果內(nèi)容為空,也跳過(guò)
print(email_content_type + ' ----- ' + content)
# -------------------- 收取和發(fā)送郵件兩個(gè)函數(shù) --------------------------
def sent_email(from_addr,password, to_addrs,title,content,path=None):
'''
from_addr:發(fā)件人郵箱
password:發(fā)件人密碼(如果是QQ或者網(wǎng)易郵箱,這里寫(xiě)授權(quán)碼)
to_addrs:收件郵箱列表
title:郵件標(biāo)題
content:郵件內(nèi)容
path:如果需要發(fā)送附件,這里填寫(xiě)附件的路徑
'''
smtp_server = 'smtp.'+ from_addr.split('@')[-1] # 發(fā)信服務(wù)器
msg = MIMEMultipart() # 創(chuàng)建一封空郵件
msg['From'] = Header(from_addr) # 添加郵件頭信息
msg['Subject'] = Header(title) # 添加郵件標(biāo)題
msg.attach(MIMEText(content,'plain','utf-8')) # 正文內(nèi)容
if path != None:
# 添加附件
part = MIMEBase('application', "octet-stream")
part.set_payload(open(path, "rb").read()) # 讀取附件
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment', filename=path.split('/')[-1])
msg.attach(part) # 把附件添加到郵件中
server = smtplib.SMTP_SSL(smtp_server) # 開(kāi)啟發(fā)信服務(wù),這里使用的是加密傳輸
server.connect(smtp_server,465) # 登錄發(fā)信郵箱
for to_addr in to_addrs: # 遍歷發(fā)送給每個(gè)賬號(hào)
msg['To'] = Header(to_addr)
server.login(from_addr, password) # 發(fā)送郵件
server.sendmail(from_addr, to_addr, msg.as_string())
server.quit() # 關(guān)閉服務(wù)器
print('發(fā)送成功')
def get_email(email,password,path):
'''
email:郵箱地址
password:密碼(如果是qq郵箱或者網(wǎng)易郵箱,這里填授權(quán)碼)
path:附件保留的位置
'''
server=poplib.POP3_SSL('pop.'+email.split('@')[-1]) #修改對(duì)應(yīng)的郵箱服務(wù)器
server.user(email)
server.pass_(password)
resp, mails, octets = server.list() #登錄的過(guò)程
index = len(mails) #郵件的總數(shù)
resp, lines, octets = server.retr(index) #讀取最近一封郵件
msg_content = b'\r\n'.join(lines).decode('utf-8','ignore')
msg = Parser().parsestr(msg_content)
#server.dele(index) 刪除郵件
get_header(msg) # 顯示郵件信息,包括發(fā)件人,收件人,標(biāo)題
get_file(path,msg) # 保留附件
get_content(msg) # 顯示文件內(nèi)容
server.quit()
print('收取成功')
直接看這里!
1、發(fā)送郵件函數(shù):sent_email(from_addr, password, to_addrs, title, content, path=None)
按順序輸入括號(hào)中的參數(shù)
from_addr:發(fā)件人郵箱
password:發(fā)件人密碼(如果是QQ或者網(wǎng)易郵箱,這里寫(xiě)授權(quán)碼)
to_addrs:收件郵箱列表
title:郵件標(biāo)題
content:郵件正文內(nèi)容
path:如果需要發(fā)送附件,這里填寫(xiě)附件的路徑,如果沒(méi)有,則直接忽略
from_addr = '20182*****@mail.scut.edu.cn' # 打個(gè)碼,這里輸入你自己的郵箱就行 password = 'scut_827*****' # 輸入你的密碼(如果是qq或者網(wǎng)易郵箱,這里要輸入授權(quán)碼) to_addrs = ['lly****@163.com', '12375947@qq.com'] # 這里就寫(xiě)需要發(fā)送的郵箱 title = '這是一封測(cè)試郵件' # 郵件標(biāo)題 content = '隨便寫(xiě)點(diǎn)東西' # 正文內(nèi)容 path = 'C:/Users/要發(fā)的文件.xlsx' # 如果你想要發(fā)送一封帶附件的郵件,那么這里就填寫(xiě)你的附件路徑 sent_email(from_addr, password, to_addrs, title, content, path) # 發(fā)送郵件
2、收取郵件函數(shù):get_email(email, password, path)
email:郵箱地址
password:密碼(如果是qq郵箱或者網(wǎng)易郵箱,這里填授權(quán)碼)
path:附件保留的位置
email = '1234567@163.com' # 填寫(xiě)你的郵箱賬號(hào)(你要收取郵件的那個(gè)郵箱) password = 'LXSHS*****' # 填寫(xiě)你的郵箱密碼(如果是qq或者網(wǎng)易郵箱,這里要輸入授權(quán) path = 'C:/Users/Desktop/' # 如果對(duì)方的郵件有附件,那么附件將下載到這里地方 get_email(email,password,path)
到此這篇關(guān)于Python自動(dòng)發(fā)送和收取郵件的方法的文章就介紹到這了,更多相關(guān)Python自動(dòng)發(fā)送和收取郵件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python批量刪除MySQL數(shù)據(jù)庫(kù)的全部外鍵
這篇文章主要為大家詳細(xì)介紹了如何使用Python批量刪除MySQL數(shù)據(jù)庫(kù)的全部外鍵,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
10個(gè)python爬蟲(chóng)入門(mén)基礎(chǔ)代碼實(shí)例 + 1個(gè)簡(jiǎn)單的python爬蟲(chóng)完整實(shí)例
這篇文章主要介紹了10個(gè)python爬蟲(chóng)入門(mén)基礎(chǔ)代碼實(shí)例和1個(gè)簡(jiǎn)單的python爬蟲(chóng)爬蟲(chóng)貼吧圖片的實(shí)例,需要的朋友可以參考下2020-12-12
使用PyQt5實(shí)現(xiàn)一個(gè)鼠標(biāo)連點(diǎn)器
這篇文章主要為大家詳細(xì)介紹了如何使用PyQt5實(shí)現(xiàn)一個(gè)鼠標(biāo)連點(diǎn)器,從而對(duì)QVBoxLayout、QHBoxLayout和QStackedWidget進(jìn)行一個(gè)回顧復(fù)習(xí),需要的可以參考一下2023-12-12
利用Python繪制隨機(jī)游走圖的詳細(xì)過(guò)程
隨機(jī)游走(random walk)也稱隨機(jī)漫步,隨機(jī)行走等,是以隨機(jī)的方式采取連續(xù)步驟的過(guò)程,下面這篇文章主要給大家介紹了關(guān)于利用Python繪制隨機(jī)游走圖的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
Python處理不同接口間參數(shù)依賴的方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫(xiě)接口自動(dòng)化測(cè)試,以有效地處理不同接口之間的參數(shù)依賴,并提供豐富的示例代碼,希望對(duì)大家有所幫助2024-01-01
Ubuntu18.04安裝 PyCharm并使用 Anaconda 管理的Python環(huán)境
這篇文章主要介紹了Ubuntu18.04安裝 PyCharm并使用 Anaconda 管理的Python環(huán)境的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Python三維繪圖之Matplotlib庫(kù)的使用方法
這篇文章主要給大家介紹了關(guān)于Python三維繪圖之Matplotlib庫(kù)的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

