2020-08-09 實操項目(收發(fā)郵件)

【明確項目目標】

學員小賈是一名外貿(mào)人員,每到了節(jié)假日蕴忆,要給客戶發(fā)祝福郵件颤芬。

雖然現(xiàn)在群發(fā)郵件比較方便,但還是要每次手動添加收件人的郵箱套鹅。小賈想:要是能夠自動發(fā)送郵件給這些人就好了站蝠。

除了要學習這個模塊相關(guān)的知識之外,我認為更重要的仍是掌握【學習模塊的方式】卓鹿,也可以理解為掌握【學習新知識的方式】菱魔。

這也是我們的另一個項目目標:學會自學新模塊

【分析過程减牺,拆解項目】

版本1.0豌习,主要是根據(jù)需求,自己尋找和學習相關(guān)的模塊拔疚,然后給自己發(fā)一封最簡單的郵件肥隆。

版本2.0呢,還是給自己發(fā)郵件稚失,但郵件應(yīng)該更完整栋艳,包括郵件頭(就是發(fā)件人、郵件標題等)句各,和正文內(nèi)容吸占。

版本3.0呢,主要是從單一收件人凿宾,變成多收件人矾屯,也就是群發(fā)一封完整的郵件。

【逐步執(zhí)行初厚,代碼實現(xiàn)】

【版本1.0:學習模塊件蚕,發(fā)一封簡單郵件】

在編程世界中,我們不需要什么知識都一把抓,而是遇到問題之后排作,產(chǎn)生了某種需求牵啦,才會去找對應(yīng)的解決方案

這個方案可能是某個模塊妄痪,也可能是某個函數(shù)~

就像在第一個PK小游戲項目中哈雏,我們想:要是能夠隨機生成某個區(qū)間內(nèi)的數(shù)字,替代固定的血量值衫生,可能會好一點裳瘪。于是我們就學習并引入了random模塊

其實障簿,只要搜索關(guān)鍵詞“發(fā)送郵件 python”盹愚,就能找到解決方案。


搜索后你看到這樣的頁面站故,不用逐一點進去看就能知道:1.Python可以解決這個問題皆怕;2.方法是smtplibemail這兩個模塊西篓。

而且還會知道:smtplib是用來發(fā)送郵件用的愈腾,email是用來構(gòu)建郵件內(nèi)容的。這兩個都是Python內(nèi)置模塊岂津。

為了方便自己理解虱黄,我們可以嘗試把它畫下來:

負責發(fā)送郵件的smtplib模塊,和負責構(gòu)造郵件內(nèi)容的email模塊吮成,就是我們今天要學習的新模塊~

一般橱乱,提供的關(guān)鍵字越多,搜索引擎返回的結(jié)果越精確粱甫。我們可以使用+號或者空格連接關(guān)鍵詞泳叠,也可使用之前學習的andor來連接,其含義和之前學習的一樣茶宵,分別表示“并且”和“或者”危纫。

找到解決方案并大致了解模塊之后,重頭戲來了——學習這兩個模塊

昨天我們已經(jīng)提供了一些學習的渠道乌庶,我們以smtplib模塊為例來實操一下:

對于smtplib模塊种蝶,我們想要去查看它的官方文檔,也只需要在瀏覽器里搜索關(guān)鍵詞“smtplib python”就好瞒大。

你能看到螃征,第1個搜索結(jié)果是Python 3.7.2版本的smtplib模塊介紹。打開這個網(wǎng)址透敌,你看到滿屏的英文:

如果你英文夠好会傲,那就可以去閱讀锅棕;如果你英文不太好拙泽,也可以使用谷歌瀏覽器自帶的“谷歌翻譯”功能淌山,將頁面翻譯成中文再閱讀。

這個文檔提供的內(nèi)容有:需要向smtplib模塊輸入什么顾瞻;smtplib模塊能做什么泼疑;smtplib模塊返回的是什么;常見的報錯荷荤;SMTP對象有哪些方法及如何使用退渗;一個應(yīng)用實例

如果是這么講蕴纳,你會發(fā)現(xiàn)邏輯還是蠻清晰的会油。但它依然對新手蠻不友好,讀起來比較痛苦古毛。

