Python實現郵件發送功能的方法詳解

郵件自動化篇章所需的新模塊:

smtplib 郵件協議與發送模塊

email 內容定義模塊

schedule 定時模塊

smtplib 與 email 模塊 可以幫助我們正常的發送郵件; schedule 模塊可以幫助我們定時發送郵件,比如工資郵件等需要固定時間發送的郵件

利用 python 發送普通郵件

認識發送郵件流程

這裡簡單描述下發郵件的過程(說實話,這一步我有點不想寫)

第一步:登錄郵箱

第二步:書寫郵件接受者的郵箱

第三步:書寫郵件標題與內容(有的時候還需要添加附件)

第四步:發送郵件

認識郵件協議

  • smtp:郵件發送的協議
  • pop3:郵件接收的協議

什麼是協議?

協議就是一種規則,其已經被底層網絡封裝好。無需關心它的具體規則是什麼,直接使用上層工具即可。

比如發送郵件這個場景,當我們使用 smtp 協議發送郵件時。網絡發現是 smtp 協議,它就知道這是一封要發送出去的郵件;同樣 pop3 也是一樣的,當網絡發現這是 pop3 協議 就知道這是一封要接收的郵件。

smtplib 模塊

smtplib 模塊是 python 中 發送郵件的很重要的模塊之一。

創建協議對象:

smptObj = smptlib.SMTP() 通過 smptlib.SMTP() 生成 smpt 協議對象

創建鏈接:

smptObj.connect(smpt服務器地址, 25) 通過 connect(服務器IP地址, 端口號),smpt服務默認端口號為 25

登錄驗證:

smptObj.login(mail_user, mail_password) 通過 login(mail_user, mail_password) 傳入郵箱名稱、登錄密碼,完成驗證。(註意:部分郵箱服務器這裡傳入的是口令而不是登錄密碼[也叫做授權碼],在郵箱的設置裡面查看)

發送郵件:

smptObj.sendmail(sender, receivers, message) 通過 sendmail(sender, receivers, message) 傳入發送者的郵箱、接收者的郵箱、郵件內容即可完成發送郵件的動作。

PS:這裡可以看到 "接收者的郵箱是 'receivers' 復數" ,所以 "接收者郵箱" 是一個數組、列表,可以發送給多個人; 消息內容的 "message" 是消息對象的加密字符串

email 包

email包 有兩個比較常用的函數:

函數名 參數 說明
MIMEText 郵件內容、郵件類型、編碼格式 定義郵件發送內容的對象
Header 各類信息、編碼格式 將各類信息定義成對象,比如標題等。

PS:上文提到的 ""message" 是消息對象的加密字符串" 就是通過 "MIMEText" 加密生成的

發送郵件小案例

代碼示例如下:

# coding:utf-8

import smtplib

from email.mime.text import MIMEText
from email.header import Header

'''
第三方的 smpt [腳本中涉及的郵箱地址都是假的,請使用自己的真實郵箱地址進行測試]
'''

mail_host = "smtp.sina.com"     # 設置郵箱服務器
mail_user = "conan868242"       # 設置自己的郵箱
mail_pass = "cb997b01a87232b2"  # 這裡就是郵箱的口令,也就是授權碼;不是密碼。

sender = "[email protected]"     # 定義發送者郵箱(其實就是自己)
receivers = ["[email protected]"]   # 定義接受者郵箱(可以是多個接收者)

message = MIMEText("這是一封測試郵件 O(∩_∩)O哈哈~", "plain", "utf-8")     # 定義郵件內容;"plain"是格式,表示是普通的文件內容

message["From"] = Header(sender)                            # 在message內定義發送信息 --> 發送者
message["Subject"] = Header("Python 測試郵件發送", "utf-8")   # 在message內定義發送信息的標題
print("加密後的發送內容\n", message.as_string())      # 打印輸出加密後的發送內容

try:    # 捕獲發送郵件的異常
    smtpObj = smtplib.SMTP()             # 實例化 SMTP 協議對象
    smtpObj.connect(mail_host, 25)       # 鏈接 SMTP 服務器
    smtpObj.login(mail_user, mail_pass)  # 登錄郵箱驗證
    smtpObj.sendmail(sender, receivers, message.as_string())    # 發送郵件; "message" 通過 "as_string()" 進行發送內容字符串的加密
except smtplib.SMTPException as error:
    print("error:{}".format(error))

PS:不要嘗試用這個源碼運行瞭,我已經將授權碼改瞭。

運行結果如下:

發送郵件的避坑總結

發送者郵箱開通 smtp 與 pop3 的訪問許可

不同的郵箱需要的驗證方式不同(有的是登錄密碼,有的是授權碼)

有些郵箱開通授權的訪問許可和授權碼可能會收費,這裡需要註意一下(比如 QQ 郵箱 [給個差評])

到此這篇關於Python實現郵件發送功能的方法詳解的文章就介紹到這瞭,更多相關Python郵件發送內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: