SMTP(Simple Mail Transfer Protocol)とは、インターネットで電子メール(以下、メール)を転送するプロトコルです。
メッセージ形式
メールメッセージはヘッダとボディに分かれます。ヘッダは複数のヘッダフィールドで構成され、件名や宛先などの情報が含まれています。ボディはメール本文に当ります。
文字コード
文字コードとは、文字をコンピュータで処理するために、各文字に番号を割り振った体系です。主な文字コードは以下になります。
基本的にメールは、ASCIIコード(英語)で書かれたテキストしか送れません。日本語のメールを送るためには、別の文字コードを使う必要がありますが、全て何らかの形でASCIIコードに変換しています。
ASCIIコード | 文字が7ビットで表現され、アルファベットと特殊文字など127文字で構成されます。 |
JIS X 208 | 7ビットを2つ並べて日本語の文字集合を表す。 |
ISO-2022-JP | 7ビット体系の文字コード。文字コード切り替えるために、制御コード(エスケープシーケンス)を採用。 |
Shift JIS | Microsoftが定めた文字コード。文字が割当てられた1バイト目のバイト数の範囲により、その文字が1バイトか2バイトかを判断。 |
ECU | Extended Unix Code の略。AT&T社が定めた文字コード。 |
メールで日本語を送る場合は、ISO-2022-JP を使うのが標準とされています。これは、ISO-2022-JP が7ビット体系の文字コードだからです。旧来の7ビット体系しか扱えないメールクライアントがある場合、それ以外の文字コードでは文字化けが起こる可能性があります。
コンテンツの指定
メールに多言語や画像、音声などのコンテンツを扱うための規格が MIME(Multipurpose Internet Mail Extensions)です。MIMEは、ヘッダ部に日本語を含めるための仕組みとしての役割を持ちます。
メールを ISO-2022-JP で書いたとしても、途中のメールサーバがASCIIコードと認識してしまい、正常にメール転送が行えなくなる可能性があります。ボディ部(本文)はメール転送に関係ないので、ISO-2022-JP で書けば問題ありませんが、ヘッダ部はMIMEを利用する必要があります。
MIMEの主な機能は以下になります。
データの種類の指定 (Content-Type) |
従来のテキストやHTML等のテキストファイ(text)、GIFやPNG等の画像ファイル(image)、MPEG等の動画ファイル(video)などの指定 |
エンコード方法の指定 (Content-Transfer-Encoding) |
ボディが7ビットの文字のみのテキスト(7bit)や8ビットの文字が含まれているテキスト(8bit)、Quoted Printable形式でエンコードしたデータ(quoted-printable)や Base64形式でエンコードしたデータ(base64)などを指定 |
マルチパート (Mutipart) |
メールに添付ファイルを付けたり、HTMLメールを送るための手法、ボディ部に複数のパート(パートヘッダ+パートボディ)で構成 |
ヘッダフィールド
ヘッダフィールドの情報は以下になります。
Date: | 曜日・日・月・年・時・分・秒・タイムゾーンを表示。 [Date: WW, DD MM YYYY HH:MM:SS +0900] |
From: | メールの作成者の名前・メールアドレスを表示。 [From: “NAME” <NNNN@XXXX.co.jp>] |
Message-ID: | メールを一意に識別する「msg-id」が指定。 |
TO:/CC:/BCC: | メールの宛先を表示。 |
Received: | トレースフィールド、経由したメールサーバの処理の記録。 [Received: from XXXX.co.jp ([***.***.***.***])] |
通信プロトコル
メールクライアント(MUA:Mail User Agent)がメールサーバ(MTA:Mail Transfer Agent)にメ-ルを送信する手順は以下になります。
メールクライアント | 方向 | メールサーバ |
メールサーバへ接続(Connected to -) - |
→ ← |
- オープニングメッセージを応答 |
クライアント情報を送信[EHLO] - |
→ ← |
- サポートしている拡張機能を応答 |
メッセージの差出人を指定[MAIL FROM] - |
→ ← |
- 確認を応答 |
メッセージの宛先を指定[RCPT TO] - |
→ ← |
- 確認を応答 |
メッセージの送信開始を要求[DATA] - |
→ ← |
- 確認を応答 |
メッセージの送信 - |
→ ← |
- 確認を応答 |
切断を要求[QUIT] - |
→ ← |
- 確認を応答 |
切断(Connection closed by -) | → | - |
SMTPコマンド
SMTPコマンドは、メールの送信や情報の確認に使われます。主なSMTPコマンドは以下になります。
コマンド | 内容 |
HELO(Hello) EHLO(Extended Hello) |
クライアントの接続元の確認 |
MAIL(Mail) | メッセージの送信者の指定 |
RCPT(Recipitent) | メッセージの受信者の指定 |
DATA(Data) | メッセージの送信開始を指定 |
RSET(Reset) | 接続状態のリセット |
QUIT(Quit) | セッションの切断 |
SMTP応答コード
SMTP応答コードは3桁で構成され、最初の1桁目は応答が成功/失敗したといったコマンドの結果が分かるようになっています。
コード | 内容 |
1yz | コマンドの確認待ち |
2yz | コマンドの成功 ・220:サービスの準備完了(Service ready) ・221:転送チャネルを閉じる(Service closing transmission channel) ・250:正常終了(Requested mail action okay, completed) |
3yz | コマンド途中の応答 ・354:メールメッセージの入力(Start mail input; end with <CRLF>) |
4yz | 一時的なエラー ・451:コマンドが中断(Requested action aborted; error in processing) |
5yz | 恒久的なエラー ・500:構文エラー(Syntax error, command unrecognized) |