【Postfix】メッセージヘッダ

## はじめに

- メールヘッダについて勉強したことをメモ。
- `RFC2822` の `3.6. Field definitions` を要約したような何か。

## メッセージの概要

- 電子メールメッセージは以下の2つから構成される。
   - メッセージヘッダ
   - メッセージ本体
- メッセージヘッダのフィールドは `RFC2822` にて規定されている。
  - https://www.rfc-editor.org/pdfrfc/rfc2822.txt.pdf
- 最低限必要なヘッダフィールドは `Date:` と `From:` のみ。
- メッセージヘッダとメッセージ本体との間は空白行で区切られる。

## ヘッダフィールド

### `Date:`

- メッセージ送信を開始した時間を表す。
- 必須フィールド。

### `From:`, `Sender:`, `Reply-To:`

- `From:` はメッセージの著者を、`Sender:` はメッセージの送信者を表す。
- `From:` は必須フィールド。
- メッセージの著者と送信者が同一の場合、 `Sender:` フィールドを使用すべきではない。
- これらのフィールドを使い分けるケースとして、`RFC2822` では、メッセージの作成者が、その送信を秘書に代理させる例が挙げられている。
- `Reply-To:` はメッセージの著者が返信先として提案するもの。

### `To:`, `Cc:`, `Bcc:`

- おなじみ、メールクライアントで指定するアレ。
- `Bcc:` フィールドが定義されているメッセージについて、、 `RFC2822` では次のいずれかの実装を規定している。
   1. `Bcc:` フィールドを削除して、 `To:`, `Cc:`, `Bcc:` で指定された全ての宛先に同一のメッセージを送る。
   1. `To:` 及び `Cc:` で指定された宛先には、 `Bcc:` フィールドを削除した同一のメッセージを送信する。`Bcc:` の宛先が A,B,C の 3 人いる場合、 A に送信されるメッセージの `Bcc:` フィールドから B,C が削除される。
   1. 値が定義されていない、空の `Bcc:` フィールドを持つメッセージとして送信する。
- ちなみに `To:` は必須フィールドではない模様。たいていのメールクライアントではここを指定しないと送信できないため直感的ではないが。

### `Subject:`

- おなじみ、メールクライアントでは「件名」として表示されるアレ。
- `RFC2822` では同節にて `Comments:`, `Keywords:` が規定されているが、あまり使われていないようなので読み飛ばした。

### `Return-Path:`, `Received:`

- これらのフィールドについては「 `RFC2821` を見ろ」とのことなので、 https://www.rfc-editor.org/pdfrfc/rfc2821.txt.pdf をみてみる。
- が、メールリレーの勉強をしないと理解できなさそうだったので今回は断念。

## エンベロープアドレス

- メッセージヘッダの `To:` フィールドは、実際にメッセージが配信される場所とは関係ない。
- 実際にメッセージ配信を制御するのは **エンベロープアドレス** と呼ばれるもので、これは **ヘッダではなく SMTP 対話によって指定される** 。
- ふつう MUA で `To:` フィールドを指定すると、それがエンベロープアドレスになる。
- しかし上述の通り、 `To:` は必須フィールドではないため、全てのケースで `To:` フィールドの値とエンベロープアドレスとが一致するとは限らない。 

- `sendmail` コマンで実験してみる。
- まずはヘッダ指定なしで、実在するアドレスを直接引数に指定して送信。
- ちなみに `sendmail` コマンドに対話的コンソールのようなものはない。ヘッダのキー含め全て自分で入力する。ピリオドを入力してエンターを押すと送信される。

  ```
  [ec2-user@public-a ~]$ sendmail test@gmail.com
  
  this is test
  .
  [ec2-user@public-a ~]$ 
  ```

- 受信先のメールクライアントでヘッダを見てみると、 `To:` フィールドが定義されていないことがわかる。

  ```
  Delivered-To: test@gmail.com
  Received: by 2002:a2e:91d6:0:0:0:0:0 with SMTP id u22-v6csp1659422ljg;
          Sun, 4 Nov 2018 07:47:53 -0800 (PST)
  ...
  （省略）
  ...
  Received: by public-a.localdomain (Postfix, from userid 1000) id BE8039076; Mon,
    5 Nov 2018 00:47:52 +0900 (JST)
  Message-Id: <20181104154752.BE8039076@public-a.localdomain>
  Date: Mon,
    5 Nov 2018 00:47:48 +0900 (JST)
  From: EC2 Default User <ec2-user@public-a.localdomain>
  
  this is test
  ```

- 次に、 `To:` フィールドを指定して送信してみる。 

  ```
  [ec2-user@public-a ~]$ sendmail test@gmail.com
  To:hoge
       
  this is test
  .
  [ec2-user@public-a ~]$ 
  ```

- 先ほど同様、受信先のメールクライアントでヘッダを見てみると、 送信元にて指定した `To:` フィールドが確認できた。 `To:` フィールドは受信先の制御を行っていないことがわかる。

  ```
  Delivered-To: test@gmail.com
  Received: by 2002:a2e:91d6:0:0:0:0:0 with SMTP id u22-v6csp1662552ljg;
          Sun, 4 Nov 2018 07:51:58 -0800 (PST)
  ...
  （省略）
  ...
  Received: by public-a.localdomain (Postfix, from userid 1000) id 2B9979076; Mon,
    5 Nov 2018 00:51:57 +0900 (JST)
  To: hoge@public-a.localdomain
  Message-Id: <20181104155157.2B9979076@public-a.localdomain>
  Date: Mon,
    5 Nov 2018 00:51:47 +0900 (JST)
  From: EC2 Default User <ec2-user@public-a.localdomain>
  
  this is test
  ```
## つづく

- EC2 からのメール送信申請や `/etc/postfix/main.cf` による設定は何もやっていないので、このへんの勉強は次回。

## 参考文献

- Kyle D. Dent (著), 菅野 良二 (翻訳) (2004) 『Postfix実用ガイド』オライリー・ジャパン