emlファイルをThunderbird、Outlookの両方で動作確認しました。
Thunderbirdのテキスト形式の下書きで作られたemlファイルから最小のものを構築しました。
実際にjavascriptで動いたコードを記載します。
(注意事項)
・宛先の日本語表示名はBase64エンコード(エンコード文字の前後に "=?UTF-8?B?"、"?="を後で付加)、またはMIMEエンコードをする
・宛先の文字の頭には必ず半角スペースを入れ、宛先に2件目以降をいれるときはカンマ、改行で区切る必要がある
・SubjectはBase64エンコード(エンコード文字の前後に "=?UTF-8?B?"、"?="を後で付加)、またはMIMEエンコードをする
・ファイルはUTF-8のBOM無しで保存する
js
1// 宛先のBase64エンコード方法
2let toBase64Encode = window.btoa(String.fromCharCode.apply(null, new TextEncoder().encode("日本語の名前")));
3let to += " =?UTF-8?B?" + toBase64Encode + "?= <"test@test.com">,\n";
4
5let cc = "";
6let bcc = "";
7
8// SubjectのBase64エンコード方法
9let subjectBase64Encode = window.btoa(String.fromCharCode.apply(null, new TextEncoder().encode("件名をここにいれる")));
10let subject = "=?UTF-8?B?" + subjectBase64Encode + "?= <"test@test.com">";
11
12let body = "本文をここにいれる";
13
14// emlTextの作成
15let emlText = "Date: " + luxon.DateTime.now().toRFC2822() + "\n";
16emlText += "MIME-Version: 1.0\n";
17emlText += "Content-Language: en-US\n";
18emlText += (to ? "To:" + to : "");
19emlText += (cc ? "Cc:" + cc : "");
20emlText += (bcc ? "Bcc:" + bcc : "");
21emlText += "Subject: " + subject + "\n";
22emlText += "Content-Type: text/plain; charset=UTF-8; format=flowed\n";
23emlText += "Content-Transfer-Encoding: 8bit\n";
24emlText += "\n";
25emlText += body;
26
27// BOM無しBlogオブジェクトを作成、emlファイルとしてダウンロード
28let blob = new Blob([emlText], { type: "text/plain" });
29
30let url = (window.URL || window.webkitURL).createObjectURL(blob);
31let link = document.createElement("a");
32
33link.download = luxon.DateTime.now().toFormat("yyyyMMdd-HHmmss.SSS-") + subject + ".eml";
34link.href = url;
35document.body.appendChild(link);
36link.click();
37document.body.removeChild(link);