SMTPとHTML形式の電子メールについて
今回のコラムはSMTP(Simple Mail Transfer Protocol)でHTML形式の電子メールについて、及び実際にHTML形式の電子メールをメールソフトを使わず送信する方法の紹介です。
電子メール送信に関するプロトコルである「SMTP」はインターネット・プロトコルの主要な一つです。昨今はLINE、Slack、Microsoft Teamsなどのビジネスチャット・SNSのインスタントメッセージツールがテキストコミュニケーションの中心に移行しつつありますが、まだまだ電子メールは今でも主要な通信手段です。
電子メールの誕生とRFC通信規約
【電子メールの誕生】
電子メールの原型であるUUCP(Unix to Unix Copy Protocol)は1970年代に登場したUNIX機に実装され、その後1982年にSMTP(Simple Mail Transfer Protocol)が作られました。シンプルなプロトコルと思われがちですがわりと複雑な仕様となっています。
RFCで規定されるSMTP関連の標準仕様はほぼ2000年までに制定されました。HTML形式で使うMIME関連の仕様も規定されています。
【SMTP関連のインターネット標準RFC通信規約】
SMTPに関連するRFCは多いですが、1982年にRFC822で規定され、2008年にRFC5321としてアップデートされています。1993年にMIME (Multipurpose Internet Mail Extensions)形式が整備され、同じく1993年に漢字コード(ISO-2022-JP)が規定され、日本語の扱いが標準化されています。
SMTPとメッセージ形式 | ||
1973 | RFC524 | A Proposed Mail Protocol |
1973 | RFC561 | Standardizing Network Mail Headers |
1977 | RFC733 | STANDARD FOR THE FORMAT OF ARPA NETWORK TEXT MESSAGES(1) |
1982 | RFC822 | STANDARD FOR THE FORMAT OF ARPA INTERNET TEXT MESSAGES |
2001 | RFC2822 | Internet Message Format |
2008 | RFC5321 | Simple Mail Transfer Protocol |
2008 | RFC5322 | Internet Message Format |
MIME (Multipurpose Internet Mail Extensions) | ||
1993 | RFC1521 | MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies |
1993 | RFC1522 | MIME (Multipurpose Internet Mail Extensions) Part Two: Message Header Extensions for Non-ASCII Text" |
1996 | RFC2045 | MIME Part One: Format of Internet Message Bodies |
1996 | RFC2046 | MIME Part Two: Media Types |
1996 | RFC2047 | MIME Part Three:Message Header Extensions for Non-ASCII Text |
1996 | RFC2048 | Multipurpose Internet Mail Extensions (MIME) Part Four:Registration Procedures |
1996 | RFC2049 | Multipurpose Internet Mail Extensions (MIME)Part Five:Conformance Criteria and Examples |
1999 | RFC2557 | MIME Encapsulation of Aggregate Documents, such as HTML (MHTML) |
Character Encoding | ||
1993 | RFC1468 | Japanese Character Encoding for Internet Messages |
1997 | RFC2231 | MIME Parameter Value and Encoded Word Extensions:Character Sets, Languages, and Continuations |
1997 | RFC2183 | Communicating Presentation Information in Internet Messages:The Content-Disposition Header Field |
1998 | RFC2298 | An Extensible Message Format for Message Disposition Notifications |
HTML形式のメールは1999年には既にRFC2557のMIME関連で規定されています。今では、HTML形式で送信されているメールは多く、メールクライアントによっては知らない間にHTML形式で送信されます。かつては敬遠されがちだったHTML形式のメールですがHTML形式で送信されているメールはどれ程あるでしょうか?
筆者の使っていたメールアカウントでメールを保管している過去メール(2000年~2017年)を調べてみると、2005年から急速に増えています。
※送信元の重複は除きます。筆者のインターネット上での活動量によるメールの年間のメール総受信量にも左右されますが、概ね2005年ごろからHTML形式のメールが増加しているようです。特にメールマガジンや企業からのダイレクトメールが多い。
HTML形式のメールのメリット、デメリット
【HTML形式のメールのメリット】
・ホームページのように表現できるので、画像を自由に配置でき、文字の大きさや色の変更も自由に設定できるので視覚的に内容が伝えやすい。
文字だけのテキストメールよりも表現力に富んで読まれやすくなります。
従って、ビジネスメールよりもメールマガジンや企業からのお知らせ等に多用されています。
・メール内のURLリンクにパラメータを埋め込むことによって受信者のアクセスの解析にも使うことができる為、メールでのマーケティングに向いています。
【HTML形式のメールのデメリット】
・HTML形式のメールを読まない受信者がいる。
HTML形式のメールを拒否している受信者や受信してもテキストで読む受信者がいます。また、メールクライアントによってはHTMLのレンダリングが上手く行かず崩れる場合もあり、読み飛ばす受信者も少なからずいます。
送信者側の対策として、TEXTパート(テキスト本文)とHTMLパート(WEB画面)の両方をマルチパートで送る方法で、テキストだけ読む受信者にも対応しているメールも多い。
・HTML形式のメールの作成には、HTMLを記述する知識が必要となります。また同時配信するには面倒です。
最近のメール配信システムでは専用のWEB上でのエディタが付属しており、テンプレートを利用すれば容易に作成し、送信することができるようになっています。
・メールサイズが大きくなってしまう。
画像をインラインで添付するとその分メールサイズが大きくなり、サーバに負荷をかけます。また、受信者のメールボックスの容量も圧迫することになるだけでなく、画像もダウンロードしなければならず受信に時間がかかります。
画像をリンク形式でサーバ上のファイルを指定した場合は、メールクライアントの種類によって画像部分は受信者が指示しない限り読み込まないものもあります。
・スパムメールに利用される。
これが一番厄介なのですが、メールクライント中でホームページ風に表示するとURLリンク等は直ぐに騙せてしまいます。
何も知らない受信者の場合は、それを開けてクリックし詐欺サイトへ誘導されてしまうことになりますので、注意が必要です。
ですので、HTML形式で普段知らないところか来たメールは、必ずテキスト文で表示して確認することを習慣づけることが大切です。
以上のようなデメリットはありますが、レスポンシブデザインやマルチパート配信に対応したメールであれば受信者の環境に合わせて有効なメールを配信できます。
PHPでのHTML形式のメール送信方法
メールでHTML形式で送るにはどうしたら良いでしょうか?
メールクライアントにHTML形式のエディタが付いていればそれを利用してレイアウトすれば良く、簡単だと思われます。
貴方が広報としてHTML形式でレイアウトされたメールを一斉に一万人の会員に送りたい時はどうすれば良いでしょうか?
HTML形式でレイアウトできるメール配信サービスを利用するのが容易で管理もしやすいです。
では、なんらかのシステムと連携してその情報を自動でHTML形式でメール送信したい場合はどうでしょうか?
エンジニアであればサーバを利用できてphpを扱えるなら以下のコードで画像付きHTML形式のメールを送れます。スクリプト組めば一斉送信可能となります。
【htmlmail.php】
<?php
require_once("Mail.php");
require_once("Mail/mime.php");
$params = array(
"host" => "mail.example.jp",
"port" => 25,
"auth" => true,
"username" => "dummy",
"password" => "xxxxxxxxxx"
);
$mailObject = Mail::factory("smtp", $params);
$recipients = "[email protected]";
$addHeaders = array(
"To" => "[email protected]",
"From" => "[email protected]",
"Subject" => mb_encode_mimeheader("TEST mail")
);
$bodyParam = array(
"head_charset" => "ISO-2022-JP",
"html_charset" => "Shift_Jis"
);
$body = '<html>
<head>
<meta http-equiv="Content-Type" Content="text/html;charset=Shift_JIS">
</head>
<body>
<h1>HTMLメールのテスト</h1>
<p>HTMLメールのテストです。</p>
<p><img src="./twitter.jpg"></p>
<p>↑は添付の画像です。</p>
<img src="https://www.picolix.jp/images/cube.jpg" width="40" height="40">
<p>↑はURLリンクされた画像です。</p>
</body>
</html>
';
$mimeObject = new Mail_Mime("\n");
$mimeObject->setHTMLBody($body);
$mimeObject->addHTMLImage("./twitter.jpg", "image/jpg");
$body = $mimeObject->get($bodyParam);
$headers = $mimeObject->headers($addHeaders);
$mailObject->send($recipients, $headers, $body);
?>
PHPでのサーバ上のプログラムではPEARのMailパッケージをインクルードすれば上述のコードのようにメールプロトコルは気にすることはなくHTMLを記述したファイルとimgタグに指定している画像を添付すれば容易に送信できます。
昔から「HTMLメールは危険です」と言われ続けています。実際HTMLメールのスパムメールは2005年から拡大し続けています。当時はビジネスメールにHTMLメールは使わないように勧められていました。
現在に至っても、HTML形式のスパムメールは非常に多く、テキスト形式で表示させないとURLリンクは詐欺サイトを見抜けないような巧妙なメールもありますので要注意です。しかしながら、カスタマー側からはWEB形式の綺麗な画面表示で送ることが可能でユーザへのアピールにもなり、有用であることには間違いありません。
HTML形式のメール構造
画像付きHTML形式のメール構造は以下のように5種類のパターンがあります。
パターン | MIME構成 | 第一階層 | 第二階層 | 第三階層 | 第四階層 | ||
インライン オブジェクト |
添付 ファイル |
||||||
1 | - | - | multipart/ alternative |
text/plain | |||
text/html | |||||||
2 | 〇 | multipart/ mixed |
multipart/ alternative |
text/plain | |||
text/html | |||||||
添付ファイル | |||||||
3 | 〇 | - | multipart/ alternative |
text/plain | |||
multipart/ related |
text/html | ||||||
インラインオブジェクト:画像 | |||||||
4 | multipart/ related |
multipart/ alternative |
text/plain | ||||
text/html | |||||||
インラインオブジェクト:画像 | |||||||
5 | 〇 | multipart/ mixed |
multipart/ related |
multipart/ alternative |
text/plain | ||
text/html | |||||||
インラインオブジェクト:画像 | |||||||
添付ファイル |
ここで注意しなくてはならないのが、text/html中で記載されるimgタグに関してです。
通常はimgタグ中の画像の指定にはファイル名を記述しますが、RFC規定ではインラインオブジェクトを使用することになり、必ずContent-ID (ユニークID)を指定し、cid:~始まるユニーク値を指定する必要があります。
元々のhtmlファイルの画像指定 :<img src="sample.png">
インラインオブジェクトの指定 :<img src="cid:ユニークID">
img 要素等でオブジェクトを参照する際は、img src属性にContent-IDを"cid:"に追加して記述する必要があるのです。
PHPの参考プログラムはContent-ID (ユニークID)を気にすることなく、送信時に内部で自動的に書き換えてくれますので、作成者はHTML記述に専念できます。
SMAILでのHTML形式のメール送信方法
【SMAILとは】
筆者作成のWindows用のコマンドライン送信専用の電子メールクライアントで送信に特化したシステムに組み込み用のツールです。SMAILは1998年にバージョン1.0をリリースしてから55回のアップデートを重ねてきました。
SMAIL当初はコマンドラインから簡単にメールが送信できるだけのものでしたが、機能を拡張して添付ファイル、SMTP認証(AUTH CRAM-MD5,AUTH PLAIN,AUTH LOGIN,AUTH XOAUTH2)、opensslを利用してSSL接続も対応してきました。HTML形式の送信は今年の4月まで未実装でした。
主に業務システムで発生する多種なメッセージの送信用の組み込みに使われ、HTML形式での送信の要望は過去ちらほらあったのですが、対応はペンディングとしておりました。ここ数年、要望がまた増えてきた為、バージョン5.0で対応しました。
バージョン5.0で容易にHTML形式のメールを送信できるようになりましたのでご紹介いたします。また、より自由にスクリプトを組んでHTML形式のメールを送信できるようになります。
※SMAILアプリのダウンロードはこちらです。
SMAILはHTML形式のメール構造のパターン4に対応しています。
※パターン4でインラインオブジェクト画像に該当しない場合はメールクライアント側で添付ファイルとして認識されます。ただしこの場合はメールクライアント次第で仕様外となりますが、大抵添付ファイルとして扱ってくれます。
【SMAILの実行方法】
WINDOWSのコマンドラインからの実行は下記のようになります。
※詳細なオプションパラメータの内容はSMAILアプリ同梱のREAD.MEを参照してください。
c:\apps\smail -hsmtp.gmail.com -s"HTML形式テストメール" -F代替え本文.txt -x -aindex.html,テスト添付.txt,C:\temp\cube.png [email protected] [email protected] -d -i
オプションパラメータ例:
-s: サブジェクト文字列
-F: 本文ファイル
・TEXTパートが代替え本文.txtでメール受信時の本文の内容となります。
-x: 添付ファイルをHTML形式として扱う
-a: 添付ファイル
・HTMLパートがindex.htmlでメール受信時のWEB画面です。
上述のコマンド例ではhtml中の画像(インラインオブジェクト)は
<img src="cube.png" alt=""/>で記述している場合、添付ファイルにcube.pngを指定します。
送信時にはimgタグは<img src="cid:735622385671A0CX2">のように変換されます。735622385671A0CX2はメール内で適当なユニークな値をSMAILで付与されます。
※画像は何枚でも可能です。
※CSSは添付ファイルにせずHTML内に埋め込む必要があります。
-f: 送信元
-d: デバッグモード(送受信内容を表示する)
※パスワード関連は****の様に自動的に伏字になります。
-i: 設定情報を表示する
以上のコマンドで作成者は普通にホームページを作る要領で生成したHTMLを添付するだけで送信できます。
SMAILで実際に送信した画面が以下です。
htmlファイルは通常quoted-printable形式でエンコードするのが一般ですが、SMAILではbase64形式でエンコードしています。htmlファイル自身の文字コードは何でも良いですが、html中のMETAタグにcharsetで文字コードを記載してください。ない場合はメールクライアントによって文字化けする場合があります。
【SMAILの送信内容】
【メールクライアントの受信内容】
実際の受信内容は以下のようになります。
・メールクライアント:Gmail(WEB)
・メールクライアント:Becky!
・TEXTパート
・HTMLパート
Becky!では、TEXTパート、HTMLパートを個別に見ることができます。Gmail(WEB版)ではTEXTパートは表示されません。
このように、WINDOWSのコマンドラインからSMAILを使うことによってHTML形式でメールを送信することができ、スクリプト(BAT,VBS)を組めば一斉送信も可能となります。
※一斉送信する場合は、相手メールサーバで単位時間あたりの送信に制限されている場合もあります。この場合は送信間隔を空けるかマルチ処理して複数処理するなどの検討が必要です。
WINDOWSで構築されたシステムから自動でHTML形式のメールを送信されたい方はコマンドライン型のSMAILを呼び出すことで自由に送信できますのでぜひお使いください。
※SMAILの詳細な使い方はhttps://www.picolix.jp/free/soft/SMAIL-HTML-MAIL.pdfを参照してください。
![ドメイン取得ならValue Domain](https://www.value-domain.com/media/wp-content/uploads/sites/2/2024/06/vd_bnr2.png)
※ユーザーノートの記事は、弊社サービスをご利用のお客様に執筆いただいております。
医療メーカーで新素材研究開発後、電機メーカーで制御器系システム開発を経てIT系マルチエンジニアをしています。またデザイン思考を実践し、アート思考などのいろんな思考方法に興味があります。