本記事は素人の大学生が執筆しており、専門家の監修は受けておりません。そのため、正確性に関してご指摘や補足がございましたら、ぜひコメント欄でお知らせください。
(仕組みや流れについては、後々記述する予定です。)
そもそも何でこんな記事書くようになったの?
・卒論でメールサーバーを使うor自分で立てるかもしれない。
・純粋に身近で使われているプロトコルの仕組みが気になった。
そもそもメールサーバーってなんだよ
一言でいうと、メールサーバーは、電子メールの送受信を管理する役割を持ったサーバーである。インターネット上でメールを送信する際に、送信者のメールソフト(例:Outlook、Gmailなど)がメールサーバーに接続し、そこでメールが処理されて受信者のメールサーバーにお届けされる。このプロセスを通じて私達は日常的に電子メールを利用している。
メールサーバーの主な役割
- メールの受信と保存
・受信したメールをユーザーごとに整理し適切に保存する。 - メールの送信
・ユーザーから送信されたメールを目的の受信者のサーバーに転送する。 - スパムやウイルスのフィルタリング
・不正なメールや有害な添付ファイルを検出し、ユーザーの受信ボックスを保護する。
主なプロトコル
SMTP(Simple Mail Transfer Protocol)
概要
役割:メールの送信&中継
動作:クライアントからメールを受取、宛先のメールサーバーに転送。
ポート番号:通常はポート25、セキュアな通信ではポート465(SMTPS)やポート587(SMTP Submission)を使う。
特徴:
・テキストベースのプロトコル
・メールのキューイング機能がある。つまり一時的に保存出来る。
・認証(SMTP AUTH)や暗号化(STARTTLS)をサポート。
仕組み(流れ、イメージ)
主な処理の流れ
1.接続処理の開始。
クライアントがSMTPサーバーの指定ポートに接続(それに対してサーバーはウェルカムメッセージを返す。)
2.EHLO/HELOコマンド
・EHLOコマンド
拡張SMTPの開始。クライアント側が自分のホスト名を送信し、サーバーは利用可能な拡張機能(AUTH,STARTTLS,SIZEなど)を返す。
・HELOコマンド
拡張SMTP以外の場合に実行する自己紹介コマンド
3.認証(任意)
・SMTP AUTHコマンドを利用し、ユーザー認証行う。
例:AUTH LOGINやAUTH PLAIN
・認証が必要な場合、認証に成功しないとその後の送信処理が拒否される事もある。
4.STARTTLS(任意)
・暗号化通信を開始する場合、STARTTLSコマンドを送信
・サーバーが暗号化準備完了のレスポンス(例:220 Ready to start TLS)を返した後、TLSハンドシェイクを行い、その後の通信は暗号化される。
5.メールの送信の開始
・ここで送信者、受信者(宛先)のメールアドレスを指定する。
使用するコマンド(C:クライアント S:サーバー)
・EHLO/HELO
SMTPセッション開始時の自己紹介。EHLOは拡張機能の問い合わせも兼ねる。
C: EHLO client.example.com
S: 250-mail.example.com Hello client.example.com
S: 250-PIPELINING
S: 250-SIZE 10240000
S: 250-STARTTLS
S: 250-AUTH PLAIN LOGIN
S: 250 8BITMIME
・MAIL FROM
送信者のメールアドレスを指定する。以降の処理はこの送信元情報に紐づく。(一回きりで変更は出来ない。)
C: MAIL FROM:<sender@example.com>
S: 250 2.1.0 Ok
・RCPT TO
受信者のメールアドレスを指定する。(これに関しては複数回の指定が可能。)
C: RCPT TO:<recipient@example.com>
S: 250 2.1.5 Ok
・DATA
メールのヘッダーおよび本文の送信を開始する。
※ 終了は「.」で示す事になっている。
C: DATA
S: 354 End data with <CRLF>.<CRLF>
C: Subject: Test Email
C: From: sender@example.com
C: To: recipient@example.com
C:
C: This is a test email.
C: .
S: 250 2.0.0 Ok: queued as 12345
・RSET
現在進行中のメール送信トランザクションをリセットし、再度最初からやり直す。
C: RSET
S: 250 Ok
・NOOP
何の処理も行わず、接続確認などに利用
C: NOOP
S: 250 Ok
・QUIT
セッションを終了する。(送信途中のメールはキャンセルされる。)
C: QUIT
S: 221 2.0.0 Bye
・AUTH
SMTP認証を実施し、正当なユーザーかどうかを確認する。
C: AUTH LOGIN
S: 334 VXNlcm5hbWU6 // 「Username:」のBase64表現
C: dXNlckBleGFtcGxlLmNvbQ== // ユーザー名(例)
S: 334 UGFzc3dvcmQ6 // 「Password:」のBase64表現
C: cGFzc3dvcmQ= // パスワード(例)
S: 235 2.7.0 Authentication successful
C: AUTH PLAIN dXNlckBleGFtcGxlLmNvbQBwYXNzd29yZA==
S: 235 2.7.0 Authentication successful
・STARTTLS
通信の暗号化を開始するためのコマンド。
C: STARTTLS
S: 220 Ready to start TLS
SMTPのエラーハンドリング
成功例
250:要求が正常に処理された。
354:DATAコマンドに対し、メール本文の入力を促す。
エラー例
500:コマンドが認識されない、またはシンタックスエラー
550:要求されたアクション(例:メールの配送)が拒否された(例:存在しないメールボックスなど)
POP3(Post Office Protocol version 3)
概要
役割:受信したメールをユーザーのデバイスにダウンロード
動作:ユーザーがサーバーに接続し、メールをローカルに保存。通常、サーバー上のメールは削除されるように成っている。
ポート番号:通常はポート番号110、セキュアな通信ではポート995(POP3S)
特徴:
・シンプルなプロトコルでメールを一度にダウンロード出来る。
・オフラインでのメール閲覧に適している。
・複数のデバイス間でのメール同期には向いていない。
・家の郵便ポストには郵便局(post Office)の人が届けてくれるよね?と考えて覚えれば混乱しない。
仕組み(流れ、イメージ)
図2.POP3の簡易的なフローグラフ
主な処理の流れ
1.接続確立:クライアントがメールサーバーに接続する。
2.認証:ユーザー名とパスワードを使用して認証を行う。(結構オーソドックス)
3.メールの取得:サーバー上のメールをクライアントにダウンロードする。
4.削除オプション:ダウンロードした後に、サーバー上のメールを削除するかどうかを選択する。(基本は削除するようになってる)
5.切断:セッションをここで初めて終了する。
認証で使用するコマンド(C:クライアント S:サーバー)
・USER
認証するユーザー名を指定する。
C: USER example@example.com
S: +OK User accepted
・PASS
認証するユーザーのパスワードを指定する。
C: PASS yourpassword
S: +OK Logged in
・APOP
USERコマンド、PASSコマンドの認証の代わりに使用する。
ここでユーザー名とハッシュ化されたパスワードを一斉に送信する。
C: APOP example@example.com dcd97e36f67da0d
S: +OK Logged in
・AUTH
IMAP4認証を行う。(どうやらPOP3では一般的ではないらしい、飽くまでも"拡張"として使われる事がある。)
C: AUTH PLAIN dXNlcjpwYXNz
S: +OK Authentication successful
・QUIT
ログアウト処理。
C: QUIT
S: +OK Goodbye
トランザクションで使用するコマンド
・STAT
メールメッセージの数とサイズの問い合わせ
C: STAT
S: +OK 2 320
一言解説:2
はメールの総数、320
は総バイト数を示す。
・LIST【メッセージ番号】
メールメッセージ番号とそれぞれのサイズの問い合わせ
全メールを取得する場合
C: LIST
S: +OK 2 messages (320 octets)
S: 1 120
S: 2 200
S: .
特定のメールサイズを取得する場合
C: LIST 1
S: +OK 120 octets
・RETR
指定されたメッセージ番号のメッセージ全体のダウンロード要求
C: RETR 1
S: +OK 120 octets
Subject: Test Email
From: sender@example.com
This is the body of the email.
.
一言解説:.
の前にメール全体の内容が記述される。
・DELE
指定されたメッセージ番号のメッセージ削除要求
C: DELE 1
S: +OK message 1 deleted
・NOOP
何もしない
C: NOOP
S: +OK
一言解説:どうやら接続が維持されているかどうかを確かめるために使うらしい。
・RSET
認証確立後発生した削除処理を全て取り消す
C: RSET
S: +OK
・TOP メッセージ番号 Line数
指定されたメッセージ番号のメッセージの指定されたLine分だけを表示する。
C: TOP 1 10
S: +OK
Subject: Test Email
From: sender@example.com
Date: Wed, 1 Apr 2020 12:34:56 +0000
This is the body of the email.
.
一言解説:メールのヘッダと最初の10行の本文が返される。
・UIDL [メッセージ番号]
メッセージunique-idの問い合わせ
全てのメッセージのUIDを取得する。
C: UIDL
S: +OK 2 messages
S: 1 dcd97e36f67da0d
S: 2 e4f1a0b9c8d3e4f5
S: .
特定のメッセージのUIDを取得する場合
C: UIDL 1
S: +OK 1 dcd97e36f67da0d
・QUIT
ログアウト処理。
C: QUIT
S: +OK Goodbye
一言解説:QUITコマンドは認証やトランザクション両方のコマンドで使われるコマンドであり、削除指示があったメッセージはこの時点でサーバーから削除される。(つまりセッション終了の本当に直前に消される。)
各コマンドに対するエラーハンドリング
POP3では、各コマンドに対して成功か失敗かを示すレスポンスコードが返されます。(この辺はHTTP通信とかでイメージが持ちやすいと思います。)
例:認証に失敗したレスポンス
-ERR invalid password
例:メール取得時のエラー
-ERR no such message
例:不正なコマンド
-ERR invalid command
などなどです!!
IMAP(Internet Message Access Protocol)
概要
役割:サーバー上でメールを管理し、複数デバイスからアクセス可能にする。
動作:これも受信側のプロトコル、ユーザーがサーバーに接続し、メールを閲覧・操作。メールはサーバー上に保持される。また、変更はリアルタイムで反映される。
ポート番号:通常はポート番号143、セキュアな通信ではポート993(IMAPS)
特徴:
・メールのフォルダ管理や検索機能が充実。
・同期機能に優れ、複数のデバイスで一貫したメール状態を保持。(出来れば常にインターネット接続しといてね。)
仕組み(流れ、イメージ)
図3.IMAPの簡易的なフローグラフ
主な処理の流れ
1.接続
クライアントがサーバーのIMAPポート(デフォルトでは143番ポートとなっている。)
2.認証フェーズ
LOGINコマンドなどを使い認証を行う。
3.トランザクション
SELECTコマンドなどを使い任意のメール操作をする。
4.ログアウト&切断(LOGOUT)
セッション終了。
・LOGIN
C: A001 LOGIN user@example.com yourpassword
S: A001 OK LOGIN completed
ここでA001のようにタグクライアントが送るコマンドにはタグが付与されるプロトコルとなっている。(これがPOP3との違い)
・AUTHENTICATE
C: A002 AUTHENTICATE PLAIN
S: +
C: AHVzZXJAZXhhbXBsZS5jb20AcGFzc3dvcmQ= // Base64エンコードされた"user\0password"
S: A002 OK AUTHENTICATE completed
さらに安全な認証方式(SASLなど)を用いる場合に使用。
・SELECT / EXAMINE
C: A003 SELECT INBOX
S: * 120 EXISTS
S: * 2 RECENT
S: A003 OK [READ-WRITE] SELECT completed
SELECT INBOX:INBOXフォルダを読み書きモードで選択。
EXAMINE INBOX:INBOXフォルダを読み取り専用で選択。
・FETCH
C: A004 FETCH 1 BODY[]
S: * 1 FETCH (BODY[] {310})
S: Return of full message data....
S: A004 OK FETCH completed
→メッセージ番号(この例では1番)のメール本文全体(BODY)を取得する。また、部分取得したい場合は、BODY[HEADER]などを指定できる。
・SEARCH
C: A005 SEARCH FROM "sender@example.com"
S: * SEARCH 1 2 10
S: A005 OK SEARCH completed
→指定した条件に合致するメールを検索し、該当メッセージ番号を返す。
・STORE
C: A006 STORE 1 +FLAGS (\Seen)
S: * 1 FETCH (FLAGS (\Seen))
S: A006 OK STORE completed
→既読処理、この場合メッセージ番号1番に既読フラグ(\Seen)を付与する。
・COPY
C: A007 COPY 1:5 "Archive"
S: A007 OK COPY completed
→1番から5番までのメールを"Archive"フォルダにコピーする。(削除はしない)
ここでのアーカイブフォルダってなんだよ???
→メールソフトのアーカイブフォルダに該当メールをコピーするよってことらしい。
・UID
C: A008 UID FETCH 100:105 (BODY[])
S: * 100 FETCH (BODY[] {250} ...)
S: * 101 FETCH (BODY[] {230} ...)
S: ...
S: A008 OK UID FETCH completed
→メールをUID(一意なID)で指定して操作する。重複や番号のズレをここで避けることができるらしい。
・LOGOUT
C: A009 LOGOUT
S: * BYE IMAP4rev1 Server logging out
S: A009 OK LOGOUT completed
→セッションを終了をここで示す。
認証と暗号化(このあたりは別途でページを用意しようと思います。)
認証
・SMTP AUTHを使用して、送信者が正当なユーザーであることを確認。
・SPF(Sender Policy Framework)、DKIM(DomainKeys Identified Mail)、DMARC(Domain-based Message Authentication, Reporting & Conformance)などの技術を用いて、送信元の信頼性を確保。
暗号化
・STARTTLSやSSL/TLSを使用して、メールの送受信時にデータを暗号化。
・メールサーバー間の通信も暗号化することで盗聴や改ざんを防止。
メールサーバーの効率的な運用
メールサーバーを効率的に運用するっていうのはどういう事なのか...。
スケーラビリティと負荷分散
スケーラビリティ
ユーザー数やメールの量の増加に対応出来るように、サーバーのリソースを柔軟に拡張する。
仮想化技術やクラウドサービスを活用して、必要に応じたリソース調整が可能。
負荷分散
複数のメールサーバー間でトラフィックを分散し、過負荷を防止。
ロードバランサーを手前に設置し、効率的なリクエスト処理を図る。
ログ管理とモニタリング
ログ管理
メールサーバーの動作状況やエラーメッセージを記録。
トラブルシューティングやセキュリティインシデントの解析に活用。
モニタリング
サーバーの稼働状況やパフォーマンスをリアルタイムで監視。
アラートシステムを導入し、異常が発生した際に迅速で対応。(おそらく、IDS/IPSのことかと)
ちょっとした語呂合わせ紹介(とてもいい記事を見つけたので)
↑の記事を引用すると....。
スマー(SMTP)トなポップ(POP3)スターから今(IMAP)きたよ
"電子メールの仕組みと、送受信で使うプロトコルの説明|POPとIMAPの違い。SMTPとは。prau-ict.com様より"
参照日2024年12月15日
文脈的にもPOPよりもSMTPのほうがスマートだし、かなりいい語呂合わせだと思います!
素晴らしい感謝...。
近年では利便性の高さから、IMAPの方が人気を博しているそうです。(まぁ、そりゃあそうですよね。)
参考&引用文献(いずれも参照日2024年12月15日)
・マスタリングTCP/IP―入門編―(第6版)
井上 直也 (著), 村山 公保 (著), 竹下 隆史 (著), 荒井 透 (著), 苅田 幸雄 (著)
ISBN-13:978-4274224478 出版社:オーム社