メールの送受信は直接PC同士がやり取りしているわけではなく、メールサーバーが仲介しています
メールの送信と受信の仕組みの一つであるSMTPについて簡単に解説していきます。
SMTPとは?
SMTP (Simple Mail Transfer Protocol)はメールの送信を行うプロトコルです。メールの受信に関してはPOPやIMAPなどのプロトコルが担当します。
Thunderbirdなどのメーラーで作成されたEメールはSMTPを使ってSMTPサーバー(メールサーバー)に送信されます。そして、SMTPサーバーは相手のメールサーバーにSMTPを使って送信します。
smtpはポートはTCP25番を使います。
メールアドレスからサーバーのIPアドレスを取得する
メールを送るにはメールアドレスが必要です。メールアドレスが住所のようなものです。
メールアドレスは「user@example.com」というような形式になっています。アドレスの「@」以下「example.com」はメールサーバーのドメイン名を表しています。
しかし、ドメイン名だけでは送信することができません。メールサーバーのIPアドレスが必要です。
このドメイン名「example.com」からIPアドレスを取得するにはDNSを使います。
DNSはドメイン名からIPアドレスを取得する仕組みです。
まず、example.comのホスト名を取得するためにDNSのMXレコードを参照して「ma.example.com」が得られます。
さらにAレコードを参照すればホスト名「ma.example.com」からIPアドレスを正引きできます。
実際にgmailのアドレス「xxxx@gmail.com」からDNSを使ってメールサーバーのIPアドレスを取得してみます。
ドメイン名からIPアドレスを取得するにはdigコマンドを使います。「dig gmail.com MX」
gmail.com.をもとにDNSを使ってSMTPメールサーバーのドメイン名を調べます。googleが提供するほどなのでメールサーバーはたくさんあります。alt4.gmail-smtp-in.l.google.com.がメールサーバーのひとつです。さらにこのドメイン名をもとにIPアドレスを取得すると「74.125.204.26」というアドレスが手に入ります。これでメールサーバーのIPアドレスを取得し、通信できるようになりました。
メールアドレスはxxx@example.comというように分かれています。前半部分はユーザー名やアカウント名と呼びます。後半部分はドメイン名(ホスト名)と呼びます
SMTPの仕組み
メールクライアントからSMTPでメールサーバーに接続してメールを送信する流れは
- メールサーバーにTCP25番で接続
- メールサーバーから応答コードを受け取る
- メールクライアントがEHLOコマンドでクライアントのホスト名を名乗る
- MAIL FROMコマンドで差出人のメールアドレスを入力
- RCPT TOコマンドで宛先のメールアドレスを入力
- DATAコマンドで本文を入力する
- メール送信
- QUITで終了
これがSMTPのメール送信までの流れです。
SMTPのセキリュティについて
これまでにメール送信に関するSMTPの役割について説明してきました。
SMTPを使ってメールを送信するSMTPサーバーにはある問題があります。
それはSMTPサーバーは「認証機能が無いこと」です。
認証機能が無いので悪意のある第三者が勝手にSMTPサーバーにメールを送信しても受け付けてしまい、不特定多数の人に送り付けるスパムメールが問題になります。
認証の対策として、POPサーバーの認証機能を利用して接続・認証してからでないとSMTPサーバーへの接続要求を受け付けない「POP before SMTP」という方法が古くは利用されていました(POPは昔からあるので対応しやすいため)。
SMTP Auth (SMTP Authentication)はSMTPの拡張機能でもともとSMTPになかった認証機能(SASL)を利用可能にするものです。現在はSMTP Authが利用されています。SMTPAuthではユーザー名とパスワード認証が利用できます。
SMTPのメール送信はTCPポート25番が利用されますが、SMTP Authはサブミッションポート587番を利用します。認証が無いポート25番はスパム対策のためISPのネットワーク内以外の通信は遮断されています(OP25B : Outbound Port 25 Blocking)。
SMTP Authはユーザー名やパスワードが平文で送信される問題
SMTP Authを使うと認証によりSMTPサーバーの不正利用を減らすことができます。しかし、ユーザー名やパスワード、メール文は暗号化されないので、盗聴される危険があります。そこで、暗号化方法としてSSL(Secure Socket Layer)を利用するSMTP over SSL (SMTPS : 465番)がありうます。SSLを利用することでメッセージ全体を暗号化することができるのでセキュリティを考える場合はこちらを利用すべきでしょう。
クライアントからの受付と中継を分担
SMTPサーバーはメールの送受信を担っていますが、クライアントからのメールの受付や他メールサーバー宛てのメールを中継する役目も担っています。
中継は信頼しているネットワーク以外のものを受け付けるとスパムメール送信の踏み台にされる危険にさらされます。そこで、メールサーバーの負担分散とセキリュティの対策のためクライアントからのメールの受付と他メールサーバー間の送受信を行うメールサーバーを分担する方法がとられます。他メールサーバーとの送受信を行わないメールサーバーの機能をMSA (Message Submission Agent)といいます。
メールサーバーソフトウェア
メールの送信を行うために利用されているソフトウェアを紹介します。
Postfix
PostfixはUnixで利用されているMTAソフトウェアです。Postfixは高速、互換性の高さ、信頼性の高さなどが特徴です。Sendmailに代わるメール転送エージェント(MTA:Mail Transfer Agent)として開発されています。バランスの良いソフトウェアとして定評があります。postfixは現在でも開発が進行しているMTAであり( 最新版3.4.9 / 2020年2月3日)、最もおすすめのMTAです。
商用LinuxディストリビューションであるRed Hat Enterprise Linuxではsendmailとpostfixの2つが標準のMTAとして搭載されていますが、sendmailは非推奨となっています。
Postfixを使ってメールサーバー構築をしたい方はこちら!
sendmail
Sendmailは古くから使われているMTAの一つです。古くから利用されていて機能が豊富ですが、セキュリティーホールのできやすさなど信頼性に関する不安があります。Postfixと比べて設定などが難しいことが欠点です。
qmail
sendmailよりも高速かつシンプルな動作かつ高い信頼性が特徴です。セキリュティを考慮したアプリケーション設計がされていますが、更新頻度が低いのが欠点です。
Exim
EximはLinux系OSで使用されているMTAです。細かい設定がしやすいのが特徴で、シェアの半分近くを占めるなど多くの導入実績があります。
SMTPコマンド メール送信
smtpコマンドを使って実際にメールを送ってみましょう。
telnetでsmtpサーバー(25番ポート)に接続してSMTPコマンドでメールを送信します。
EHLO localhost.localdomain
MAIL FROM: root@localhost.localdomain
RCPT TO: test@example.com
DATA
This is a test mail
.
QUIT
このようにSMTPコマンドを使ってメール送信できます。
上の例ではSMTPのコマンドが5つ登場しました。
- EHLO:拡張SMTPを呼び出す。古いHELOもあるが使わない。
- MAIL:FROMを入力するコマンド
- RCPT:TOを入力するコマンド
- DATA:本文を入力するコマンド
- QUIT:終了
他には誤って入力したのをやり直すRESETコマンドなどがあります。
SMTP応答コード
クライアントがSMTPコマンドを使ってSMTPサーバーにリクエストを送信する時、サーバー側はレスポンスとして3桁の応答コードを返します。HTTPの応答コードと同じような形式です。
- 2xx:成功(250は完了)
- 3xx:待機
- 4xx, 5xx:エラー、未完了、文法のエラー等
MAILコマンドでメール送信
メールコマンドを用いてメール送信も可能です。
mail user@example.com
Subject: tset mail
this is test mail
.
EOT
このようにメールコマンドでメール送信可能です。
エンベロープとメールヘッダ
届いたメールの中身を見ると以下のような構造になっていると思います。
To: komeyan@netdekagaku.com
日付: 2020/04/01 13:00
件名: メールの件名
送信元:example.com
署名元: example.com
本文:こんにちは!これはテストメールです!
緑の部分はメールヘッダと呼ばれる送信者や受信者、日付などの情報が書かれている本文以外の部分です。メールヘッダの下に本文が書かれます。
ではメール送信を行うサーバーなどはこのメールヘッダに書かれている宛先のアドレスをみて送信しているのか?というとそうではありません。SMTPサーバーなどのメール送信サーバーはこのメールヘッダではなく「エンベロープ」と呼ばれる部分をみてメールを送信しています。
メール送信はSMTPコマンドやMailコマンドを使って送信します。この時に入力するFROMやTOの情報を使ってサーバーにメールを送信します。
250 2.1.0 Ok
RCPT TO: scholar@localdomain