⚠️ 記事内に広告を含みます。

SMTPメール送信プロトコルの仕組み

SMTPメール送信の仕組み

メールの送受信は直接PC同士がやり取りしているわけではなく、メールサーバーが仲介しています

メールの送信と受信の仕組みの一つであるSMTPについて簡単に解説していきます。

SMTPとは?

SMTP (Simple Mail Transfer Protocol)はメールの送信を行うプロトコルです。メールの受信に関してはPOPやIMAPなどのプロトコルが担当します。

Thunderbirdなどのメーラーで作成されたEメールはSMTPを使ってSMTPサーバー(メールサーバー)に送信されます。そして、SMTPサーバーは相手のメールサーバーにSMTPを使って送信します。

SMTPの動作

SMTPの動作 SMTPの機能は手紙を郵便局に届けて、相手の郵便ポストに入れるまでの過程と例えられることが多い。

smtpはポートはTCP25番を使います。

メールアドレスからサーバーのIPアドレスを取得する

メールを送るにはメールアドレスが必要です。メールアドレスが住所のようなものです。

メールアドレスは「user@example.com」というような形式になっています。アドレスの「@」以下「example.com」はメールサーバーのドメイン名を表しています。

しかし、ドメイン名だけでは送信することができません。メールサーバーのIPアドレスが必要です。

このドメイン名「example.com」からIPアドレスを取得するにはDNSを使います。

DNSの機能と役割DNSとは?仕組みをわかりやすく解説

DNSはドメイン名からIPアドレスを取得する仕組みです。

まず、example.comのホスト名を取得するためにDNSのMXレコードを参照して「ma.example.com」が得られます。

さらにAレコードを参照すればホスト名「ma.example.com」からIPアドレスを正引きできます。

メールアドレスからアドレス取得の流れ

メールアドレスからアドレス取得の流れ。送信にはメールサーバーのアドレスが必要。1)メールアドレスtest@gmail.comからDNSを使ってメールサーバーのIPアドレスを入手、2)得られたアドレス先にメールを送信

実際にgmailのアドレス「xxxx@gmail.com」からDNSを使ってメールサーバーのIPアドレスを取得してみます。

ドメイン名からIPアドレスを取得するにはdigコマンドを使います。「dig gmail.com MX」

gmailのMXレコード

gmailのDNSレコード。MXレコードはドメイン名:メールサーバのアドレス、Aレコードメールサーバのアドレス:IPアドレス

gmail.com.をもとにDNSを使ってSMTPメールサーバーのドメイン名を調べます。googleが提供するほどなのでメールサーバーはたくさんあります。alt4.gmail-smtp-in.l.google.com.がメールサーバーのひとつです。さらにこのドメイン名をもとにIPアドレスを取得すると「74.125.204.26」というアドレスが手に入ります。これでメールサーバーのIPアドレスを取得し、通信できるようになりました。

xxxx@example.comの名称

メールアドレスはxxx@example.comというように分かれています。前半部分はユーザー名アカウント名と呼びます。後半部分はドメイン名(ホスト名)と呼びます

SMTPの仕組み

メールクライアントからSMTPでメールサーバーに接続してメールを送信する流れは

  1. メールサーバーにTCP25番で接続
  2. メールサーバーから応答コードを受け取る
  3. メールクライアントがEHLOコマンドでクライアントのホスト名を名乗る
  4. MAIL FROMコマンドで差出人のメールアドレスを入力
  5. RCPT TOコマンドで宛先のメールアドレスを入力
  6. DATAコマンドで本文を入力する
  7. メール送信
  8. QUITで終了

これがSMTPのメール送信までの流れです。

SMTPメールのやり取り

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を使ってメールサーバー構築をしたい方はこちら!

参考 15.3. メール転送エージェント (MTA) Red Hat Enterprise Linux 7 | Red Hat Customer PortalRed Hat Customer Portal

sendmail

Sendmailは古くから使われているMTAの一つです。古くから利用されていて機能が豊富ですが、セキュリティーホールのできやすさなど信頼性に関する不安があります。Postfixと比べて設定などが難しいことが欠点です。

qmail

sendmailよりも高速かつシンプルな動作かつ高い信頼性が特徴です。セキリュティを考慮したアプリケーション設計がされていますが、更新頻度が低いのが欠点です。

Exim

EximはLinux系OSで使用されているMTAです。細かい設定がしやすいのが特徴で、シェアの半分近くを占めるなど多くの導入実績があります。

SMTPコマンド メール送信

smtpコマンドを使って実際にメールを送ってみましょう。

telnetでsmtpサーバー(25番ポート)に接続してSMTPコマンドでメールを送信します。

telnet smtp.example.com 25
EHLO localhost.localdomain
MAIL FROM: root@localhost.localdomain
RCPT TO: test@example.com
DATA
This is a test mail
.
QUIT

このようにSMTPコマンドを使ってメール送信できます。

上の例ではSMTPのコマンドが5つ登場しました。

  1. EHLO:拡張SMTPを呼び出す。古いHELOもあるが使わない。
  2. MAIL:FROMを入力するコマンド
  3. RCPT:TOを入力するコマンド
  4. DATA:本文を入力するコマンド
  5. 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

このようにメールコマンドでメール送信可能です。

エンベロープとメールヘッダ

届いたメールの中身を見ると以下のような構造になっていると思います。

From: 送信者 <test@example.com>
To: komeyan@netdekagaku.com
日付: 2020/04/01 13:00
件名: メールの件名
送信元:example.com
署名元: example.com
本文:こんにちは!これはテストメールです!

緑の部分はメールヘッダと呼ばれる送信者や受信者、日付などの情報が書かれている本文以外の部分です。メールヘッダの下に本文が書かれます。

ではメール送信を行うサーバーなどはこのメールヘッダに書かれている宛先のアドレスをみて送信しているのか?というとそうではありません。SMTPサーバーなどのメール送信サーバーはこのメールヘッダではなく「エンベロープ」と呼ばれる部分をみてメールを送信しています。

メール送信はSMTPコマンドやMailコマンドを使って送信します。この時に入力するFROMやTOの情報を使ってサーバーにメールを送信します。

MAIL FROM: root@localdomain
250 2.1.0 Ok
RCPT TO: scholar@localdomain

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です