如果你能夠接受這種難度的文檔翻翩,那么照著這個去寫代碼是最好不過的,畢竟它是官方文檔稻薇。但如果你不能接受呢嫂冻,還有一些方案。

關(guān)鍵詞換成 “smtplib 教程” 塞椎,你就能看到好多好多中國人編寫的內(nèi)容桨仿。在可讀性上,是要比官方文檔好一些的案狠,但缺點在于良莠不齊服傍。你可以自行挑選適合自己的去閱讀。

上一關(guān)我們總結(jié)了模塊三問函數(shù)骂铁;屬性或方法吹零;格式。今天學習的兩個模塊比較簡單从铲,我們就不一一回答了瘪校,我們直接帶著兩個問題去學。

關(guān)于第1個問題名段,需要你現(xiàn)在點開搜索到的內(nèi)容看看阱扬,你可以看別人的簡介;也可以直接看代碼伸辟,多對比不同人寫的代碼麻惶,那些重復(fù)出現(xiàn)的代碼可能就是我們要找的方法。

總結(jié)一下這些內(nèi)容信夫,如果我們要發(fā)送郵件窃蹋,就需要用到smtplib模塊的以下方法:

第三行卡啰,server是一個變量,smtplib.SMTP()是變量server的值警没。我們已經(jīng)知道了smtplib是模塊的名稱匈辱,那SMTP是什么意思呢?

請你先在自己電腦的VS Code上新建一個.py文件杀迹。注意:這個.py文件不能命名為email.py亡脸,而且你存放這個py文件的文件夾里,也不能有email.py同名文件树酪。這是由于我們后面要調(diào)用email模塊妆丘,如果將文件也命名為email碍彭,會造成報錯。

現(xiàn)在請你把上面的代碼復(fù)制進去。按住Ctrl鍵并點擊SMTP?苇经,會看到對SMTP的解釋:

可以看到假哎,SMTP 是一個類(class)吝梅,再往下面滑可以看到其中包含了很多函數(shù)员咽,第二到第五行的函數(shù)就是 SMTP 類下的方法。

要想調(diào)用 smtplib 模塊下娃豹、SMTP 類下的方法焚虱,應(yīng)該這樣寫:smtplib.SMTP.方法

我們看到的那段代碼懂版,則是為了減少代碼冗余鹃栽,已經(jīng)將需要重復(fù)出現(xiàn)smtplib.SMTP賦值給了變量,可見躯畴,在編程的世界有多討厭重復(fù)了民鼓。所以還是采用這種寫法吧。

這樣我們就能夠調(diào)用需要的函數(shù)了蓬抄,那這些函數(shù)有什么含義丰嘉,要怎么用呢?繼續(xù)探索嚷缭。

其實我們只要知道SMTP是什么就能夠明白代碼的含義了饮亏,現(xiàn)在趕緊去搜索一下 “SMTP” 吧。

對阅爽,SMTP (Simple Mail Transfer Protocol)翻譯過來是“簡單郵件傳輸協(xié)議”的意思路幸,SMTP 協(xié)議是由源服務(wù)器到目的地服務(wù)器傳送郵件的一組規(guī)則。

可以簡單理解為:我們需要通過SMTP指定一個服務(wù)器付翁,這樣才能把郵件送到另一個服務(wù)器简肴。

第四行代碼,就是干這個工作的百侧,連接(connect)指定的服務(wù)器砰识。

host是指定連接的郵箱服務(wù)器能扒,你可以指定服務(wù)器的域名。通過搜索“xx郵箱服務(wù)器地址”辫狼,就可以找到初斑。

port?是“端口”的意思。端口屬于計算機網(wǎng)絡(luò)知識里的內(nèi)容予借,你可以自行搜索了解越平,現(xiàn)在我們只要知道它是一個【整數(shù)】即可。

我們需要指定SMTP服務(wù)使用的端口號灵迫,一般情況下SMTP默認端口號為25

如果25行不通晦溪,你可以通過搜索或者去郵箱設(shè)置里面查看端口瀑粥。比如,如果我打算用自己的企業(yè)郵箱來發(fā)郵件三圆,登錄郵箱后狞换,在【設(shè)置-選項-POP和IMAP】里面可以看到這些信息:

