復(fù)習(xí)上一章的內(nèi)容。
模塊相關(guān):
項(xiàng)目流程是什么绷柒?
1.明確項(xiàng)目目標(biāo)志于;
2.分析過(guò)程,拆解項(xiàng)目废睦;
3.逐步執(zhí)行伺绽,代碼實(shí)現(xiàn)。
今天嗜湃,我們要用Python來(lái)發(fā)郵件奈应,那么就讓我們從這一步開(kāi)始吧!
1购披、明確項(xiàng)目目標(biāo)
業(yè)務(wù)需求:
業(yè)務(wù)員小張需要在節(jié)假日給客戶發(fā)祝福郵件杖挣。
根據(jù)業(yè)務(wù)需求產(chǎn)生的項(xiàng)目(學(xué)習(xí))目標(biāo):
1.學(xué)會(huì)用python群發(fā)郵件
2.自學(xué)掌握新模塊
2、分析過(guò)程刚陡,拆解項(xiàng)目
2.1惩妇、建立版本里程
V 1.0:找到并學(xué)習(xí)發(fā)郵件的模塊株汉,給自己發(fā)一封一句話的簡(jiǎn)單郵件
V 2.0:給自己發(fā)一封有完整郵件頭和正文內(nèi)容的郵件
V 3.0:群發(fā)完整郵件
3、逐步執(zhí)行歌殃,代碼實(shí)現(xiàn)
讓我們按照2中的版本里程碑一步一步來(lái)吧乔妈!
V 1.0:學(xué)習(xí)模塊,給自己發(fā)一封一句話的簡(jiǎn)單郵件
咋辦氓皱?GOOGLE或BAIDU唄褒翰!
通過(guò)使用百度搜索我發(fā)現(xiàn):
1.Python可以解決這個(gè)問(wèn)題;
2.方法是smtplib匀泊,email這兩個(gè)模塊。
我順便知道了::
1.smtplib是用來(lái)發(fā)送郵件用的朵你,email是用來(lái)構(gòu)建郵件內(nèi)容的各聘;
2.這兩個(gè)都是Python內(nèi)置模塊。
3.我還找到了一張別人畫的圖抡医。
決定了我需要學(xué)習(xí)的兩個(gè)模塊躲因,就是負(fù)責(zé)發(fā)送郵件的smtplib
和負(fù)責(zé)構(gòu)造郵件內(nèi)容的email
。
我引入兩個(gè)問(wèn)題忌傻,并通過(guò)學(xué)習(xí)來(lái)回答這兩個(gè)問(wèn)題:
問(wèn)題1:這兩個(gè)模塊分別有些什么方法大脉?
模塊1、SMTPLIB
SMTP(Simple Mail Transfer Protocol)即簡(jiǎn)單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則水孩,由它來(lái)控制信件的中轉(zhuǎn)方式镰矿。
python的smtplib提供了一種很方便的途徑發(fā)送電子郵件。它對(duì)smtp協(xié)議進(jìn)行了簡(jiǎn)單的封裝俘种。
Python創(chuàng)建 SMTP 對(duì)象語(yǔ)法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
參數(shù)說(shuō)明:
**host: **SMTP 服務(wù)器主機(jī)秤标。 你可以指定主機(jī)的ip地址或者域名如:runoob.com,這個(gè)是可選參數(shù)宙刘。
**port: **如果你提供了 host 參數(shù), 你需要指定 SMTP 服務(wù)使用的端口號(hào)苍姜,一般情況下SMTP端口號(hào)為25。
**local_hostname: **如果SMTP在你的本機(jī)上悬包,你只需要指定服務(wù)器地址為 localhost 即可衙猪。
Python SMTP對(duì)象使用sendmail方法發(fā)送郵件,語(yǔ)法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]
參數(shù)說(shuō)明:
**from_addr: **郵件發(fā)送者地址布近。
**to_addrs: **字符串列表垫释,郵件發(fā)送地址。
**msg: **發(fā)送消息
這里要注意一下第三個(gè)參數(shù)吊输,msg是字符串饶号,表示郵件。我們知道郵件一般由標(biāo)題季蚂,發(fā)信人茫船,收件人琅束,郵件內(nèi)容,附件等構(gòu)成算谈,發(fā)送郵件的時(shí)候涩禀,要注意msg的格式。這個(gè)格式就是smtp協(xié)議中定義的格式然眼。
等等……
總結(jié)后艾船,發(fā)現(xiàn)我們要發(fā)送郵件,就需要用到smtplib模塊的以下方法:
import smtplib
server = smtplib.SMTP()
server.connect(host, port)
server.login(username, password)
server.sendmail(sender, to_addr, msg.as_string())
server.quit()
問(wèn)題2:這些方法怎么用高每?
首先屿岂,我得有一個(gè)郵箱,并且能夠使用這個(gè)郵箱發(fā)郵件鲸匿,于是我想到了QQ郵箱爷怀。
在百度一番搜索
后,我找到了QQ郵箱的使用方法带欢。
掃描后發(fā)短信生成授權(quán)碼。
然后將代碼拆解做引入乔煞。
import smtplib
host = 'smtp.qq.com' #郵件服務(wù)器
port = 465 #服務(wù)器端口
username = 'xx@qq.com'
password = '授權(quán)碼'
from_addr = 'xx@qq.com' #發(fā)件人
to_addr = 'yy@ik.com' #收件人
server = smtplib.SMTP() #引用smtplib模塊
server.connect(host, port) #服務(wù)器和端口
server.login(username, password) #郵箱賬號(hào)和密碼
server.sendmail(from_addr, to_addr, msg.as_string()) #由誰(shuí)發(fā)給誰(shuí)吁朦,郵件內(nèi)容
server.quit() #退出
問(wèn)題3:怎么填寫郵件內(nèi)容?
先回顧一下開(kāi)發(fā)過(guò)程:
1渡贾、導(dǎo)入模塊:stmplib模塊逗宜,email模塊
2、定義變量:發(fā)件人空骚、密碼锦溪、收件人、正文內(nèi)容府怯、服務(wù)器
3刻诊、使用方法:鏈接、登錄牺丙、發(fā)送则涯、退出
email 模塊
:也就是用來(lái)寫郵件內(nèi)容的模塊。這個(gè)內(nèi)容可以是純文本冲簿、HTML內(nèi)容粟判、圖片、附件等多種形式峦剔。
···
使用from … import …語(yǔ)句档礁,從email包目錄下的【某個(gè)文件】引入【需要的對(duì)象】。
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
···
MIMEText()方法需要輸入三個(gè)參數(shù):文本內(nèi)容吝沫,文本類型和文本編碼呻澜。
MIMEText(msg,type,chartset)
# msg:文本內(nèi)容递礼,可自定義
# type:文本類型,默認(rèn)為plain(純文本)
# chartset:文本編碼羹幸,中文為“utf-8”
最終代碼
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
host = 'smtp.qq.com' #郵件服務(wù)器
port = 465 #服務(wù)器端口
password = '**********' #郵箱密碼(授權(quán)碼)
from_addr = 'xxx@qq.com' #發(fā)信郵箱
to_addr = 'yyy@ik.com' #發(fā)信對(duì)象
#郵件正文脊髓,第一個(gè)是內(nèi)容,第二個(gè)(plain代表純文本)栅受,第三個(gè)為編碼格式将硝。
msg = MIMEText('Send by python','plain','utf-8')
#引用smtplib模塊,開(kāi)啟發(fā)信服務(wù)屏镊,使用SSL加密傳輸
server = smtplib.SMTP_SSL(host)
server.connect(host, port) #服務(wù)器和端口
server.login(from_addr, password) #郵箱賬號(hào)和密碼
server.sendmail(from_addr, to_addr, msg.as_string()) #由誰(shuí)發(fā)給誰(shuí)依疼,郵件內(nèi)容
server.quit() #退出
郵箱收到的郵件信息:
V 2.0:**給自己發(fā)一封完整郵件
在上面的郵件中,我們沒(méi)有郵件頭而芥,正文內(nèi)容也不算豐富涛贯。
豐富郵件頭
郵件頭(headerr)包括主題、發(fā)件人蔚出、收件人等信息。
通過(guò)搜索關(guān)鍵詞“python 郵件頭” 找到了下述代碼虫腋,再讀了模塊的文檔骄酗,作出注釋。
#導(dǎo)入郵件頭模塊
from email.header import Header
msg['From'] = Header(from_addr) #發(fā)件人
msg['To'] = Header(to_addr) #收件人
msg['Subject'] = Header('python test') #郵件標(biāo)題
豐富郵件正文
我本來(lái)的郵件正文只有短短一句話悦冀。
msg = MIMEText('send by python','plain','utf-8')
如果是正式發(fā)郵件的話趋翻,我該咋整呢?
搞一個(gè)變量存正文盒蟆,在把變量導(dǎo)到msg中去踏烙。
本版本的代碼如下:
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.header import Header
host = 'smtp.qq.com' #郵件服務(wù)器
port = 465 #服務(wù)器端口
password = 'xxx' #郵箱密碼(授權(quán)碼)
from_addr = 'xxx@qq.com' #發(fā)信郵箱
to_addr = 'xxx@xx.com' #發(fā)信對(duì)象
#郵件正文,第一個(gè)是內(nèi)容历等,第二個(gè)(plain代表純文本)讨惩,第三個(gè)為編碼格式。
text = '''朋友你好
? 我是一封Python發(fā)的郵件寒屯,能遇見(jiàn)你很開(kāi)心荐捻。
? 希望學(xué)習(xí)Python對(duì)你來(lái)說(shuō),不是一件困難的事情吕晌!
人生苦短锨侯,我用Python
'''
msg = MIMEText(text,'plain','utf-8')
#郵件頭
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('由Python編寫的郵件')
#引用smtplib模塊漾根,開(kāi)啟發(fā)信服務(wù),使用SSL加密傳輸
server = smtplib.SMTP_SSL(host)
server.connect(host, port) #服務(wù)器和端口
server.login(from_addr, password) #郵箱賬號(hào)和密碼
server.sendmail(from_addr, to_addr, msg.as_string()) #由誰(shuí)發(fā)給誰(shuí)魂角,郵件內(nèi)容
server.quit() #退出
V 3.0:群發(fā)完整郵件
在百度中找到了海量的信息,決定從2
種方式著手智绸。
1野揪、設(shè)置一個(gè)列表形式的變量:
to_addrs = ['xxx@qq.com','yyy@qq.com']
# msg['To'] = Header(to_addr) #因?yàn)閠o_addr函數(shù)會(huì)影響到發(fā)信對(duì)象访忿,這樣使用會(huì)報(bào)錯(cuò),所以我們改一下msg['To']函數(shù)的代碼
msg['to'] = Header(",".join(to_addrs)) #使用join函數(shù)把to_addrs編程一個(gè)字符串囱挑。
2醉顽、用while循環(huán)
通過(guò)詢問(wèn)“是否繼續(xù)輸入郵箱地址”的方式,并用while循環(huán)來(lái)實(shí)現(xiàn)多個(gè)收件人的功能平挑。
to_addrs = []
while True:
a=input('請(qǐng)輸入收件人郵箱:')
#輸入收件人郵箱
to_addrs.append(a)
#寫入列表
b=input('是否繼續(xù)輸入游添,n退出,任意鍵繼續(xù):')
#詢問(wèn)是否繼續(xù)輸入
if b == 'n':
break
print(to_addrs)
練習(xí)-做一個(gè)動(dòng)態(tài)二維碼
在百度中找到了很多方法通熄,決定嘗試MyQR這模塊唆涝。
在cmd中使用pip install myqr
成功完成了該模塊的安裝,需要注意的是MyQR依賴于python3唇辨,在python2的環(huán)境下可能無(wú)法正常運(yùn)行廊酣。
剛開(kāi)始時(shí)出現(xiàn)報(bào)錯(cuò):ModuleNotFoundError: No module named 'MyQR'
。
找到的解決方法為在Pycharm中添加這個(gè)模塊赏枚,方法如下亡驰。
我們經(jīng)常使用 MyQR 庫(kù)中的一個(gè)模塊 myqr 來(lái)制作二維碼,引用方式為from MyQR import myqr其參數(shù)如下所示:
words:二維碼內(nèi)容饿幅,鏈接或者句子
version:二維碼大小凡辱,范圍為[1,40]
level:二維碼糾錯(cuò)級(jí)別,范圍為{L,M,Q,H}栗恩,H為最高級(jí)透乾,默認(rèn)。
picture:自定義二維碼背景圖磕秤,支持格式為 .jpg乳乌,.png,.bmp市咆,.gif汉操,默認(rèn)為黑白色
colorized:二維碼背景顏色,默認(rèn)為 False蒙兰,即黑白色
contrast:對(duì)比度客情,值越高對(duì)比度越高,默認(rèn)為 1.0
brightness:亮度癞己,值越高亮度越高膀斋,默認(rèn)為 1.0,值常和對(duì)比度相同
save_name:二維碼名稱痹雅,默認(rèn)為 qrcode.png
save_dir:二維碼路徑仰担,默認(rèn)為程序工作路徑
from MyQR import myqr#注意大小寫
myqr.run(
words = 'http://www.baidu.com/', #二維碼內(nèi)容
version = 5, #二維碼大小
level = 'M', #二維碼糾錯(cuò)級(jí)別
picture = 'd:\\qrcode\\LOGO().png', #二維碼背景圖片
colorized = True, #調(diào)整顏色為彩色,默認(rèn)False為黑白
save_name = 'test.png', #二維碼圖片命名
save_dir = 'd:\\qrcode' #二維碼
)