Python-十四劫瞳、發(fā)郵件

復(fù)習(xí)上一章的內(nèi)容。

模塊相關(guān):

模塊相關(guān)語(yǔ)句
模塊三問(wè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.我還找到了一張別人畫的圖抡医。

PYTHON發(fā)送郵件流程圖

決定了我需要學(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郵箱的使用方法带欢。

找到使用方法后运授,右下角會(huì)有一個(gè)二維碼

掃描后發(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)容粟判、圖片、附件等多種形式峦剔。

Email模塊

···

使用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è)模塊赏枚,方法如下亡驰。

1
2
3

MyQR教程入口

我們經(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' #二維碼
    )
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市摔蓝,隨后出現(xiàn)的幾起案子赂苗,更是在濱河造成了極大的恐慌,老刑警劉巖贮尉,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拌滋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡猜谚,警方通過(guò)查閱死者的電腦和手機(jī)败砂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)魏铅,“玉大人昌犹,你說(shuō)我怎么就攤上這事±婪迹” “怎么了斜姥?”我有些...
    開(kāi)封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沧竟。 經(jīng)常有香客問(wèn)我铸敏,道長(zhǎng),這世上最難降的妖魔是什么悟泵? 我笑而不...
    開(kāi)封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任杈笔,我火速辦了婚禮,結(jié)果婚禮上魁袜,老公的妹妹穿的比我還像新娘。我一直安慰自己敦第,他們只是感情好峰弹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著芜果,像睡著了一般鞠呈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上右钾,一...
    開(kāi)封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天蚁吝,我揣著相機(jī)與錄音,去河邊找鬼舀射。 笑死窘茁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脆烟。 我是一名探鬼主播山林,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼邢羔!你這毒婦竟也來(lái)了驼抹?” 一聲冷哼從身側(cè)響起桑孩,我...
    開(kāi)封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎框冀,沒(méi)想到半個(gè)月后流椒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡明也,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年宣虾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诡右。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡安岂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帆吻,到底是詐尸還是另有隱情域那,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布猜煮,位于F島的核電站次员,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏王带。R本人自食惡果不足惜淑蔚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愕撰。 院中可真熱鬧刹衫,春花似錦、人聲如沸搞挣。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)囱桨。三九已至仓犬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舍肠,已是汗流浹背搀继。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翠语,地道東北人叽躯。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肌括,于是被迫代替她去往敵國(guó)和親险毁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容