Python進階(四十六)-Python3實現SMTP傳送郵件詳細教程

No Silver Bullet發表於2017-04-26

Python進階(四十六)-Python3實現SMTP傳送郵件詳細教程

簡介

  Python傳送郵件的教程本人在網站搜尋的時候搜尋出來了一大堆,但是都是說了一大堆原理然後就推出了實現程式碼,我測試用給出的程式碼進行傳送郵件時都不成功,後面找了很久才找到原因,這都是沒有一個詳細的環境除錯導致,所以今天特出一個詳細的教程,一步一步從環境除錯到程式碼實現整一個教程,希望對還在苦苦尋找解決方法卻遲遲不能得到有效解決的朋友們一點幫助。

SMTP協議

  首先了解SMTP(簡單郵件傳輸協議),郵件傳送代理程式使用SMTP協議來傳送電郵到接收者的郵件伺服器。SMTP協議只能用來傳送郵件,不能用來接收郵件,而大多數的郵件傳送伺服器都是使用SMTP協議。SMTP協議的預設TCP埠號是25。

環境除錯

  上面說了是使用SMTP協議傳送的郵件,所以需要先檢視你的發件人郵箱是否有開啟SMTP協議,如沒有,則需要開啟,我測試使用的是163.com的郵箱作為發信人郵箱,在設定中開啟SMTP協議如下圖所示。
這裡寫圖片描述
  測試的前提是你需要開通客戶端授權,開通後會讓你設定密碼,那個密碼要記好,下面的passwd接收的是授權密碼而不是郵箱密碼!否則會出現下圖所示的錯誤提示:
這裡寫圖片描述

Demo

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

# 第三方 SMTP 服務
mail_host = "smtp.163.com"      # SMTP伺服器
mail_user = "***"                  # 使用者名稱
mail_pass = "***"               # 授權密碼,非登入密碼

sender = ***@163.com'    # 發件人郵箱(最好寫全, 不然會失敗)
receivers = [***@qq.com']  # 接收郵件,可設定為你的QQ郵箱或者其他郵箱

content = '我用Python'
title = '人生苦短'  # 郵件主題

def sendEmail():

    message = MIMEText(content, 'plain', 'utf-8')  # 內容, 格式, 編碼
    message['From'] = "{}".format(sender)
    message['To'] = ",".join(receivers)
    message['Subject'] = title

    try:
        smtpObj = smtplib.SMTP_SSL(mail_host, 465)  # 啟用SSL發信, 埠一般是465
        smtpObj.login(mail_user, mail_pass)  # 登入驗證
        smtpObj.sendmail(sender, receivers, message.as_string())  # 傳送
        print("mail has been send successfully.")
    except smtplib.SMTPException as e:
        print(e)

def send_email2(SMTP_host, from_account, from_passwd, to_account, subject, content):
    email_client = smtplib.SMTP(SMTP_host)
    email_client.login(from_account, from_passwd)
    # create msg
    msg = MIMEText(content, 'plain', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')  # subject
    msg['From'] = from_account
    msg['To'] = to_account
    email_client.sendmail(from_account, to_account, msg.as_string())

    email_client.quit()

if __name__ == '__main__':
    sendEmail()
    # receiver = '***'
    # send_email2(mail_host, mail_user, mail_pass, receiver, title, content)

  剛開始測試時,第一次傳送郵件是成功的,但是後面再次測試時卻出現了提示554,根據給出的網址檢視錯誤程式碼
http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html
554 DT:SPM 傳送的郵件內容包含了未被許可的資訊,或被系統識別為垃圾郵件。請檢查是否有使用者傳送病毒或者垃圾郵件。如下圖所示:
這裡寫圖片描述
  針對該問題,究竟如何解決,會在下一篇博文中進行展開。若看到的朋友有好的解決方法,還請提出,在此感謝。

附 參考資料

http://www.runoob.com/python/python-email.html

附 電子書福利(免積分下載)

Flask Web開發:基於Python的Web應用開發實戰

Learning Python, 5th Edition

這裡寫圖片描述

相關文章