關於郵件傳送,只看這一篇就夠了!!!
阿新 • • 發佈:2020-07-28
# 關於郵件傳送,只看這一篇就夠了!!!
## 郵件傳送:使用smtplib、email庫來發送郵件
## 1.傳送郵件的步驟:
![](https://img2020.cnblogs.com/blog/2074124/202007/2074124-20200728204918420-749746041.png)
## 2.具體步驟實施
### 1.以qq郵箱為例,先來看第0步:連線伺服器。
連線伺服器需要用到`smtplib`庫。為什麼叫這個名字呢?其實,`SMTP`代表簡單郵件傳輸協議,相當於一種計算機之間發郵件的約定。具體怎麼用`smtplib`庫來連線伺服器:
```python
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.使用郵箱賬號密碼登入
通過賬號和密碼登入郵箱;填寫收件人
1. 來看登入郵箱的程式碼:
```python
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/,登入你的郵箱。然後點選位於頂部的【設定】按鈕,選擇【賬戶設定】,然後下拉到這個位置。
![](C:\Users\Administrator\Desktop\郵件1.png)![](https://img2020.cnblogs.com/blog/2074124/202007/2074124-20200728205021766-711702131.png)
就像上面的一樣,把首個SMTP服務開啟。這時,QQ郵箱會提供給你一個授權碼,注意保護好你的授權碼:
![](https://img2020.cnblogs.com/blog/2074124/202007/2074124-20200728205052820-1287688038.png)
接下來,在你使用SMTP服務登入郵箱時,就可以輸入這個授權碼作為密碼登入了。
### 3.填寫收件人、主題、撰寫正文
填寫主題和撰寫正文,在這裡需要用到`email`庫。來看用法:
```python
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']`是什麼意思呢?其實,字典和類在結構上,有相似之處。請看下圖:![](C:\Users\Administrator\Desktop\郵件3.png)![](https://img2020.cnblogs.com/blog/2074124/202007/2074124-20200728205241279-487397006.png)
字典裡面的元素是【鍵】和【值】一一對應,而類裡面的【屬性名】和【屬性】也是一一對應的。我們可以根據字典裡的【鍵】取到對應的【值】,同樣的,也可以根據類裡面的【屬性名】取到【屬性】。所以`message['Subject']`就代表著根據MIMEText類裡面的`Subject`的屬性名取到該屬性。需要注意的是,不是每一個類都可以這樣訪問其屬性的,之所以能這樣訪問是因為這個`MIMEText`的類實現了這個功能。所以,`message['Subject'] = Header(subject, 'utf-8')` 就是在為`message['Subject']`這個屬性賦值
### 4.傳送郵件和退出郵箱
```python
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`語句來實現。
+ ```python
try:
qqmail.sendmail(sender, receiver, message.as_string())
print ('郵件傳送成功')
except:
print ('郵件傳送失敗')
qqmail.quit()
```
### 5.完整的程式碼
```python
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()
#以上為傳送郵件和退出郵箱
```