包括服務(wù)器名稱,端口和加密方式舟肉。服務(wù)器名稱是mail.forchange.tech修噪,端口是587。你可以登錄自己的郵箱路媚,查看這些信息黄琼,接下來跟著我一起寫代碼。

現(xiàn)在參數(shù)確定了整慎,代碼寫出來應(yīng)該長這樣:

接下來的實操脏款,以QQ郵箱為例來展示操作。我們可以搜索“QQ郵箱 smtp設(shè)置”得到hostport這兩個參數(shù)裤园。

兩個參數(shù)都有了撤师。SMTP服務(wù)器地址是:smtp.qq.com,端口是465587拧揽,那就讓我們?nèi)懘a吧剃盾!

這里有兩種寫法,一是使用默認端口:25淤袜。

二是痒谴,嘗試搜索到的端口,比如465饮怯。這時會有些不同闰歪,QQ 郵箱采用的加密方式是SSL,我們需要寫成這樣:

后面蓖墅,我們采用的是第二種寫法库倘。(大家可以先嘗試第一種默認端口临扮,如果不行則需要查找服務(wù)器對應(yīng)的端口。)

提醒教翩!QQ 郵箱一般默認關(guān)閉SMTP服務(wù)杆勇,我們得先去開啟它。請打開https://mail.qq.com/饱亿,登錄你的郵箱蚜退。然后點擊位于頂部的【設(shè)置】按鈕,選擇【賬戶設(shè)置】彪笼,然后下拉到這個位置钻注。

就像上面的一樣,把第一項服務(wù)打開配猫。需要用密保手機發(fā)送短信幅恋,完成之后,QQ 郵箱會提供給你一個授權(quán)碼泵肄,授權(quán)碼的意思是捆交,你可以不用QQ的網(wǎng)頁郵箱或者郵箱客戶端來登錄,而是用郵箱賬號+授權(quán)碼獲取郵箱服務(wù)器的內(nèi)容腐巢。

如果你打算用QQ郵箱自動發(fā)郵件品追,請保存好這個授權(quán)碼。在你使用SMTP服務(wù)登錄郵箱時冯丙,要輸入這個授權(quán)碼作為密碼登錄肉瓦,而【不是】你的郵箱登錄密碼

若在設(shè)置和開啟SMTP服務(wù)的過程中有遇到不可逾越的障礙……比如記不清密保手機银还,那么歡迎你……換個郵箱試試看风宁。只是要重新查找服務(wù)器地址,端口和加密方式蛹疯。這個過程中戒财,保持耐心~

理解了SMTP的含義,下面幾行代碼的作用也就好理解了:

第五行代碼捺弦,login是登錄的意思饮寞,也就是登錄你指定的服務(wù)器用的,需要輸入兩個參數(shù):登錄郵箱授權(quán)碼列吼。

把兩個參數(shù)放在最前面幽崩。這部分的代碼我們也可以寫出來了:

一個提醒:由于用戶名和授權(quán)碼屬于敏感信息,所以我們在本關(guān)不會提供用于輸入賬號和密碼的練習區(qū)寞钥。也就是說慌申,下面的步驟都需要你在自己的電腦上運行。如果還沒有新建py文件的,就現(xiàn)在動動手吧蹄溉。

另外咨油,為了運行代碼的方便,我們暫時就大大咧咧地將授權(quán)碼放在代碼里柒爵,不過為了安全起見役电,更好的做法還是利用input()函數(shù)來輸入,而不是直接展示喲棉胀。

第六行代碼sendmail是“發(fā)送郵件”的意思法瑟,是發(fā)送郵件用的,sendmail()方法需要三個參數(shù):發(fā)件人唁奢,收件人和郵件內(nèi)容霎挟。

這里的發(fā)件人from_addr與上面的username是一樣的,都是你的登錄郵箱驮瞧,所以只用設(shè)置一次氓扛。

msg.as_string()是一個字符串類型:as_string()是將發(fā)送的信息msg變?yōu)樽址愋汀?/p>

