そこではDATAコマンドで送信するメールの形式については言及しませんでした。今回は、メールの形式について説明します。7ビット基本的にSMTPは7ビットのプロトコルです。それでやり取りされるメールも7ビットのコードを使用します。この7ビットであることが、様々な制約を生みメールの形式を複雑にしています。ヘッダと本文メールは大きくヘッダと本文に分けられます。ヘッダは、ヘッダ名と値の対になっておりコロン:で区切られます。+0900SMTPの1行は1000オクテット(≒バイト)なので、無制限に長くすることはできません。そのために複数行で表現できるようになっています。実際には1000オクテットまで伸ばさずに78オクテット程度までで改行します。複数行のヘッダは、2行目以降は行頭に空白文字を入れることになっています。(空白文字は、いくつ入れてもかまいません。boundary="94eb2c076a6af4de10055a4bf6e4"このような形で必要な情報を並べて記述します。<who@example.com>ヘッダの最後に改行だけの空行を入れ、それが本文との区切りになります。<who@example.com>ここからが本文MIMEエンコード前にメールの形式は7ビットだと述べましたが、ヘッダにはもう1つ制約があります。ヘッダは表示可能な文字しか使えません。7ビットでもコントロールコードは使えないのです。この制約は英語圏の人々には何の影響もありませんが、日本語では大きな問題となります。日本語でメールをやり取りする場合、7ビットで表現できるISO-2022-JP文字コード(通称JISコード)が長らく使われてきました。メール本文はISO-2022-JPで記述できますが、ヘッダには記述できないのです。そのために、Subject(件名)に日本語を使うことができません。使っているよ、と思いましたね。Subjectに日本語を使うことはできます。そのためにMIMEエンコードと呼ばれる形式で記述します。=?ISO-2022-JP?B?GyRCN29MPiRHJDkhIxsoQg==?=MIMEエンコードは=?に始まり?=に終わります。途中?で3つのフィールドに分かれます。1つ目は、文字コード名を表します。この例ではISO-2022-JPです。2つ目は、エンコード方法です。(Base64)です。Printable)があります。3つ目がヘッダの情報です。この例のGyRCN29MPiRHJDkhIxsoQg==をBase64でデコードするとISO-2022-JPで「件名です。Exceptionの略で「多目的インターネットメール拡張」と訳されます。MIMEエンコードのヘッダも、この拡張の一部です。MIMEを使用するにはメールヘッダに宣言が必要です。1.0この1.0はMIMEのバージョンですが1.0しかありません。MIMEを使うと、本文がどんな形式で記述されているかを明示することができます。charset=UTF-8この例ではUTF-8コードで本文が記述されています。UTF-8は8ビットのコードですから、そのままSMTPで送ることができません。Printableで7ビットにエンコードする必要があります。どのようにエンコードしたかもヘッダに記述します。base64このようにして、1つのメールが完成します。<white@example.com>44GV44Gj44GN44Gu44GK5omL57SZ44CB44GU55So5LqL44Gq44GB44Gr77yf文字コード多くの場合に日本語のメールにはISO-2022-JPの文字コードが使われています。この文字コードは7ビットなのでSMTPに乗せやすいのですが、古いので使用できる文字に制限があります。機種依存文字と呼ばれる記号1や半角カナ、絵文字👍などは扱えません。SMTPに乗せやすいと言っても、Subject(件名)などのヘッダにそのまま記述できません。ヘッダに記述するためにはMIMEが必要です。それはメーラーがMIME形式にして送受信しています。今時MIMEに対応していないメーラーなんてありません。OSはユニコードに対応していてUTF-8を扱えない環境もありません。そこで、日本語のメールはUTF-8にすることを推奨します。UTF-8にするとISO-2022-JPでは扱えなかった機種依存文字と呼ばれる記号1や半角カナ、絵文字👍などを扱えます。ISO-2022-JPでは英数字と日本語しか扱えませんが、UTF-8では多言語で表現できます。APIでは標準でUTF-8のメールを送信します。)HTMLメール先の例のContent-Typeはtext/plainでした。これは通常の文字だけのメールです。表現力が欲しい場合にはHTMLで記述します。この場合のContent-Typeはtext/htmlになります。HTMLメールは、文字だけの文面と併用することが多くあります。このために代替可能なマルチパート形式で両方を記述します。text/html<html><body>HTMLの文面</body></html>--3fieoiur3omcqiw--代替可能なマルチパート形式は、Content-Typeがmultipart/alternativeになります。その後に各パートの区切り文字を指定します。この例では3fieoiur3omcqiwです。各パートは、この区切り文字の前に--を追加して区切ります。最後は更に後ろにも--を追加します。添付ファイル添付ファイルもマルチパート形式で表現します。HTMLメールと異なりパート間で代替の関係では無いのでContent-Typeはmultipart/mixedになります。添付ファイルは通常Base64でエンコードします。filename="attached.data"ThisIsABase64EncodedData--3fieoiur3omcqiw--HTML+添付ファイルHTMLメールも添付ファイルもマルチパート形式を使用しました。Content-Typeが異なるので、そのまま並べることはできません。filename="attached.data"ThisIsABase64EncodedData--3fieoiur3omcqiw--それでは、どのようにするかと言うとマルチパートを重ねます。multipart/mixedで文面と添付ファイルの形にします。その文面のパートをmultipart/alternativeにして平文とHTMLを共存させます。filename="attached.data"ThisIsABase64EncodedData--3fieoiur3omcqiw--今回は「SMTPによるメール送信の仕組み」で別の機会にと言ったメール本文のフォーマットの話をお送りしました。1回で送信することができます。活用をご検討ください。Unsplashスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。