關於郵件發送,只看這一篇就夠了!!!

  • 2020 年 7 月 28 日
  • 筆記

關於郵件發送,只看這一篇就夠了!!!

郵件發送:使用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.使用郵箱帳號密碼登錄

通過帳號和密碼登錄郵箱;填寫收件人

  1. 來看登錄郵箱的程式碼:

    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()獲取郵箱密碼,但注意了,這裡可不是你平時登錄郵箱的密碼!

      這個密碼需要我們去到這裡獲取:請打開//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()

#以上為發送郵件和退出郵箱
Tags: