完成一個項目的流程
1.明確項目目標(biāo)
2.分解過程、拆解項目
3.逐步執(zhí)行、代碼實現(xiàn)
- 目標(biāo):Python群發(fā)郵件
-
目標(biāo):學(xué)會學(xué)習(xí)新模塊
掌握【學(xué)習(xí)模塊的方式】→掌握學(xué)習(xí)新知識的方式
版本1.0:學(xué)習(xí)模塊,發(fā)一封簡單郵件
學(xué)習(xí)方法引導(dǎo):
搜索關(guān)鍵詞“發(fā)送郵件 python”,找到解決方案→先縱觀搜索出來的內(nèi)容,找共同點(比如可以知道1.Python可以解決這個問題;2.方法是smtplib,email這兩個模塊。smtplib是用來發(fā)送郵件用的,email是用來構(gòu)建郵件內(nèi)容的。這兩個都是Python內(nèi)置模塊)→學(xué)習(xí)這兩個模塊-
學(xué)習(xí)模塊——smtplib模塊
1.搜 ‘smtplib python’(高手使用,因為會進官方網(wǎng)站)
2.搜 ‘smtplib 教程 ’(新手使用,比較友好)
多比較幾個文檔,對于重復(fù)部分多的代碼,就是你要找的內(nèi)容。- 注意在搜索時,關(guān)鍵詞越多越準(zhǔn)確,可以使用+或空格連接或and連接關(guān)鍵詞
import smtplib #引入smtplib模塊
server = smtplib.SMTP() #server是一個變量,smtplib.SMTP()是變量server的值,若不知道SMTP,
#可以在本地編輯器中按住Ctrl鍵并點擊SMTP ,會看到對SMTP的解釋
server.connect(host, port) #連接(connect)指定的服務(wù)器,host是指定連接的郵箱服務(wù)器;port 是“端口”的意思,一般情況下SMTP默認端口號為25。
#如果25行不通,你可以通過搜索或者去郵箱設(shè)置里面查看端口。比如,如果我打算用自己的企業(yè)郵箱來發(fā)郵件,登錄郵箱后,在【設(shè)置-選項-POP和IMAP】查看端口數(shù)字
#QQ 郵箱一般默認關(guān)閉SMTP服務(wù),我們得先去開啟它:登錄你的郵箱。然后點擊位于頂部的【設(shè)置】按鈕,選擇【賬戶設(shè)置】開啟
server.login(username, password) #username:登錄郵箱的用戶 password:授權(quán)碼(在【賬戶】處獲得,用此碼登錄,而不是你的qq郵箱登錄密碼)
server.sendmail(sender, to_addr, msg.as_string()) #sendmail是“發(fā)送郵件”的意思
#是發(fā)送郵件用的,sendmail()方法需要三個參數(shù):發(fā)件人,收件人和郵件內(nèi)容
#from_addr:郵件發(fā)送地址,就是上面的username
#to_addr:郵件收件人地址
#msg.as_string():為一個字符串類型
server.quit() #quit是“退出”的意思,就是退出服務(wù)器
- 學(xué)習(xí)模塊——email模塊
from email.mime.text import MIMEText #內(nèi)容形式為純文本、HTML頁面
from email.mime.image import MIMEImage #內(nèi)容形式為圖片
from email.mime.multipart import MIMEMultipart #多形式組合,可包含文本和附件
MIMEText(msg,type,chartset)
# msg:文本內(nèi)容,可自定義
# type:文本類型,默認為plain(純文本)
# chartset:文本編碼,中文為“utf-8”
#文本類型和文本編碼,我們默認用'plain'和'utf-8'
-
建議的代碼結(jié)構(gòu)
1.導(dǎo)入模塊:smtplib模塊 和 email 模塊
2.定義變量:包括發(fā)件人、密碼、收件人、正文內(nèi)容、服務(wù)器
3.使用方法:連接、登錄、發(fā)送、退出
# 1.導(dǎo)入模塊
# smtplib 用于郵件的發(fā)信動作
import smtplib
from email.mime.text import MIMEText # email 用于構(gòu)建郵件內(nèi)容
# 2.定義變量:
# 發(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)容,第一個參數(shù)為內(nèi)容,第二個參數(shù)為格式(plain 為純文本),第三個參數(shù)為編碼
msg = MIMEText('send by python','plain','utf-8')
# 3.使用方法:
# 開啟發(fā)信服務(wù),這里使用的是加密傳輸
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()
常見報錯信息:ValueError: server_hostname cannot be an empty string or start with a leading dot.
解決辦法:server = smtplib.SMTP_SSL()改成server = smtplib.SMTP_SSL(smtp_server)
版本2.0:給自己發(fā)一封完整郵件
1.豐富文件頭
- 包括主題、發(fā)件人、收件人等信息
方法:搜索“發(fā)郵件 Python”,看別人的代碼是怎么樣寫的
from email.header import Header
msg['From'] = Header('xxx') #發(fā)件人郵箱地址/也可自定義其他內(nèi)容
msg['To'] = Header('xxx') #收件人郵箱地址/也可自定義其他內(nèi)容
msg['Subject'] = Header('xxx') #郵件主題
2.豐富正文內(nèi)容
- 如果你想要寫很長的內(nèi)容,建議先設(shè)置一個變量text用來放正文內(nèi)容,
- 正文需要換行,這時用到了三引號的用法啦
例如:
text = '''親愛的學(xué)員,你好!
? 我是吳楓老師,能遇見你很開心。
? 希望學(xué)習(xí)Python對你不是一件困難的事情!
人生苦短,我用Python
'''
msg = MIMEText(text,'plain','utf-8')
版本3.0:群發(fā)完整郵件
-
設(shè)置一個列表形式的變量
1.將收件人信箱的變量設(shè)置成一個可以裝多個內(nèi)容的列表
例如:
to_addrs = ['wufeng@qq.com','kaxi@qq.com']
2.然而列表不能解碼,只能變成字符串形式(使用join()函數(shù))
msg['to'] = Header(",".join(to_addrs))
join()的用法是str.join(sequence),str代表在這些字符串之中你要用什么字符串來連接,你可以用逗號,空格,下劃線等等,sequence可以是列表等
-
使用while循環(huán)
1.定義一個空列表to_addrs,用來存放收件人郵箱地址
2.輸入郵箱地址的時候,地址會被追加寫進列表
to_addrs = []
while True:
a=input('請輸入收件人郵箱:')
#輸入收件人郵箱
to_addrs.append(a)
#寫入列表
b=input('是否繼續(xù)輸入,n退出,任意鍵繼續(xù):')
#詢問是否繼續(xù)輸入
if b == 'n':
break
print(to_addrs)
- while True: 只要不遇到break,就會一直循環(huán)下去。
-
寫入csv模塊
步驟:1.引入csv模塊;2.提供需要寫入csv文件的數(shù)據(jù),3.建文件并寫入。
import csv # 引用csv模塊,用于讀取郵箱信息
data = [['wufeng ', 'wufeng@qq.com'],['kaxi', 'kaxi@qq.com']] # 待寫入csv文件的收件人數(shù)據(jù):人名+郵箱
with open('to_addrs.csv', 'w', newline='') as f:
writer = csv.writer(f)
for row in data:
writer.writerow(row)
# 讀取收件人數(shù)據(jù),并啟動寫信和發(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') #這些要都寫到for循環(huán)下
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()