這樣寫還不完整,因為電腦不知道你要發(fā)送的信息msg是什么论笔,我們也沒有定義。這就需要用到email 模塊千所,后面會解決的狂魔。

最后一行代碼,quit是“退出”的意思淫痰,就是退出服務(wù)器最楷。

現(xiàn)在,我們就學習完smtplib模塊的方法了待错,也能夠知道這個模塊的具體功能籽孙,也就是這些方法怎么用。

現(xiàn)在我們可以把上面寫好的代碼放在一起火俄,以QQ郵箱為例:

現(xiàn)在我們已經(jīng)搞定了一半犯建,接下來我們就會開始構(gòu)建郵件的正文內(nèi)容,讓這個程序能跑起來瓜客。

我們就要用到構(gòu)建郵件內(nèi)容的email 模塊适瓦。學習email 模塊的過程我就不再展示了,請你自己動手谱仪。在這之前玻熙,有必要先回顧一下之前學習的渠道,以及學習的方式:帶著目的學習疯攒。

那我們就直接進行實操階段啦嗦随。email 模塊:也就是用來寫郵件內(nèi)容的模塊。這個內(nèi)容可以是純文本敬尺、HTML內(nèi)容枚尼、圖片贴浙、附件等多種形式

每種形式對應(yīng)的導入方式是這樣的:

from … import …語句上一關(guān)我們已經(jīng)學習過了姑原。與直接導入整個 smtplib 模塊(import smtplib)不同悬而,這里我們只是從模塊中導入一個或幾個函數(shù)的做法。

同樣锭汛,你可以復(fù)制上面的內(nèi)容到本地的編輯器上笨奠,按住 ctrl 點擊查看含義

請你按住ctrl同時點擊mime唤殴,你會看到一個名為init.py空文件般婆,這說明 email是其實是一個“包”

這就要談到“模塊”和“包”的區(qū)別了朵逝,模塊(module)一般是一個文件蔚袍,而包(package)是一個目錄,一個包中可以包含很多個模塊配名,可以說包是“模塊打包”組成的啤咽。

但為什么看到那個空文件,就能知道email是包呢渠脉?這是因為Python中的包都必須默認包含一個init.py的文件宇整。

init.py控制著包的導入行為。假如這個文件為空芋膘,那么我們僅僅導入包的話鳞青,就什么都做不了。所以直接import email是行不通的为朋。

所以臂拓,我們就需要使用from … import …語句,從email包目錄下的【某個文件】引入【需要的對象】习寸。比如從email包下的text文件中引入MIMEText方法胶惰。中文說起來有點復(fù)雜,看代碼就懂了:

下面融涣,我們先從【構(gòu)建純文本的郵件內(nèi)容】開始童番,也就是我們版本1.0的功能:發(fā)一封最簡單的一句話文本郵件。

通過簡單的學習威鹿,我們就能發(fā)現(xiàn)MIMEText()方法需要輸入三個參數(shù):文本內(nèi)容剃斧,文本類型和文本編碼

文本內(nèi)容忽你,我就寫一句最簡單的“send by python”吧幼东。

好,現(xiàn)在終于可以把用email構(gòu)建的正文內(nèi)容,用smtplib模塊發(fā)送啦根蟹。

我又要提醒你脓杉,在開始碼這段代碼之前,最好再梳理梳理代碼結(jié)構(gòu)简逮。這是我建議的結(jié)構(gòu):

也就是這樣:

我們在看別人代碼的時候球散,也可以尋找結(jié)構(gòu)清晰的代碼作為參考,這樣我們找到有用知識的概率也會提高散庶。

按照這個結(jié)構(gòu)蕉堰,代碼就能夠碼出來了。這是我的版本悲龟,你可以同樣在自己的編輯器上寫一寫屋讶。記得準備好 QQ 郵箱和授權(quán)碼(如果不是QQ郵箱,記得替換端口port參數(shù))须教,收件郵箱就寫你自己的郵箱:

你收到郵件了嗎皿渗?

如果發(fā)生報錯的話,也沒關(guān)系轻腺。這里我收集了幾種典型報錯信息:

