smtplib 是一個 Python 內建的 smtp 用戶端,可以建立一個物件用來發送郵件到任何 smtp 郵件伺服器。
要發送郵件,勢必需要一個發送郵件的發送端,這個發送端可以是自己架設的郵件伺服器所提供的用戶,也可以是像 Google 或 Yahoo 這種有提供郵件服務的伺服器的帳戶,如 Gmail 帳號。
以下用 Gmail 為例,首先需要讓程式能夠登入 Gmail 帳號,這裡需要將帳號開啟「低安全性應用程式存取權」,這樣才能在 Python 直接透過帳號密碼登入。
<aside> 💡 如果有開啟兩階段驗證的帳號則可以使用「應用程式密碼」功能提供的密碼來登入。沒有開啟兩階段驗證的帳號不會有這個功能。
</aside>
以下主要寄信功能為 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)
email_template.html
<body>
<div style="font-size: larger;">
<h2>$user您好:</h2>
<p>課程抵免申請系統提交了一件新的申請表單,請您撥空前往審核該表單,謝謝。</p>
<h4>此郵件由【課程抵免申請系統】自動發送,請勿直接回覆。</h4>
</div>
</body>
<aside>
💡 如果有使用 flask 的也可以用 render_template
來渲染模板讀取變數。
</aside>
smtplib - SMTP protocol client - Python 3.9.6 documentation
email: Examples - Python 3.9.6 documentation
Python Email 發送電子郵件 - 基本教學 By 彭彭