關於郵件發送,只看這一篇就夠了!!!
郵件發送:使用smtplib、email庫來發送郵件
1.發送郵件的步驟:
2.具體步驟實施
1.以qq郵箱為例,先來看第0步:連接服務器。
連接服務器需要用到smtplib
庫。為什么叫這個名字呢?其實,SMTP
代表簡單郵件傳輸協議,相當於一種計算機之間發郵件的約定。具體怎么用smtplib
庫來連接服務器:
import smtplib
#smtplib是python的一個內置庫,所以不需要用pip安裝
mailhost='smtp.qq.com'
#把qq郵箱的服務器地址賦值到變量mailhost上,地址需要是字符串的格式。
qqmail = smtplib.SMTP()
#實例化一個smtplib模塊里的SMTP類的對象,這樣就可以SMTP對象的方法和屬性了
qqmail.connect(mailhost,25)
#連接服務器,第一個參數是服務器地址,第二個參數是SMTP端口號
-
解釋一下:第1行代碼是引入庫,第5行代碼"mailhost='smtp.qq.com'"是qq郵箱的服務器地址,這個地址是可以通過搜索引擎查到的。
-
第9行代碼"qqmail = smtplib.SMTP()"是實例化了一個
smtplib
里的SMTP
對象; -
第13行代碼"qqmail.connect(mailhost,25)"是用SMTP對象的
connect()
方法連接服務器,第一個參數是獲取到的服務器地址,第二個參數是SMTP端口號——25
。
端口號的選擇不是唯一的,但是25
是一個最簡單、最基礎的端口號,所以我們填25
。
2.使用郵箱賬號密碼登錄
通過賬號和密碼登錄郵箱;填寫收件人
-
來看登錄郵箱的代碼:
import smtplib #smtplib是python的一個內置庫,所以不需要用pip安裝 mailhost='smtp.qq.com' #把qq郵箱的服務器地址賦值到變量mailhost上 qqmail = smtplib.SMTP() #實例化一個smtplib模塊里的SMTP類的對象,這樣就可以SMTP對象的方法和屬性了 qqmail.connect(mailhost,25) #連接服務器,第一個參數是服務器地址,第二個參數是SMTP端口號。 sender = input('請輸入你的郵箱:') #獲取郵箱賬號 password = input('請輸入你的密碼:') #獲取郵箱密碼 qqmail.login(sender,password) #登錄郵箱,第一個參數為郵箱賬號,第二個參數為郵箱密碼 receiver=input('請輸入收件人的郵箱:') #獲取收件人的郵箱
-
解釋一下從14行新增的代碼"sender = input('請輸入你的郵箱:')":第14行是用
input()
獲取郵箱賬號。第17行是用input()
獲取郵箱密碼,但注意了,這里可不是你平時登錄郵箱的密碼!這個密碼需要我們去到這里獲取:請打開https://mail.qq.com/,登錄你的郵箱。然后點擊位於頂部的【設置】按鈕,選擇【賬戶設置】,然后下拉到這個位置。
-
就像上面的一樣,把首個SMTP服務開啟。這時,QQ郵箱會提供給你一個授權碼,注意保護好你的授權碼:
接下來,在你使用SMTP服務登錄郵箱時,就可以輸入這個授權碼作為密碼登錄了。
3.填寫收件人、主題、撰寫正文
填寫主題和撰寫正文,在這里需要用到email
庫。來看用法:
from email.mime.text import MIMEText
from email.header import Header
#引入Header和MIMEText模塊
content=input('請輸入郵件正文:')
#輸入你的郵件正文
message = MIMEText(content, 'plain', 'utf-8')
#實例化一個MIMEText郵件對象,該對象需要寫進三個參數,分別是郵件正文,文本格式和編碼
subject = input('請輸入你的郵件主題:')
#用input()獲取郵件主題
message['Subject'] = Header(subject, 'utf-8')
#在等號的右邊,是實例化了一個Header郵件頭對象,該對象需要寫入兩個參數,分別是郵件主題和編碼,然后賦值給等號左邊的變量message['Subject']
解釋一下:
- 第1行和第3行代碼是引入了
email
庫中的MIMEText
模塊和Header
模塊。 - 第9行代碼"content=input('請輸入郵件正文:')"是用
input()
函數獲取郵件正文,第13行代碼是實例化一個MIMEText
的郵件對象,這樣我們就構造了一個純文本郵件了。 - 這個
MIMEText
對象有三個參數,一個是郵件正文;另一個是文本格式,一般設置為plain
純文本格式(當然如果郵件內容中帶有格式,例如表格,添加一些代碼就可以了);最后一個是編碼,設置為utf-8
,因為utf-8是最流行的萬國碼。 - 第17行代碼"subject = input('請輸入你的郵件主題:')",是用
input()
函數獲取郵件主題,第21行代碼"message['Subject'] = Header(subject, 'utf-8')"比較重要,我們仔細講解一下:message['Subject'] = Header(subject, 'utf-8')
,等號右邊是實例化了一個Header
郵件頭對象,該對象需要寫入兩個參數,分別是郵件主題和編碼。等號左邊的message['Subject']
的變量是一個a['b']
的代碼形式,它長得特別像字典根據鍵取值的表達,但是這里的message
是一個MIMEText
類的對象,並不是一個字典,那message['Subject']
是什么意思呢?其實,字典和類在結構上,有相似之處。請看下圖:
字典里面的元素是【鍵】和【值】一一對應,而類里面的【屬性名】和【屬性】也是一一對應的。我們可以根據字典里的【鍵】取到對應的【值】,同樣的,也可以根據類里面的【屬性名】取到【屬性】。所以message['Subject']
就代表着根據MIMEText類里面的Subject
的屬性名取到該屬性。需要注意的是,不是每一個類都可以這樣訪問其屬性的,之所以能這樣訪問是因為這個MIMEText
的類實現了這個功能。所以,message['Subject'] = Header(subject, 'utf-8')
就是在為message['Subject']
這個屬性賦值
4.發送郵件和退出郵箱
import smtplib
#smtplib是python的一個內置庫,所以不需要用pip安裝
mailhost='smtp.qq.com'
#把qq郵箱的服務器地址賦值到變量mailhost上
qqmail = smtplib.SMTP()
#實例化一個smtplib模塊里的SMTP類的對象,這樣就可以SMTP對象的方法和屬性了
qqmail.connect(mailhost,25)
#連接服務器,第一個參數是服務器地址,第二個參數是SMTP端口號
#以上,皆為連接服務器的代碼
sender = input('請輸入你的郵箱:')
#獲取郵箱賬號
password = input('請輸入你的密碼:')
#獲取郵箱密碼
qqmail.login(sender,password)
#登錄郵箱,第一個參數為郵箱賬號,第二個參數為郵箱密碼
receiver=input('請輸入收件人的郵箱:')
#獲取收件人的郵箱
from email.mime.text import MIMEText
from email.header import Header
#引入Header和MIMEText模塊
content=input('請輸入郵件正文:')
#輸入你的郵件正文
message = MIMEText(content, 'plain', 'utf-8')
#實例化一個MIMEText郵件對象,該對象需要寫進三個參數,分別是郵件正文,文本格式和編碼
subject = input('請輸入你的郵件主題:')
#用input()獲取郵件主題
message['Subject'] = Header(subject, 'utf-8')
#在等號的右邊,是實例化了一個Header郵件頭對象,該對象需要寫入兩個參數,分別是郵件主題和編碼,然后賦值給等號左邊的變量message['Subject']
qqmail.sendmail(sender, receiver, message.as_string())
#發送郵件,調用了sendmail()方法,寫入三個參數,分別是發件人,收件人,和字符串格式的正文
qqmail.quit()
#退出郵箱
解釋一下:
-
第65行代碼"qqmail.sendmail(sender, receiver, message.as_string())"的意思是調用
sendmail()
發送郵件,括號里面有三個參數,第1個是發件人的郵箱地址,第2個是收件人的郵箱地址,第3個是正文,但必須是字符串格式,所以用as_string()
函數轉換了一下。 -
但是我們希望發送成功后能顯示“郵件發送成功”,失敗的時候能提示我們“郵件發送失敗”,可以使用
try
語句來實現。 -
try: qqmail.sendmail(sender, receiver, message.as_string()) print ('郵件發送成功') except: print ('郵件發送失敗') qqmail.quit()
5.完整的代碼
import smtplib
from email.mime.text import MIMEText
from email.header import Header
#引入smtplib、MIMETex和Header
mailhost='smtp.qq.com'
#把qq郵箱的服務器地址賦值到變量mailhost上,地址應為字符串格式
qqmail = smtplib.SMTP()
#實例化一個smtplib模塊里的SMTP類的對象,這樣就可以調用SMTP對象的方法和屬性了
qqmail.connect(mailhost,25)
#連接服務器,第一個參數是服務器地址,第二個參數是SMTP端口號。
#以上,皆為連接服務器。
sender = input('請輸入你的郵箱:')
#獲取郵箱賬號,為字符串格式
password = input('請輸入你的密碼:')
#獲取郵箱密碼,為字符串格式
qqmail.login(sender,password)
#登錄郵箱,第一個參數為郵箱賬號,第二個參數為郵箱密碼
#以上,皆為登錄郵箱。
receiver=input('請輸入收件人的郵箱:')
#獲取收件人的郵箱。
content=input('請輸入郵件正文:')
#輸入你的郵件正文,為字符串格式
message = MIMEText(content, 'plain', 'utf-8')
#實例化一個MIMEText郵件對象,該對象需要寫進三個參數,分別是郵件正文,文本格式和編碼
subject = input('請輸入你的郵件主題:')
#輸入你的郵件主題,為字符串格式
message['Subject'] = Header(subject, 'utf-8')
#在等號的右邊是實例化了一個Header郵件頭對象,該對象需要寫入兩個參數,分別是郵件主題和編碼,然后賦值給等號左邊的變量message['Subject']。
#以上,為填寫主題和正文。
try:
qqmail.sendmail(sender, receiver, message.as_string())
print ('郵件發送成功')
except:
print ('郵件發送失敗')
qqmail.quit()
#以上為發送郵件和退出郵箱