Python-使用SMTP服務傳送郵件
阿新 • • 發佈:2021-10-18
1.SMTP 傳送郵件
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。
python的smtplib提供了一種很方便的途徑傳送電子郵件。它對smtp協議進行了簡單的封裝。
如果我們本機沒有 sendmail 訪問,可以使用其他郵件服務商的 SMTP 訪問(QQ、網易、Google等)。
下面以QQ郵箱為例:
1.1使用SMTP的第一步需要把郵箱的SMTP服務開啟:
-
登入QQ郵箱網頁版,點選設定:
-
在賬戶一欄中找到SMTP服務:
-
開啟SMTP服務,根據提示驗證密保:
-
驗證成功後複製授權碼備用:
1.2準備傳送郵件
import smtplib from email.mime.text import MIMEText from email.header import Header # 第三方SMTP伺服器地址: smtp_server = 'smtp.qq.com' # 輸入Email地址和授權碼: from_addr = '[email protected]' password = 'xxxxxxxxxxxxxx' # 輸入收件人地址: to_addr = '[email protected]' # 定義傳送的訊息,其中plain是文字格式 message = MIMEText('Python 郵件傳送測試...', 'plain', 'utf-8') # 定義傳送人名字 message['From'] = Header('Python', 'utf-8') # 定義接收人的名字 message['To'] = Header('測試員', 'utf-8') # 定義郵件主題 subject = 'Python SMTP 郵件測試' message['Subject'] = Header(subject, 'utf-8') # 嘗試傳送郵件 try: # 建立SMTP物件 smtpObj = smtplib.SMTP() # 建立SMTP連線 smtpObj.connect(smtp_server, 25) # SMTP的埠號,一般為25 # 登入郵箱 smtpObj.login(from_addr, password) # 傳送郵件 傳送方 接收方 資訊 smtpObj.sendmail(from_addr, to_addr, message.as_string()) print('郵件傳送成功') except smtplib.SMTPException: print('Error:郵件傳送失敗')
執行程式碼:
可以看到郵件傳送成功,開啟郵箱:
可以看到收到了一封郵件:
1.3使用Python傳送HTML格式的郵件
Python傳送HTML格式的郵件與傳送純文字訊息的郵件不同之處就是將MIMEText中_subtype設定為html。具體程式碼如下:
import smtplib from email.mime.text import MIMEText from email.header import Header # 第三方SMTP伺服器地址: smtp_server = 'smtp.qq.com' # 輸入Email地址和授權碼: from_addr = '[email protected]' password = 'xxxxxxxxx' # 輸入收件人地址: to_addr = '[email protected]' # 定義傳送的訊息,定義為html格式 html_message = """ <p>這是一封html格式的郵件</p> <p><a href="https://weibk.github.io">這是一個連線,通往我的主頁</a></p> """ message = MIMEText(html_message, 'html', 'utf-8') # 定義傳送人名字 message['From'] = Header('Python', 'utf-8') # 定義接收人的名字 message['To'] = Header('測試員', 'utf-8') # 定義郵件主題 subject = 'Python SMTP 郵件測試' message['Subject'] = Header(subject, 'utf-8') # 嘗試傳送郵件 try: # 建立SMTP物件 smtpObj = smtplib.SMTP() # 建立SMTP連線 smtpObj.connect(smtp_server, 25) # SMTP的埠號,一般為25 # 登入郵箱 smtpObj.login(from_addr, password) # 傳送郵件 傳送方 接收方 資訊 smtpObj.sendmail(from_addr, to_addr, message.as_string()) print('郵件傳送成功') except smtplib.SMTPException: print('Error:郵件傳送失敗')
傳送的郵件如下:
1.4給郵件新增附件
傳送帶附件的郵件,首先要建立MIMEMultipart()例項,然後構造附件,如果有多個附件,可依次構造,最後利用smtplib.smtp傳送。
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
# 第三方SMTP伺服器地址:
smtp_server = 'smtp.qq.com'
# 輸入Email地址和授權碼:
from_addr = '[email protected]'
password = 'xxxxxxxxxxx'
# 輸入收件人地址:
to_addr = '[email protected]'
# 建立一個帶附件的例項
message = MIMEMultipart()
# 定義傳送人名字
message['From'] = Header('Python', 'utf-8')
# 定義接收人的名字
message['To'] = Header('測試員', 'utf-8')
# 定義郵件主題
subject = 'Python SMTP 帶附件的郵件測試'
message['Subject'] = Header(subject, 'utf-8')
# 郵件正文:
message.attach(MIMEText('這封郵件帶了兩個附件.....', 'plain', 'utf-8'))
# 新增第一個附件,傳送當前目錄下的 abs_test.py 檔案
att1 = MIMEText(open('abs_test.py').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 這裡的filename可以任意寫,寫什麼名字,郵件中顯示什麼名字
att1["Content-Disposition"] = 'attachment; filename="abs_test.py"'
message.attach(att1)
# 新增第二個附件
att2 = MIMEText(open('calc_test.py').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
# 這裡的filename可以任意寫,寫什麼名字,郵件中顯示什麼名字
att2["Content-Disposition"] = 'attachment; filename="calc.py"'
message.attach(att2)
# 嘗試傳送郵件
try:
# 建立SMTP物件
smtpObj = smtplib.SMTP()
# 建立SMTP連線
smtpObj.connect(smtp_server, 25) # SMTP的埠號,一般為25
# 登入郵箱
smtpObj.login(from_addr, password)
# 傳送郵件 傳送方 接收方 資訊
smtpObj.sendmail(from_addr, to_addr, message.as_string())
print('郵件傳送成功')
except smtplib.SMTPException:
print('Error:郵件傳送失敗')
成功傳送的郵件如下:
本文來自部落格園,作者:雨-鈴,原文連結:https://www.cnblogs.com/yuling25/p/smtp-email.html