ValueError: server_hostname cannot be an empty string or start with a leading dot.

看到報錯乐疆,不要慌,小場面贬养。在學習 Python 的過程當中诀拭,我們難免會遇到這種報錯,這并非壞事煤蚌,有報錯才有成長。當出現(xiàn)報錯的時候细卧,我們?nèi)?u>閱讀報錯尉桩,讀不懂就去搜索

直接在網(wǎng)絡(luò)搜索這個報錯信息贪庙,我們會得到結(jié)論:如果你的Python版本是3.7蜘犁,很可能發(fā)生這種報錯。因為Python 3.7修改了ssl.py止邮,導致smtplib.SMTP_SSL也連帶產(chǎn)生了問題这橙。

而解決方法也很簡單:

加入host參數(shù)(郵箱服務(wù)器地址后),這個問題應(yīng)該就迎刃而解了导披。

如果你用的是QQ以外的其他郵箱屈扎,也可能會出現(xiàn)一種報錯。比如利用我的企業(yè)郵箱的話撩匕,就會出現(xiàn)如下報錯信息:

smtplib.SMTPException: No suitable authentication method found

搜索后鹰晨,我們很快就會發(fā)現(xiàn),解決方案是:在登錄(login)之前調(diào)用starttls()方法就可以了。也就是在代碼中加入這樣一行:

這些問題基本上都能通過搜索解決模蜡。如果你搞不清楚是什么問題的話漠趁,試一試將端口參數(shù)改一下,使用默認端口25忍疾。

經(jīng)過一番纏斗闯传,現(xiàn)在你應(yīng)該可以去查收你用 Python 發(fā)出的第一封郵件了!

在收件箱卤妒,你看到的內(nèi)容大概是這樣的:

但是甥绿,現(xiàn)在還不能算是一封完整的郵件,沒有發(fā)件人信息荚孵,沒有主題妹窖,正文內(nèi)容太簡單......這就是我們接下來要干的事情:

【版本2.0:給自己發(fā)一封完整郵件】

我們先來豐富郵件頭:

郵件頭(header,沒錯它也叫header)是這一塊區(qū)域收叶,包括主題骄呼、發(fā)件人、收件人等信息:

現(xiàn)在你可以直接去搜索別人的代碼看看判没,請打開瀏覽器搜索“發(fā)郵件 python”并瀏覽查看其他人的代碼蜓萄,看和我們之前寫好的代碼存在哪些區(qū)別。

區(qū)別就在于澄峰,別人的代碼多了這幾行:

第一行代碼嫉沽,從email包引入Header()方法Header()是用來構(gòu)建郵件頭的俏竞。

標準郵件需要三個頭部信息:From , To 和 Subject 绸硕,第三到五行代碼就提供了這三個信息。

這里我們可以自定義魂毁,比如from發(fā)件人郵箱地址玻佩,to收件人郵箱地址,主題“python test”席楚。

現(xiàn)在收到郵件就有點不一樣了:

除了可以直接用郵箱地址之外咬崔,你還可以自定義內(nèi)容,比如:

接下來烦秩,我們要想想怎么豐富郵件內(nèi)容了垮斯。

原本郵件內(nèi)容是寫在這里:

如果你想要寫很長的內(nèi)容,建議先設(shè)置一個變量text用來放正文內(nèi)容只祠。

