2020/10/27

python-emailsを使って、HTMLとTextのMultipartなEmailを送信する

pythonemail

概要

HTMLメールを表示できないメーラーの対策です。
HTMLとTextの両方のbodyを含むmultipartなemailをlavr/python-emailsを使って送信しました

送信 in Python

python-emails — python-emails 0.5.1 documentationをみて実装しました。

  • emails.Message のコンストラクタに htmltext の両方を指定するだけです。簡単でした。
import emails
from emails.template import JinjaTemplate

# your settings
class Settings:
    SMTP_TLS: bool = True
    SMTP_HOST: str = "your.smtp.server.host"
    SMTP_PORT: int = 587
    SMTP_USER: str = "your-smtp-user"
    SMTP_PASSWORD: str = "your-smtp-password"
    EMAILS_FROM_EMAIL: EmailStr = "From Name"
    EMAILS_FROM_NAME: str = "[email protected]"


settings = Settings()
email_to = "[email protected]"    # 宛先のメールアドレス
subject_template = "This is the subject"  # 件名
html_template = "<!doctype html><html><head></head><body><p>your code is {{ code }}</p></body></html>"  # htmlメールの内容
text_template = "your code is {{ code }}"  # textメールの内容
render_data = {
    "code": "12345"
}
message = emails.Message(
    subject=JinjaTemplate(subject_template),
    html=JinjaTemplate(html_template),
    text=JinjaTemplate(text_template),
    mail_from=(settings.EMAILS_FROM_NAME, settings.EMAILS_FROM_EMAIL),
)
smtp_options = {
    "host": settings.SMTP_HOST,
    "port": settings.SMTP_PORT,
    "user": settings.SMTP_USER,
    "password": settings.SMTP_PASSWORD,
}
if settings.SMTP_TLS:
    smtp_options["tls"] = True

response = message.send(to=email_to, render=render_data, smtp=smtp_options)

確認方法

私は普段gmailを使っているので、gmailで確認しました。
メールを開いて、右上にある詳細アイコンをクリックし、「メッセージのソースを表示」
をすると、以下のような感じで始まる部分があり、テキストメッセージがbase64でエンコードされている箇所を探します。

gmail-min.png

Content-Type: text/plain; charset=utf-8
MIME-Version: 1.0
Content-Transfer-Encoding: base64

eW91ciBjb2RlIGlzIDEyMzQ1

このbase64エンコードされている文字列をbase64デコードして、無事意図通りテキストが表示されるか確認します。

text="eW91ciBjb2RlIGlzIDEyMzQ1"
echo ${text} | base64 -D

your code is 12345