2020/10/27
python-emailsを使って、HTMLとTextのMultipartなEmailを送信する
概要
HTMLメールを表示できないメーラーの対策です。
HTMLとTextの両方のbodyを含むmultipartなemailをlavr/python-emailsを使って送信しました
送信 in Python
python-emails — python-emails 0.5.1 documentationをみて実装しました。
emails.Message
のコンストラクタにhtml
とtext
の両方を指定するだけです。簡単でした。
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でエンコードされている箇所を探します。
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
関連する記事
[Python]ハイフンなし電話番号からハイフン付きに復元
Pythonでハイフンなしの日本の電話番号をハイフン付きのものに変換する
Rustでマルチパート(html+fallback text)メールの送信
テンプレートエンジンのteraとメール送信ライブラリであるlettreを使ってマルチパートのメール送信を試しました。
[Python]BeautifulSoup4でhtmlの解析
BeautifulSoup4というPythonのライブラリを使って、特定のURLのコンテンツを取得し、タイトルや説明文を取得できるようにしました。
[Python]銀行コードと支店コードの取扱
Pythonで銀行コード、支店コードデータを取り扱う便利なライブラリzengin-codeを導入しました。