メール技術概要

# はじめに
はじめに、メール技術について体系的な知識を得たいと思い、増井敏克さんが書かれた「実めで使える メール技術の教科書」という書籍を読みました。
ネットワークの学習をしていて、DNSやメールの分野とTCP/IPという考え方を紐づけるのが難しいと思っていたので、ずっと興味がありました。
詳しくは著書を購入していただければと思いますが、私の備忘録も兼ねて簡単にまとめたいと思います。


# MTA / MUA / MDA
* MUA (Mail User Agent) : メールの確認や作成を行うユーザインターフェース
→ユーザ側のアプリケーションで使用されるプログラム
* MTA (Mail Transfer Agent) : メールの転送を行う
→SMTPプロトコルを用いてMUAからサーバ、サーバから他のサーバへメールを転送する。(sendmail, Postfix, etc.)

* MDA (Mail Delivery Agent) : メールの配送
→MTAで受信したメールを受信者に配送


# 送受信の概要
メールの送受信の概要を以下に示します。

![sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/2bbad510-068e-82b2-9438-a5510842a28d.png)


1. メール送受信者は`MUA`を使ってメールの処理を行います。
2. メール送信者の`MUA`からメールアドレスの契約元のSMTPサーバの`MTA`にSMTPプロトコルを使ってメールを転送します。SMTPサーバは宛先のメールアドレス（エンベロープFROM）を確認し、DNSサーバにIPアドレスを問い合わせ、該当のPOP/IMAPサーバの`MTA`にメールを転送します。
3. POP/IMAPサーバの`MTA`から`MDA`を使ってメール保存領域にメールを格納します。
4. メール受信者の`MUA`から`MDA`にPOPやIMAPなどのプロトコルを使ってメールを取得します。


この一連の流れによってメール技術は成り立っています。

直接クライアント同士でメールを送受信しない理由は、通信相手のマシンがシャットダウンしていた場合にメールを配送できないためです。そのため、サーバ同士でメールを送受信するのです。

# メールアドレス
一般的にメール技術もTCP/IPと同様の通信方式です。メールアドレスはIPアドレスという形式からかなりかけ離れていて、同一視しにくいですが、きちんとDNSサーバにIPアドレスを問い合わせて、メールを転送しています。

以下の様なメールアドレスがあったとします。
```
taro@example.com
```

このメールアドレスは`taro`と`example.com`に分解することができます。
`example.com`がドメインに該当します。ドメインとはIPアドレスをIPアドレスを識別するための文字列を意味します。
`taro`がドメインに対するユーザを識別するための文字列です。

ドメインはメール技術以外にも、webサイトのURIにも用いられます。つまり、DNSサーバというIPアドレスとドメインの対応関係を管理するサーバを通じてメールアドレスからIPアドレスを取得し通信をしているのです。

# メール技術
ここではメール技術について紹介します。


メールは以下のようにエンベロープとメール本文の2つから構成されています。
![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/ed241db9-fd68-ba3f-d67b-faa13dd0324e.png)

エンベロープは以下の情報が含まれます。
```
From : taro@example.com
To : jiro@example.com
```
これらの情報を一般的にエンベロープFrom, エンベロープToなどと言います。エンベロープの部分はユーザは意識する必要がないです。メールソフトに出てくる宛先や差出人とは異なるためです。エンベロープはSMTPで利用されます。

メール本文は以下の情報が含まれます。
```
From : taro@example.com
To : jiro@example.com

ありがとう。
...
```
ここに記載されている情報がメールソフトでの差出人や宛先、本文として表示されている部分です。





## SMTP
SMTP : Simple Mail Transfer Protocolというプロトコルのことで、メールを転送するためのプロトコルです。主に25番ポートを使います。近年では、スパムメールの対策として、25番ポートを使わないことが多いので、主にと記載しています。

基本的にはドメインの取得時に契約したプロバイダのSMTPサーバにMUAからメールが転送され、宛先の受信サーバにメールを配送します。

## POP / IMAP
* POP : Post Office Protocolというプロトコルで、メール受信サーバのMDAからメールを取得する。
* IMAP : Internet Message Access Protocolというプロトコルで、メール受信サーバのMDAからメールを取得する。POPとは異なり、`MUA`がメールを受信しても受信サーバからメールが削除されない。

