最近、HTMLのメルマガを送信するという仕事があったのですが、その際にPythonでメール送信を行うコードを書きました。そこで今回は、プロジェクトで得た教訓や注意点などを簡潔にまとめてみようと思います。

スポンサーリンク




目次

  1. PythonによるHTMLメールの送信方法
  2. HTML版のメルマガのライトモードとダークモードへの対策
  3. まとめ

1. PythonによるHTMLメールの送信方法

メール送信プログラムは、これまでPHP等で書くことが多かったのですが、今回はあえてPythonで書いてみました。Pythonはシンプルに書けるので本当にいいですね。まずは基本的な送信プログラムのソースコードから。

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# メール送信設定
SMTP_SERVER = '_____SMTPサーバー_____'
SMTP_PORT = 587
SMTP_ID = '_____アカウント名_____'
SMTP_PW = '_____パスワード_____'
MAIL_FROM = '_____送信元アドレス_____'
MAIL_TO = '_____送信先アドレス_____'

# multipart/alternative形式を指定
msg = MIMEMultipart('alternative')

# メール件名
msg['Subject'] = "HTML版メルマガ"

# メール送信元
msg['From'] = MAIL_FROM

# メール送信先
msg['To'] = MAIL_TO

# メール本文(テキスト)
text = "HTMLメールに対応できない場合のテキストコンテンツ"

# メール本文(HTML)
html = """\
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
</head>
<body>

<p>お好みのHTMLコンテンツを自由に書いてください!</p>

</body>
</html>
"""

part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
msg.attach(part1)
msg.attach(part2)

smtp = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
smtp.login(SMTP_ID, SMTP_PW)
smtp.sendmail(MAIL_FROM, MAIL_TO, msg.as_string())
smtp.quit()

9〜14行目:

このコードでは、外部のSMTPサーバーを使う設定になってますので、SMTPサーバー、ポート番号、アカウント、パスワードを設定してください。送信元と送信先のアドレスも忘れずに。

17行目:

「Content-Type」を指定していますが、このコードでは「multipart/alternative」形式が指定されています。この形式はHTMLパートとテキストパートを両方含むメール送信のための形式です。HTMLを表示できないメールクライアントの場合、テキストパートが表示されます。

33行目:

このサンプルHTMLでは未だに「HTML 4.01」が指定してありますが、メールクライアントがHTML5に非対応である場合の対策として「HTML 4.01」で書くことが未だ主流とのことなので、このようになっています。

HTMLコーディングの注意点としては、メール本文は「HTML 4.01」のため、レイアウト構造はtableタグで書き、画像パスは全てフルパスで書きます。また大きな画像を貼り付ける場合は、幾つかにスライスして分割コーディングします。

2. HTML版のメルマガのライトモードとダークモードへの対策

今回メルマガをテスト送信した時に、端末がダークモードでもライトモードの時のように(つまりメール本文の背景を通常通り白に)表示できないかとリクエストがきました。つまりiPhone版のGmailアプリでメルマガのメール本文を見ると、背景が白でないので、全体的にカッコ悪く見えるというわけです。

結論から述べると、Gmailアプリでは、ダークモードの際に強制的に背景色と文字色がダークモード配色になるため、スタイルで背景色や文字色を指定するのが難しいということが分かりました。

実は、HTML5のMedia Queriesには「prefers-color-scheme」というプロパティーがあって、これに「dark」や「light」を指定してスタイルを指定するとモード別にスタイルを分けることができるのです。

<style>
body {
	background-color: #fff;
	color: #000;
}
@media (prefers-color-scheme: light) {
	body {
		background-color: #fff;
		color: #000;
	}
}
@media (prefers-color-scheme: dark) {
	body {
		background-color:#000;
		color:#fff;
	}
}
</style>

それで、メルマガをHTML5で書き「prefers-color-scheme: dark」内で背景色を白、文字色を黒に指定すれば、ダークモードでも背景をライトモードと同一にできるのではないか?と考えてあれこれ試してみたのですが、どうやらGmailアプリはたとえメールをHTML5で書いたとしても「prefers-color-scheme」を無視することが分かりました。

参考URL:
https://www.webcreatorbox.com/tech/dark-mode
https://kawahara-ci.hatenablog.com/entry/2020/05/16/dark_mode_on_gmail

つまり、Gmailアプリでは、強制的にダークモードとライトモードに表示を切り替えられてしまうというわけです。ちなみにiPhoneの「メール」アプリは、HTML内のスタイルの指定が尊重され、ダークモードでもメール本文のスタイルは強制変更されません。う〜む、Gmailアプリ厄介な存在だ。

それで、HTML版のメルマガでは、仮にダークモード配色になっても、カッコ悪くならないように留意しなければならないということですね。特に注意したいのが、スライスした画像です。白のマージンを持ったjpg画像を使ってしまうと、画像以外の部分は背景が黒くなるので、カッコ悪くなってしまうわけです。

対策としては、画像はjpgではなくpngを使い、マージン部分は透過に設定するといった配慮などが必要になります。…ですが、メルマガで使用する画像は小さければ小さいほどいいわけで、png画像をたくさん使ってしまうと、今度はデータ量が増えてメールの読み込みが遅くなるという現象が発生します。…なかなか難しい問題だ。

それに、強制的に背景色と文字色が変更されてしまうわけですから、スタイルの組み方によっては、文字色と背景色がほとんど同色になってしまい、メール本文が読めなくなるという可能性すらあります。そんなことにならないように、テスト送信はしっかりやるべきですね。

3. まとめ

今回は、PythonでHTMLメールを送信する方法について扱ってみました。また後半では、HTMLのメルマガを作成する際の注意点などについても、気づいた点などまとめてみました。同じようなプロジェクトに取り組んでいる方の参考になれば幸いです!