1. 程式人生 > 其它 >Python-使用SMTP服務傳送郵件

Python-使用SMTP服務傳送郵件

1.SMTP 傳送郵件

SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。

python的smtplib提供了一種很方便的途徑傳送電子郵件。它對smtp協議進行了簡單的封裝。

如果我們本機沒有 sendmail 訪問,可以使用其他郵件服務商的 SMTP 訪問(QQ、網易、Google等)。

下面以QQ郵箱為例:

1.1使用SMTP的第一步需要把郵箱的SMTP服務開啟:

  1. 登入QQ郵箱網頁版,點選設定:

  2. 在賬戶一欄中找到SMTP服務:

  1. 開啟SMTP服務,根據提示驗證密保:

  2. 驗證成功後複製授權碼備用:

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