一般兜蠕,郵件正文需要換行,不想一大串文字直接顯示铆农,我們可以在正文內(nèi)容前后用'''牺氨,還記得三引號的用法吧狡耻!

之前也提到了,出于保護隱私的目的猴凹,我們可以把收發(fā)件人夷狰,和授權(quán)碼這些信息用input()變成需要輸入的模式。

在版本3.0中郊霎,也將在一些地方用到這樣的方式去改寫代碼沼头,讓整個程序更有“互動性”。

【版本3.0:群發(fā)完整郵件】

只要你搜索一下“Python 群發(fā)郵件”书劝,就有海量的信息供你參考进倍。我這里講三種群發(fā)的方式:

一,是將收件人信箱的變量設(shè)置成一個可以裝多個內(nèi)容的列表

需要注意的是购对,to_addrs變量也將作為參數(shù)被傳入Header方法中:

直接運行程序的話猾昆,這里就會發(fā)生錯誤:AttributeError: 'list' object has no attribute 'decode'

如果你有查看官方文檔的好習慣骡苞,那么你會發(fā)現(xiàn)這是因為Header接受的第一個參數(shù)的數(shù)據(jù)類型必須要是字符串或者字節(jié)垂蜗,列表不能解碼

也就是說解幽,我們要將to_addrs變成一個字符串贴见,怎么做呢?好像沒有學過躲株?其實片部,我們只需要對這行代碼做一個這樣的操作:

是否覺得眼熟?在關(guān)于文件讀寫的關(guān)卡中霜定,有一個哈利波特的課堂小練習档悠,其中我們簡單地提到了join()函數(shù),它的功能是把字符串合并

join()的用法是str.join(sequence)望浩,str代表在這些字符串之中你要用什么字符串來連接站粟,你可以用逗號,空格曾雕,下劃線等等。要將列表的元素合并助被,當然我們就直接使用逗號來連接了剖张。

來打印一下轉(zhuǎn)換前后的數(shù)據(jù)類型,驗證一下揩环。

這里有個小細節(jié)需要注意:我們將收件人變量名從to_addr改成了復(fù)數(shù)to_addrs之后搔弄,后面用到這個變量的地方,也要進行修改丰滑!

第一種方式顾犹,我們就講到這里倒庵。

第二種方法是采用詢問“是否繼續(xù)輸入郵箱地址”的方式,并用while循環(huán)來實現(xiàn)多個收件人的功能炫刷。

由于我們要存儲輸入的內(nèi)容擎宝,供發(fā)郵件的時候使用。所以需要定義一個空列表to_addrs浑玛,用來存放收件人郵箱地址绍申。輸入郵箱地址的時候,地址會被追加寫進列表顾彰。

因為循環(huán)次數(shù)不固定极阅,所以我們選擇while循環(huán)來做。我的這段代碼是這樣的涨享,加了一個print()函數(shù)確認結(jié)果

除了收件人筋搏,我們把發(fā)件人和授權(quán)碼也改成input模式。

接下來是最后一種方法:

用上一關(guān)學習的csv模塊厕隧,將收件人郵箱寫入csv文件奔脐,在發(fā)郵件時讀取csv文件。

將郵箱地址寫入csv模塊的方法是write()栏账,步驟是:1.引入csv模塊帖族;2.提供需要寫入csv文件的數(shù)據(jù),3.建文件并寫入挡爵。

第一行竖般,引入模塊。第四行是等待寫入csv文件的數(shù)據(jù)茶鹃。

但是我們沒有這樣的文件涣雕,所以還需要新建一個to_addrs.csv文件。我們使用的是with語句新建文件闭翩,這樣做的好處是:到達語句末尾時挣郭,會自動關(guān)閉文件,不需要close()疗韵。

緊接著兑障,我們定義了一個變量writer進行寫入,將剛才的文件變量傳進來蕉汪。

之后就是進行數(shù)據(jù)寫入流译,寫入的方法是writerow()。通過遍歷列表data將數(shù)據(jù)一行行寫到了to_addrs.csv文件中者疤。

讀取的過程就異曲同工了福澡。利用的是read()方法。步驟是:1.引入csv模塊驹马;2.打開csv文件革砸;3.讀取需要的數(shù)據(jù)除秀。

row[1]表示csv文件中第1列的數(shù)據(jù)。想一想:wufeng和kaxi屬于第0列的數(shù)據(jù)算利,郵箱地址則屬于第1列的數(shù)據(jù)册踩,所以第1列數(shù)據(jù)才是我們需要的!

接下來要做的就是把取出來的內(nèi)容賦值給變量to_addrs笔时,并在發(fā)送郵件時使用棍好。先提個醒,注意哪些代碼需要在for循環(huán)內(nèi)部縮進允耿。

如果報錯(報錯是很正常的事情啦)借笙,記得排查我們之前說過的幾個問題。

雖然讀取稍微有點麻煩较锡,但如果我們事先建了這樣一個存儲郵箱的csv文件业稼,之后就可以一直復(fù)用它。從長期來看蚂蕴,還是利大于弊的低散。

而且在更高級的Python爬蟲精進課程里面,我們也同樣會用到csv模塊,早點熟悉它會更好。

此外蛙酪,你還可以為這個程序加一段異常處理代碼,也就是try...except...語句來幫助你更好地處理你遇到的問題引镊。

在這樣與現(xiàn)實生活有關(guān)的項目中,往往會出現(xiàn)很多意想不到的障礙篮条,比如能否順利地拿到郵箱授權(quán)碼弟头,能否找到可用的端口,又比如偷懶把py文件直接命名為email.py而導致的報錯等等涉茧。

不過赴恨,正因為有太多人經(jīng)歷了這樣的障礙,所以當你輸入關(guān)鍵詞搜索伴栓,就會發(fā)現(xiàn)這些都是前人走過的路伦连,而他們的踴躍提問或分享,成為了讓你走得更快的助推器钳垮。

到此除师,我們就學習完了新的模塊,更重要的是扔枫,希望你掌握了學習的方法:懂得從需求出發(fā)尋找解決方案,也知道應(yīng)該去哪里學習锹安,并掌握了學習的方式短荐。

希望你在碼代碼的過程中倚舀,邏輯結(jié)構(gòu)越來越清晰,而且不那么害怕報錯了忍宋,最后總能一步步克服困難痕貌。

掌握學習模塊的方法的你,已經(jīng)在事實上完成Python“入門”糠排。你能在互聯(lián)網(wǎng)上找尋很多有用的東西舵稠,幫助自己完成想做的項目。

或許你會產(chǎn)生疑問:用現(xiàn)成的郵件軟件不好嗎入宦?用別人寫好的代碼不好嗎哺徊?為什么一定要自己學習。

這個問題乾闰,可以從實用性前瞻性兩個角度來回答落追。

從實用性上來說,單純地懂得使用python發(fā)郵件并沒有什么了不起涯肩。但它是一塊磚轿钠,它能和別的磚組合在一起,構(gòu)建成摩天大廈病苗。最簡單的例子疗垛,是我們之后可以利用:爬蟲網(wǎng)絡(luò)郵件的組合,做出更多有趣的事硫朦。

再者贷腕,即便是同塊磚,反復(fù)地使用也能帶來巨大的效率提升:如果要給一百人發(fā)送一百個內(nèi)容不同的郵件阵幸,你就可以去寫一個發(fā)郵件的程序花履,配合一些文件讀寫循環(huán)的操作,非常短時間地完成它挚赊。

前瞻性的角度來回答诡壁,就要講個故事。

在上個世紀有一位年輕人荠割,也寫了類似這樣一個發(fā)郵件的小程序妹卿,就像今天的你一樣。

后來蔑鹦,他把這個功能做了好多升級:不能只發(fā)郵件啊夺克,還得收郵件,存儲郵件嚎朽,日歷提醒系統(tǒng)铺纽,訂閱系統(tǒng)……最后,他把這些功能打包成一個電子郵件客戶端哟忍。

因為這個電子郵件客戶端太好用狡门,后來這個軟件被一家更大的公司收購陷寝。這個年輕人,此時已經(jīng)三十多歲其馏,他也一并加入這家公司凤跑,負責這家公司的郵箱業(yè)務(wù)。

時過境遷叛复,來到2010年仔引,移動互聯(lián)網(wǎng)時代剛剛拉開帷幕。做久郵箱業(yè)務(wù)的他褐奥,敏銳地感知到:在新的時代咖耘,人們使用的通訊方式也會迎來新的變革。而這種新的通訊方式抖僵,在許多地方和郵件都有著相通之處……

后來的故事鲤看,大家都知道了。他的名字叫做張小龍耍群,他做出來的新產(chǎn)品义桂,名字叫微信

上面提到的第二家公司是騰訊蹈垢。他當時所負責的郵箱業(yè)務(wù)慷吊,就是我們這節(jié)課程里所使用的 QQ 郵箱

早期的 QQ 郵箱曹抬,運行笨重而緩慢溉瓶。2006年底,張小龍率領(lǐng)團隊用精簡谤民、輕便的思路設(shè)計新版本堰酿。2007年,新版的 QQ 郵箱上線张足,張小龍帶領(lǐng)團隊也開發(fā)了許多創(chuàng)新應(yīng)用触创,將QQ郵箱打造為簡潔易用、安全穩(wěn)定的郵箱为牍。2008年哼绑,QQ郵箱在騰訊公司獲得“七星級產(chǎn)品獎”,張小龍的團隊也獲得騰訊的年度創(chuàng)新大獎碉咆,受到廣大用戶的歡迎抖韩。直至今天,它在中國依然是使用人數(shù)最多的郵箱產(chǎn)品疫铜。

上面提到的第一家公司是博大公司茂浮,張小龍賣出的產(chǎn)品是foxmail

而這一切,最開始都是從一行類似于'qqmail.sendmail()'的代碼開始的席揽。這和你今天所做的事情佃乘,并沒有本質(zhì)區(qū)別。再加一些存儲功能驹尼、收郵件功能……借助一個圖形界面的模塊,你也能寫出一個最原始版本的foxmail庞呕。

【課后練習】——自制動態(tài)二維碼

練習目標:

我們會通過今天的作業(yè)新翎,學習一個新的模塊:MyQR,制作一個動態(tài)二維碼住练。?

練習要求:

在昨天的練習里地啰,你已經(jīng)可以通過自己的學習,完成代碼的升級讲逛。

所以亏吝,今天我們不妨多做些新的嘗試。

這次的練習盏混,沒有提示蔚鸥,沒有準備好的網(wǎng)址。

需求很明確:請你在本地編輯器(如vscode许赃、Pycharm)止喷,用 Python 制作一個動態(tài)二維碼。

所以混聊,請你運用在課堂上看到的提示和知識弹谁,去思考,去搜索句喜,去學習预愤,完成今天的練習。

【了解新模塊】

請去了解一下咳胃,要用什么模塊來完成這個需求植康。

不用擔心,這個模塊并不難拙绊。

這一個步驟你可以給自己制定一個目標:

讀懂一個用 Python 制作動態(tài)二維碼的代碼向图。

【代碼實操】

你應(yīng)該已經(jīng)知道了這個模塊是:MyQR,也能讀懂相關(guān)的代碼标沪。

請你自學相關(guān)模塊知識后榄攀,自行下載一個gif,然后在本地編輯器(如vscode金句、Pycharm)完成代碼吧檩赢。

對了,不要忘了先安裝myqr模塊,Windows終端里運行'pip install myqr'贞瞒,Mac終端運行'pip3 install myqr'

【參考代碼】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偶房,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子军浆,更是在濱河造成了極大的恐慌棕洋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乒融,死亡現(xiàn)場離奇詭異掰盘,居然都是意外死亡,警方通過查閱死者的電腦和手機赞季,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門愧捕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人申钩,你說我怎么就攤上這事次绘。” “怎么了撒遣?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵邮偎,是天一觀的道長。 經(jīng)常有香客問我愉舔,道長钢猛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任轩缤,我火速辦了婚禮命迈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘火的。我一直安慰自己壶愤,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布馏鹤。 她就那樣靜靜地躺著征椒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪湃累。 梳的紋絲不亂的頭發(fā)上勃救,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音治力,去河邊找鬼蒙秒。 笑死,一個胖子當著我的面吹牛宵统,可吹牛的內(nèi)容都是我干的晕讲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瓢省!你這毒婦竟也來了弄息?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤勤婚,失蹤者是張志新(化名)和其女友劉穎摹量,沒想到半個月后馒胆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年液兽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片四啰。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡粗恢,死狀恐怖柑晒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眷射,我是刑警寧澤匙赞,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站妖碉,受9級特大地震影響涌庭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜欧宜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一坐榆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冗茸,春花似錦席镀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至麻蹋,卻和暖如春跛溉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工芳室, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留专肪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓堪侯,卻偏偏與公主長得像嚎尤,于是被迫代替她去往敵國和親芽死。 傳聞我的和親對象是個殘疾皇子关贵,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355