APOP : POP/IMAPではメールを受信するために認証が必要である。その際にユーザIDやパスワードが平文で送信されてしまわないようにハッシュ化して送信するプロトコルである。

## DNSとメールアドレス
DNSサーバではメールアドレスのドメインのトップレベルドメイン（末尾）から順に対応するサーバが用意されています。トップドメインに対して、次のドメインに対応するDNSサーバを問い合わせ、最後のDNSサーバからドメインに対応するIPアドレスを取得します。

## MIME
基本的にメールは文字しか扱えませんでした。しかし、時代に合わせて画像やHTMLなど文字以外の書式にも対応する必要が出てきました。そこでMIME (Multipurpose Internet Mail Extensions)という規格ができました。

MIMEのメール構造はメールをパートという区分に分割します。これはMIMEマルチパートといいます。各パートごとにContent-Typeを指定して画像や文字列などを扱うことができる様にしています。

## 暗号化
通常SMTPやPOP/IMAPなどのプロトコルでは暗号化を行いません。そのため、通信経路上で盗聴や改竄されるリスクが存在します。
* SMTPS : TLSというプロトコルを使って電子メールの暗号化を行う。
→TLS : メールサーバに秘密鍵と証明書を配置し、証明書に記載さ入れている公開鍵で暗号化を行う。

* STARTTLS : プロトコルではなく、コマンドです。メールサーバとのコネクション確立時に、EHLOというコマンドを送信します。SMTP拡張機能をサポートしている場合は、暗号化を行って通信を行う。
* MTA-STS : 受信側のメールサーバが送信側のメールサーバに対してTLS1.2以上を使うことを求めるためのものです。

* POP3S : TLSというプロトコルを使って電子メールの暗号化を行う。
* IMAP4S : TLSというプロトコルを使って電子メールの暗号化を行う。

![sample3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/a60e2e34-e395-a64c-fed9-ac61033eac0c.png)




* S/MIME : デジタル証明書を使って、メール本文自体を暗号化します。
上記の方法で通信経路上の通信を暗号化しても、肝心のメール本文が暗号化されていないと意味がないです。そこで、PKIという公開鍵基板を用いてメール本文を暗号化する方法がS/MIMEです。

![sample4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/649606f4-4776-7ce0-dba9-af1618b28279.png)



## SPF / DKIM / DMARC / DNSSEC

* SPF : エンベロープFromのドメインと送信元のメールサーバのIPアドレスが一致しているかを受信側のメールサーバがDNSサーバに問い合わせて確認する。

![sample5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/21d53541-3594-ccd4-515d-cdca02ad40bb.png)

* DKIM : 公開鍵暗号方式を使ってメールのヘッダーや本文から作成したデジタル署名をメールにふかし、メールサーバがその署名を検証する。

![sample6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/ff4fc01c-0f2e-3a1b-b9b4-d258d79cf5c1.png)



* DMARC : DNSサーバに設定したSPFやDKIMの情報に加え、ヘッダーのFromの情報を組み合わせて送信ドメインを認証する。

* DNSSEC : 権威DNSサーバから送信されるDNSデータが改竄されていないかを確認する技術。権威DNSサーバがDNSデータを秘密鍵で署名し、フルサービスリゾルバが権威DNSサーバの公開鍵で署名を検証する。

![sample7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/b3f4f8f1-cf7e-d59f-8acb-b13324c7dcd9.png)


# 参考文献
* 増井 敏克.「実務で使える メール技術の教科書」.株式会社翔泳社.2024
* [【Linux】MTA、MDA、MRA、MUAの違いと役割](https://linux.joho.info/command/mta-mda-mra-mua/)
* [Qiita : MUA/MTA/MDA それぞれの働き](https://qiita.com/nanbuwks/items/042ea3a834aab6a1e7e2)
* [MTAとは？ メール転送エージェントの概要と機能、代表的な製品について解説](https://baremail.jp/blog/2021/11/30/1746/)
* [What is a domain name? | Domain name vs. URL](https://www.cloudflare.com/learning/dns/glossary/what-is-a-domain-name/)
* [STARTTLSとは？ メールのTLS暗号化の仕組みから設定・確認方法](https://baremail.jp/blog/2022/08/24/2735/)
* [DNSSECの仕組み](https://www.cloudflare.com/ja-jp/learning/dns/dnssec/how-dnssec-works/)