Overview

smtplib 是一個 Python 內建的 smtp 用戶端,可以建立一個物件用來發送郵件到任何 smtp 郵件伺服器。

Usage

Sender

要發送郵件,勢必需要一個發送郵件的發送端,這個發送端可以是自己架設的郵件伺服器所提供的用戶,也可以是像 Google 或 Yahoo 這種有提供郵件服務的伺服器的帳戶,如 Gmail 帳號。

以下用 Gmail 為例,首先需要讓程式能夠登入 Gmail 帳號,這裡需要將帳號開啟「低安全性應用程式存取權」,這樣才能在 Python 直接透過帳號密碼登入。

<aside> 💡 如果有開啟兩階段驗證的帳號則可以使用「應用程式密碼」功能提供的密碼來登入。沒有開啟兩階段驗證的帳號不會有這個功能。

</aside>

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f2ac39a5-e256-4af3-9e7c-f47c9d92ec6f/chrome_5YjVA3JQWy.png

Code

以下主要寄信功能為 smtplib 提供,並使用 email.message 以字典方式幫助建立信件的內容,同時利用字串模板 (Template) 功能為外部撰寫的 HTML 檔案傳入參數修改內容,當然也可以直接把內容寫在同一個檔案的字串中。

import smtplib
import email.message
from string import Template
from pathlib import Path

def send_mail(**kw):
    msg = email.message.EmailMessage()
    msg['From'] = f"伺服器<{user['sender_account']}>"
    msg['To'] = kw['target_account']
    msg['Subject'] = kw['msg_subject']
    msg.add_attachment(kw['msg_content_html'], subtype='html')

    with smtplib.SMTP(host='smtp.gmail.com', port=587) as smtp:
        smtp.ehlo()
        smtp.starttls()
        smtp.login(user['sender_account'], user['sender_password'])
        smtp.send_message(msg)

account = '[email protected]'
subject = '這是主旨'
email_template = Template(Path("email_template.html").read_text(encoding='utf-8'))
param_table = {
    'user': '王小明'
}
content_html = email_template.substitute(param_table)

send_mail(target_account=account, msg_subject=subject, msg_content_html=content_html)

<aside> 💡 如果有使用 flask 的也可以用 render_template 來渲染模板讀取變數。

</aside>

Reference

smtplib - SMTP protocol client - Python 3.9.6 documentation

email: Examples - Python 3.9.6 documentation

Python Email 發送電子郵件 - 基本教學 By 彭彭

[Python實戰應用]Python寄送Gmail電子郵件實作教學

Python - email寄信