複習一下上一關的内容 ,模塊的相關知識,以及學習模塊的方法(2圖)
得了,我們可以開始今天的項目實操了
1. 明确項目目标
這一關的主題,其實最早是來源于往期學員的一個問題:學員小賈是一名外貿人員,每到了節假日,要給客戶發祝福郵件。
雖然現在群發郵件比較方便,但還是要每次手動添加收件人的郵箱。小賈想:要是能夠自動發送郵件給這些人就好了。他找到了助教求助。
之前跟你聊過,希望學習Python知識,是能夠幫助大家解決實際問題的。而小賈的問題,就是一個可以完美地被Python解決的需求,而且在職場中也是一個普遍存在的需求。
為了完成這個項目呢,我們要學會自學新的模塊
2. 分解過程,拆解項目
我們可以把這個項目拆解成三個版本,各個版本功能逐步完善 。如圖示
3. 逐步執行,代碼實現
3.1 版本1.0:學習模塊,發一封簡單郵件
3.1.1搜索模塊資料
在編程世界中,我們不需要什麼知識都一把抓,而是遇到問題之後,産生了某種需求,才會去找對應的解決方案。
這個方案可能是某個模塊,也可能是某個函數~
經過搜索大法後,我們可以知道需要實現這一版本的功能需要用到python的兩個内置模塊 smtplib,email
可以初步畫一下這個簡單的結構圖 ,如圖示
這裡在搜索的時候跟你們說個技巧吧,比如你想要找到stmplib 這個 模塊,那麼你搜索‘stmplib python’,如果你英文足夠好的話,那你可以去看官方文檔,如果你隻喜歡看中文的話,我建議你去這個網站去搜索資料 ‘CSDN博客’,這個網站上有最優秀和經驗最豐富的碼師可以交流,他們的很多博客也可以借鑒、參考。
這是我費了很大力氣找到的smtplib的方法 ,如圖示
我們可以看到,為了減少變量重複出現的次數,一般将 smtplib.SMTP() 賦值給server,我本身也認同這樣的辦法
這裡給大家簡單科普一下,SMTP (Simple Mail Transfer Protocol)翻譯過來是“簡單郵件傳輸協”的意思,SMTP 協議是由源服務器到目的地服務器傳送郵件的一組規則。
可以簡單理解為:我們需要通過SMTP指定一個服務器,這樣才能把郵件送到另一個服務器。
第四行代碼,就是幹這個工作的,連接(connect)指定的服務器。
host是指定連接的郵箱服務器,你可以指定服務器的域名。通過搜索“xx郵箱服務器地址”,就可以找到。
port 是“端口”的意思。端口屬于計算機網絡知識裡的内容,你可以自行搜索了解,現在我們隻要知道它是一個【整數】即可。
我們需要指定SMTP服務使用的端口号,一般情況下SMTP默認端口号為25。
風變編程官網的服務器名稱是mail.forchange.tech,端口是587。
3.1.2 用QQ做案例講解
因為一般二十幾歲的年輕人使用最多的還是qq郵箱,所以我會以QQ郵箱作為講解例子
QQ 郵箱采用的加密方式是ssl,我們需要寫成這樣:如圖示
然後接下來我要講一個tips,其實我們一般qq郵箱默認是關閉SMTP服務的,你需要自行手動開啟,進入你的QQ郵箱後,點擊位于頂部的【設置】按鈕,選擇【賬戶設置】,進入到這個界面,如圖示,藍色方框的那個要保持開啟,照着他的流程做便可以開啟
成功開啟以後,網頁會給你一個授權碼,把它保存下來,接下來的代碼中,發郵件的時候用到的是授權碼,而不是你的QQ密碼了。它是4*4=16位的,也就是**** **** **** **** 這樣的,還有不要随意洩露,不然的話可能會被癫佬拿去打廣告。
好了,一步一步講解代碼
login是登錄的意思,也就是登錄你指定的服務器用的,需要輸入兩個參數:登錄郵箱和授權碼。如圖示
把兩個參數放在最前面。這部分的代碼我們也可以寫出來了:如圖示
第六行代碼sendmail是“發送郵件”的意思,是發送郵件用的,sendmail()方法需要三個參數:發件人,收件人和郵件内容。如圖示
msg.as_string()是一個字符串類型:as_string()是将發送的信息msg變為字符串類型。最後一行代碼,quit是“退出”的意思,就是退出服務器。
3.1.3 對smtplib 做一個初步總結,如圖示
3.1.4 email 模塊
email 模塊:也就是用來寫郵件内容的模塊。這個内容可以是純文本、HTML内容、圖片、附件等多種形式。如圖示
每種形式對應的導入方式是這樣的:如圖示
這裡再次給大家科普一下,
你可以複制上面的内容到本地的編輯器上,按住 ctrl 點擊查看含義。
請你按住ctrl同時點擊mime,你會看到一個名為init.py的空文件,這說明 email是其實是一個“包”。當然,并不是“包治百病”的那個“包”。
這就要談到“模塊”和“包”的區别了,模塊(module)一般是一個文件,而包(package)是一個目錄,一個包中可以包含很多個模塊,可以說包是“模塊打包”組成的。
但為什麼看到那個空文件,就能知道email是包呢?這是因為Python中的包都必須默認包含一個init.py的文件。
init.py控制着包的導入行為。假如這個文件為空,那麼我們僅僅導入包的話,就什麼都做不了。所以直接import email是行不通的。
所以,我們就需要使用from … import …語句,從email包目錄下的【某個文件】引入【需要的對象】。比如從email包下的text文件中引入MIMEText方法。中文說起來有點複雜,看代碼就懂了:如圖示
通過簡單的學習,我們就能發現MIMEText()方法需要輸入三個參數:文本内容,文本類型和文本編碼。如圖示
文本類型和文本編碼,我們默認用plain和utf-8。文本内容,我就寫一句最簡單的“send by python”吧,你可以寫自己想寫的話啦。如圖示
3.1.5綜合兩個模塊的代碼結構為,如圖示
那麼細緻化結構接就是,如圖示
3.1.6 那麼版本1.0 的代碼為,(帶注釋)兩圖
這裡再給大家科普一下啊,就是如果你的python版本 是3.7 以上的,可能會報錯,
ValueError: server_hostname cannot be an empty string or start with a leading dot.
因為Python 3.7修改了ssl.py,導緻smtplib.SMTP_SSL也連帶産生了問題。那你需要這樣子做,如圖示
經過九牛二虎之力,我終于是收到了人生第一封由python發來的QQ郵件,如圖示
說實話,自己還感覺挺不可思議的
3.2 版本2.0:給自己發一封完整郵件
3.2.1 完整的郵件就是說,增加多兩個功能,完善一下。如圖示
我們要增加這幾行代碼,如圖示
第一行代碼,從email包引入Header()方法。Header()是用來構建郵件頭的。标準郵件需要三個頭部信息:From , To 和 Subject ,第三到五行代碼就提供了這三個信息。這裡我們可以自定義,比如from發件人郵箱地址,to收件人郵箱地址,主題“python test”。
等我們增加了郵件頭的代碼後,收到郵件會有所不同,如圖示
而且你還可以定義,如圖示
原本郵件内容是寫在這裡:如圖示
如果你想要寫很長的内容,建議先設置一個變量text用來放正文内容。如圖示
3.2.2 所以版本2.0 的最終代碼為,如圖示(3圖)
3.3 版本3.0:群發完整郵件
3.3.1 這裡主要講解一下,用python群發郵件的三種方法,如圖示
一,是将收件人信箱的變量設置成一個可以裝多個内容的列表:需要注意的是,to_addrs變量也将作為參數被傳入Header方法中:
直接運行程序的話,這裡就會發生錯誤:AttributeError: list object has no attribute decode。
我們要将to_addrs變成一個字符串,将列表變成一個字符串,這個時候我們就要用到join()函數了
一分鐘回顧一下join()函數的用法,大家看案例代碼 ,代碼以及運行結果如圖示
join()的用法是str.join(sequence)
二,接下來是while循環,代碼以及運行結果如圖示
三,将郵箱地址寫入csv模塊的方法是write(),步驟是:1.引入csv模塊;2.提供需要寫入csv文件的數據,3.建文件并寫入。代碼如圖示
好了,關于python發郵件的全部知識就講解到這了。
4. 1 第17關課後練習-自制二維碼
練習介紹
練習目标
我們會通過今天的作業,學習一個新的模塊:MyQR,制作一個動态二維碼。
練習要求
在昨天的練習裡,你已經可以通過自己的學習,完成代碼的升級。
所以,今天我們不妨多做些新的嘗試。
這次的練習,沒有提示,沒有準備好的網址。
需求很明确:請你在本地編輯器(如vscode、Pycharm),用 Python 制作一個動态二維碼。
所以,請你運用在課堂上看到的提示和知識,去思考,去搜索,去學習,完成今天的練習。
代碼實操
你應該已經知道了這個模塊是:MyQR,也能讀懂相關的代碼。
請你自學相關模塊知識後,自行下載一個gif,然後在本地編輯器(如vscode、Pycharm)完成代碼吧。
因為系統裡無法展示最後的動态二維碼,當你在本地編輯器完成代碼并運行成功後,直接點擊右側的運行進入下一步即可。
對了,不要忘了先安裝myqr模塊,Windows終端裡運行pip install myqr,Mac終端運行pip3 install myqr
示例代碼以及運行結果如圖示(2圖)
這個生成的二維碼就是風變編程官網的鍊接
4.2 進階練習-絕對值得多種求法
練習介紹
練習目标:
通過這個練習,你至少可以用3種方法去求某個數的絕對值。
練習要求:
請你通過搜索和步驟中的提示,用不同的方法求絕對值。
建議将其封裝成函數,如“abs_value1()”。
——Directly made by 潛·2ⁿ·index-crossing
,