【Stmplib】Python正確模擬傳送QQ郵件

星拱北辰發表於2020-12-18

以前也試過模擬發Email,但好像都忘了,於是按照菜鳥教程重新試了一下:

import smtplib
from email.mime.text import MIMEText
from email.header import Header
 
sender = 'from@runoob.com'
receivers = ['???@qq.com']  # 接收郵件,可設定為你的QQ郵箱或者其他郵箱
 
# 三個引數:第一個為文字內容,第二個 plain 設定文字格式,第三個 utf-8 設定編碼
message = MIMEText('Python 郵件傳送測試...', 'plain', 'utf-8')
message['From'] = Header("菜鳥教程", 'utf-8')   # 傳送者
message['To'] =  Header("測試", 'utf-8')        # 接收者
 
subject = 'Python SMTP 郵件測試'
message['Subject'] = Header(subject, 'utf-8')
 
 
try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print "郵件傳送成功"
except smtplib.SMTPException:
    print "Error: 無法傳送郵件"

結果瘋狂報錯,說是什麼ConnectionRefusedError: [WinError 10061] 由於目標計算機積極拒絕,無法連線.

這個問題查搜尋引擎發現都是說什麼網路連線問題(比如防火牆、區域網等等),但其實不是關鍵問題,主要是這個程式碼有點問題。

修正後的程式碼是這樣的:

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

f = open('./config.txt', 'r')

# \n換行符需要刪掉
sender = f.readline()[:-1]
receiver = f.readline()[:-1]
password = f.readline()[:-1]

f.close()

receivers = [receiver]

message = MIMEText('Python騷擾郵件', 'plain', 'utf-8')
message['From'] = Header("Python騷擾郵件", 'utf-8')
message['To'] = Header("Python騷擾郵件", 'utf-8')

subject = 'Python-SMTP郵件測試'
message['Subject'] = Header(subject, 'utf-8')

try:
    smtpObj = smtplib.SMTP_SSL("smtp.qq.com", 465)
    smtpObj.connect("smtp.qq.com", 465)
    smtpObj.login(sender, password)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("郵件傳送成功")
except smtplib.SMTPException:
    print("Error: 無法傳送郵件")

做幾點必要說明:

  1. 個人資訊存在檔案裡是比較妥善的做法,通過讀檔案來獲取資訊
  2. 讀的一行檔案帶有換行符,需要去掉末尾\n
  3. 發QQ郵箱需要開啟SMTP服務並獲取授權碼
  4. 注意異常處理,其實這裡的異常處理比較暴力,真的出錯也不便於排錯

相關文章