使用smtplib發送郵件,提示smtplib.SMTPServerDisconnected: Connection unexpectedly closed

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


smtp_server='smtp.qq.com' # 要發送的服務器
port=465 # 服務器端口號
sender = ''  # 發送郵箱的賬號
receivers = ['']  # 接收郵件,可設置爲你的QQ郵箱或者其他郵箱

mail_msg ='<h1>先測試一下</h1>'

message = MIMEText(mail_msg, 'html', '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(smtp_server,port)
    smtpObj.set_debuglevel(1)
    smtpObj.login(sender, sender_password)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("郵件發送成功")
    smtpObj.quit()
except smtplib.SMTPException as e:
    print("Error: 無法發送郵件{}".format(e))

上面有一個坑,因爲使用的是QQ郵箱,一般需要先開啓 QQ郵箱設置裏的各種服務。比如使用pop.qq.com收件,用smtp.qq.com發件,根據需要開啓。

開啓之後,會看到溫馨提示這裏有個授權碼,一堆七七八八的操作之後得到(因爲是重要信息圖片處理了)授權碼,那麼我們需要給發送的郵箱授權。

這裏的sender_password就是sender的授權碼

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


smtp_server='smtp.qq.com' # 要發送的服務器
port=465 # 服務器端口號
sender = ''  # 發送郵箱的賬號
sender_password=''  # 發送郵箱的授權碼
receivers = ['']  # 接收郵件,可設置爲你的QQ郵箱或者其他郵箱

mail_msg ='<h1>先測試一下</h1>'

message = MIMEText(mail_msg, 'html', '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(smtp_server,port)
    smtpObj.set_debuglevel(1)
    smtpObj.login(sender, sender_password)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("郵件發送成功")
    smtpObj.quit()
except smtplib.SMTPException as e:
    print("Error: 無法發送郵件{}".format(e))

這時候我以爲會發送成功,結果報錯了:

信息提示是連接關閉,然後檢查一下代碼,發現需要將smtplib.SMTP()改成smtplib.SMTP_SSL(),smtplib.SMTP()是使用明文傳輸,對郵件內容不加密,而smtplib.SMTP_SSL()是使用ssl加密方式,通信過程加密,郵件數據安全。

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


smtp_server='smtp.qq.com' # 要發送的服務器
port=465 # 服務器端口號
sender = ''  # 發送郵箱的賬號
sender_password=''  # 發送郵箱的授權碼
receivers = ['']  # 接收郵件,可設置爲你的QQ郵箱或者其他郵箱

mail_msg ='<h1>先測試一下</h1>'

message = MIMEText(mail_msg, 'html', '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_SSL(smtp_server,port)  #將smtplib.SMTP()改成smtplib.SMTP_SSL()
    smtpObj.set_debuglevel(1)
    smtpObj.login(sender, sender_password)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("郵件發送成功")
    smtpObj.quit()
except smtplib.SMTPException as e:
    print("Error: 無法發送郵件{}".format(e))

於是終於發送成功。具體使用還請參考官方文件。

https://docs.python.org/zh-cn/3.7/library/smtplib.html?highlight=email#smtplib.SMTP.quit

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章