郵件收發(fā)的兩個(gè)模塊(module):
- email模塊構(gòu)建郵件
- smtplib模塊發(fā)送郵件
示意如下:
流程圖.png
流程圖.png
自學(xué)相關(guān)模塊的本領(lǐng):網(wǎng)絡(luò)引擎搜索
- 方式:為使檢索精確,我們可以使用+號(hào)或者空格連接關(guān)鍵詞耸峭,也可使用之前學(xué)習(xí)的and和or來(lái)連接澜躺。
-
方法:學(xué)習(xí)方向.png
email模塊
用來(lái)寫郵件內(nèi)容的模塊蝉稳。這個(gè)內(nèi)容可以是純文本、HTML內(nèi)容掘鄙、圖片耘戚、附件等多種形式。
email其實(shí)是一個(gè)包(package)操漠。模塊一般是一個(gè)文件收津,而包是一個(gè)目錄,一個(gè)包中可以包含很多個(gè)模塊浊伙,可以說(shuō)包是“模塊打包”組成的撞秋。Python中的包都必須默認(rèn)包含一個(gè)init.py的文件。
email模塊函數(shù).png
郵件正文對(duì)應(yīng)的導(dǎo)入方式為:
from email.mime.text import MIMEText
# 引入email包中構(gòu)建文本內(nèi)容的方法
MIMEText(msg,type,chartset)
# msg:文本內(nèi)容嚣鄙,可自定義
# type:文本類型吻贿,默認(rèn)為plain(純文本)
# chartset:文本編碼,中文為“utf-8”
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
郵件頭的寫法:
from email.header import Header
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
smtplib模塊郵件發(fā)送的函數(shù)(方法)(來(lái)自網(wǎng)絡(luò)):
郵件發(fā)送的函數(shù).png
郵件發(fā)送函數(shù).png
總結(jié)smtplib發(fā)送郵件的函數(shù):
import smtplib
server = smtplib.SMTP()
#server = smtplib.SMTP_SSL()
#如果端口是用SSL加密哑子,請(qǐng)這樣寫代碼舅列。其中server是變量名
server.connect(host, port)
#server.connect('smtp.qq.com', 465) #smtp.qq.com為qq郵箱服務(wù)器
#如果出現(xiàn)編碼錯(cuò)誤UnicodeDecodeError,你可以這樣寫:server.connect('smtp.qq.com', 465,'utf-8')
server.login(username, password)
#username:登錄郵箱的用戶名
#password:授權(quán)碼(不是郵箱登錄密碼)
server.sendmail(sender, to_addr, msg.as_string())
#from_addr:郵件發(fā)送地址卧蜓,就是上面的username
#to_addr:郵件收件人地址
#msg.as_string():為一個(gè)字符串類型
server.quit()
#退出服務(wù)器帐要,結(jié)束SMTP會(huì)話
- host是指定連接的郵箱服務(wù)器,你可以指定服務(wù)器的域名弥奸。通過(guò)搜索“xx郵箱服務(wù)器地址”榨惠,就可以找到;
- port 是“端口”的意思。一般情況下SMTP默認(rèn)端口號(hào)為25赠橙。如果25行不通伸蚯,你可以通過(guò)搜索或者去郵箱設(shè)置里面查看端口。比如简烤,如果我打算用自己的企業(yè)郵箱來(lái)發(fā)郵件剂邮,登錄郵箱后,在【設(shè)置-選項(xiàng)-POP和IMAP】里面可以看到這些信息横侦;
收發(fā)郵件的全流程(郵件正文)
收發(fā)郵件的全流程.png
可能的報(bào)錯(cuò)信息:
- ValueError: server_hostname cannot be an empty string or start with a leading dot.
將相應(yīng)代碼改為:
# 改動(dòng)這句代碼
server = smtplib.SMTP_SSL()
# 在括號(hào)內(nèi)加入host參數(shù)
server = smtplib.SMTP_SSL(smtp_server)
- smtplib.SMTPException: No suitable authentication method found.
在登錄(login)之前調(diào)用starttls()方法就可以了挥萌。即將相應(yīng)代碼改為:
server.starttls()
郵件全文源代碼
# smtplib 用于郵件的發(fā)信動(dòng)作
import smtplib
from email.mime.text import MIMEText
# email 用于構(gòu)建郵件正文內(nèi)容
from email.header import Header
# 用于構(gòu)建郵件頭
# 發(fā)信方的信息:發(fā)信郵箱,QQ郵箱授權(quán)碼)
from_addr = 'xxx@qq.com'
password = '你的授權(quán)碼數(shù)字'
# 收信方郵箱
to_addr = 'xxx@qq.com'
# 發(fā)信服務(wù)器
smtp_server = 'smtp.qq.com'
# 郵箱正文內(nèi)容枉侧,第一個(gè)參數(shù)為內(nèi)容引瀑,第二個(gè)參數(shù)為格式(plain 為純文本),第三個(gè)參數(shù)為編碼
text = '''
? 希望學(xué)習(xí)Python對(duì)你不是一件困難的事情榨馁!
'''
msg = MIMEText(text,'plain','utf-8')
# 郵件頭信息:from_addr憨栽,to_addr可以自定義
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
# 開啟發(fā)信服務(wù),這里使用的是SSL加密傳輸
server = smtplib.SMTP_SSL()
server.connect(smtp_server,465)
# 登錄發(fā)信郵箱
server.login(from_addr, password)
# 發(fā)送郵件
server.sendmail(from_addr, to_addr, msg.as_string())
# 關(guān)閉服務(wù)器
server.quit()
群發(fā)郵件
郵件群發(fā)的三種方式.png
列表的方式:
使用str.join()函數(shù)將郵箱由列表轉(zhuǎn)為字符串
to_addrs=['mail1','mail2','mail3']
comon=","
addrs_mod=comon.join(to_addrs)
While循環(huán):
通過(guò)輸入的方式將郵箱逐個(gè)加入到事先建立的空列表中
# smtplib 用于郵件的發(fā)信動(dòng)作
import smtplib
from email.mime.text import MIMEText
# email 用于構(gòu)建郵件內(nèi)容
from email.header import Header
# 用于構(gòu)建郵件頭
# 發(fā)信方的信息:發(fā)信郵箱翼虫,QQ 郵箱授權(quán)碼
from_addr = input('請(qǐng)輸入登錄郵箱:')
password = input('請(qǐng)輸入郵箱授權(quán)碼:')
# 收信方郵箱
to_addrs = []
while True:
a=input('請(qǐng)輸入收件人郵箱:')
to_addrs.append(a)
b=input('是否繼續(xù)輸入屑柔,n退出,任意鍵繼續(xù):')
if b == 'n':
break
# 發(fā)信服務(wù)器
smtp_server = 'smtp.qq.com'
text='''親愛(ài)的學(xué)員珍剑,你好掸宛!
希望學(xué)習(xí)Python對(duì)你不是一件困難的事情!
'''
msg = MIMEText(text,'plain','utf-8')
# 郵件頭信息
msg['From'] = Header(from_addr)
msg['To'] = Header(",".join(to_addrs))
msg['Subject'] = Header('python test')
# 開啟發(fā)信服務(wù)招拙,這里使用的是加密傳輸
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server,465)
# 登錄發(fā)信郵箱
server.login(from_addr, password)
# 發(fā)送郵件
server.sendmail(from_addr, to_addrs, msg.as_string())
# 關(guān)閉服務(wù)器
server.quit()
調(diào)用csv模塊
data = [['wufeng ', 'wufeng@qq.com'],['kaxi', 'kaxi@qq.com']]
# 寫入收件人數(shù)據(jù)
with open('to_addrs.csv', 'w', newline='') as f:
writer = csv.writer(f)
for row in data:
writer.writerow(row)
# 讀取收件人數(shù)據(jù)唧瘾,并啟動(dòng)寫信和發(fā)信流程
with open('to_addrs.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
to_addrs=row[1]
msg = MIMEText(text,'plain','utf-8')
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addrs)
msg['Subject'] = Header('python test')
server = smtplib.SMTP_SSL()
server.connect(smtp_server,465)
server.login(from_addr, password)
server.sendmail(from_addr, to_addrs, msg.as_string())
# 關(guān)閉服務(wù)器
server.quit()
try...except...語(yǔ)句處理你遇到的問(wèn)題
try:
server.sendmail(from_addr, to_addrs, msg.as_string())
print('恭喜,發(fā)送成功')
except:
print('發(fā)送失敗别凤,請(qǐng)重試')
什么是SMTP饰序?
SMTP (Simple Mail Transfer Protocol)是“簡(jiǎn)單郵件傳輸協(xié)議”的意思,SMTP 協(xié)議是由源服務(wù)器到目的地服務(wù)器傳送郵件的一組規(guī)則规哪。
注:此日志來(lái)源于風(fēng)變編程課程求豫。