メールサーバ再入門


#メールシステム
メールの送受信をサーバで実現にあたりメールサーバの構築が不可欠。
メール配送に関する知識を身に着けるためにメールの送受信システムを構築するための設定例などを備忘録として記述する。SMTPサーバにはPostfixを利用する。

#Postfix
有名なオープンソースのメール送信サーバである。メールのリレーや流量制御など様々な高度な機能も持っている。設定ファイルの本体は/etc/postfix/main.cfである。パラメータの詳細は以下。

#1.基本パラメータ詳細

これだけやれば、とりあえずローカルからローカルだったり、SMTP認証等が必要ないメールサーバにはメールを送れるという基本的な設定。

<strong>`myhostname`</strong>
メールサーバ自身のホスト名をFQDNで指定。これ自体が何かの動作に関連するのではなく、他のパラメータから参照されるデフォルト値として使われる。
例)myhostname=xxx.domain名

<strong>`smtp_helo_name`</strong>
宛先のメールサーバーとSMTP接続した際に、SMTP EHLOコマンドで送るホスト名。このとき、このホスト名がDNSで正引きできないと、宛先のメールサーバーから受信拒否されます。ここでは、DNSで正引きできる（＝Aレコードが存在する）ホスト名を指定します。
「アプリケーションからのメール送信時にFromアドレスのドメインとして使用する名前」を設定するのが確実。
もしマルチドメインのWebサービスを稼働させ、Fromアドレスも複数のドメインを使用するなら、何でもよいので自社で管理するドメインの、DNSで正引きできるホスト名を指定します。なお、DNS正引きのIPアドレスと、Postfixを設定するサーバーのIPアドレスが一致する必要は無い。
例)smtp_helo_name = $myhostname 

<strong>`mydomain`</strong>
メールサーバのドメインを指定。これ自体が何かの動作に関連するのではなく、他のパラメータから参照されるデフォルト値として使われる。
例)mydomain=domain名

<strong>`myorigin`</strong>
ローカルからローカルへ投函されたメールがどのドメインから来たかを自動的に補完してくれる際の文字列を定義。要するに～@ドメイン名の部分のこと。
例)myorigin=$mydomain

<strong>`inet_interfaces`</strong>
待ち受ける（＝Listenする）ネットワークアドレスを指定。
メールを送信するのみで、外部からは一切受信、リレーせずサーバー自身でのローカル配送のみ場合はlocalhostで十分。
例)inet_interfaces＝localhost

<strong>`mydestination`</strong>
mydestinationでは、メールを外部に送信せずに、このサーバーローカルへ配送処理するドメインのリストを指定。要するに、他のメールサーバに配送せずに自メールサーバ宛のドメイン指定。
例)mydestination=$myhostname,localhost.$mydomain,localhost,$mydomain

<strong>`mynetwork`</strong>
メールリレーを許可するホストのIPアドレスリスト、レンジを指定する。サーバー自身でのローカル配送のみ行う場合は127.0.0.1でOK。
仮に0.0.0.0/0 として、ファイアウォールの設定でTCP/25のInbound通信を許可すると、
外部からフルオープンなリレーサーバーとなりスパムメール送信の踏み台となり得るので注意が要
例)127.0.0.1

<strong>`inet_protocols`</strong>
inet_protocolsで、Postfixが使用するインターネットプロトコルを指定
例)inet_protocols=ipv4

<strong>`masquerade_domains`</strong>
送信元メールアドレスのサブドメイン部分（ホスト名の部分）を削除するオプション設定
例)masquerade_domains=$mydomain

<strong>`luser_relay `</strong>
存在しないローカルユーザに対してのメールの転送先を指定する。この際、local_recipient_mapsには例のように何も指定しないようにする。
例)
luser_relay = others@domain名
local_recipient_maps =

<strong>`message_size_limit`</strong>
1通あたりの受信メールサイズ制限(byte)
例)message_size_limit=5120000


例)メール配送
デフォルトだとMailbox形式といって全メールがmail_spool_directoryで指定したディレクトリ配下のユーザ名ファイルの1ファイルに格納される。１メール１ファイル方式にしたければ、Maildir形式(`home_mailboxパラメータに指定したディレクトリが各ユーザのホームディレクトリに作られ、その中に１メール１ファイルで保存される方式`)を取るべき。

```ruby:
#メール送信
echo TestMessage | mail -s TestMail cent@localhost

#メール確認
cat /var/spool/mail/cent
～～～
From root@xxxxxxx.xyz  Sun Jan 26 17:50:16 2020
Return-Path: <root@xxxxxxxx.xyz>
X-Original-To: cent@localhost
Delivered-To: cent@localhost.xxxxxxxx.xyz
Received: by mail.xxxxxxxx.xyz (Postfix, from userid 0)
        id C768092D8EC; Sun, 26 Jan 2020 17:50:16 +0900 (JST)
Date: Sun, 26 Jan 2020 17:50:16 +0900
To: cent@xxxxxxxx.xyz
Subject: TestMail
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <20200126085016.C768092D8EC@mail.xxxxxxxx.xyz>
From: root@xxxxxxxx.xyz (root)

TestMessage

```

#2.SMTP認証・SSL/TLS暗号化

メールサーバは、各組織のローカルネットワークからのみ利用するメールサーバのみであれば問題ないが、実際には外部の完全に信頼できないネットワークからのメールを配送する役割を担ったほうがインターネットの世の中では便利である。そのため、外部からのメールを受け付けるときはID・パスワードによって認証することでSPAMメールの踏み台などに使われないようにする必要がある。この認証のことをSMTP認証と呼ぶ。またメールソフト-MTA間、MTA-MTA間の通信をSSL/TLSで暗号化する仕組みもあるので実装は必須。

ちなみにSMTP認証はSASL認証というものをPostfixは使っている。Postfix自体のライブラリではない。主にはUNIX認証によるOSユーザを経由した認証の仕組み、個別のDBを作って認証する仕組みがある。
参考)https://oxynotes.com/?p=4428


Postfix的に、自サーバがSMTPクライアントになるパターン（要するに外部のメールサーバがSMTP認証を要している）/SMTP認証サーバになる2パターンが主に用途として存在するので、両方についてどう構築するのか記載してみる。

##①SMTPクライアント側の場合の話

主に外部のメールサーバをリレー先にするような場合で、対象のメールサーバがSMTP認証を要求しているときに設定する内容。例としてgmailをリレー先とするパターンを想定する。

###クライアント向けパラメータ

`smtp_sasl_auth_enable` 
SMTPクライアント認証の有効化
例)smtp_sasl_auth_enable = yes

`smtp_sasl_security_options`
Postfix SMTP クライアントで使用する認証メカニズム
例)smtp_sasl_security_options = noanonymous
 
`smtp_tls_security_level`
リレー先 SMTP サーバとの通信でSSL・TLS通信を使うか制御。
例)smtp_tls_security_level= may

- none 暗号化なし
- may 宛先メールサーバがSSL/TLSに対応していれば暗号化通信するが、対応していなければ平文通信となる。(STARTTLS)
- encrypt 暗号化通信強制

`smtp_tls_CAfile`
CA証明書（認証局証明書）を指定する。Root CA 証明書が ca-certificates パッケージに含まれているためそれを使うと便利。
例)smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt

`smtp_tls_protocols`
SMTPクライアントとして利用する暗号化プロトコルを指定。
例)smtp_tls_protocols = smtp_tls_protocols = !SSLv2, |SSLv3, !TLSv1

`smtp_tls_loglevel`
SMTPクライアントとして暗号化通信する際のログの出力レベル。1にすれば、暗号化プロトコル、スイートが出るためおすすめ。
例)smtp_tls_loglevel=1

###メールをリレーする際の方法

(1)リレー先が単一の場合
`relay_host`
リレー先メールサーバ指定
例)relayhost = [smtp.gmail.com]:587

(2)宛先ドメインごとに配送先SMTPサーバを分ける場合
`transport_maps`
指定したファイル内の定義で宛先ドメインごとに配送先メールサーバを分ける。」
例)transport_maps = hash:/etc/postfix/transport

下記の例だと、hoge.ne.jpはローカルのSMTPサーバでメール配信、
gmail.comはGMAILのSMTPサーバ経由、それ以外はxxx.xxx.xxx.xxxのSMTPサーバ経由  

```ruby:
hoge.ne.jp   :
gmail.com      smtp:[smtp.gmail.com]:587
*              xxx.xxx.xxx.xxx
```
```ruby:リレー先定義ファイルのhashdb化。かつ元ファイルも消しておけばパスワード漏洩のリスクが軽減。
postmap /etc/postfix/transport
```

- リレー先に認証がSMTPがある場合

`smtp_sasl_password_maps`
リレー先サーバのアドレスと、認証で使用するユーザ名/パスワードを記述したファイルを指定する。
例)smtp_sasl_password_maps = hash:/etc/postfix/relay_password

```ruby:パスワードマップファイルの中身例(GMAILサーバ)
[smtp.gmail.com]:587  username:password
```
```ruby:パスワードファイルのhashdb化。かつ元ファイルも消しておけばパスワード漏洩のリスクが軽減。
postmap /etc/postfix/relay_password
```

`参考`
http://www.maruko2.com/mw/Postfix_%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%AA%E3%83%AC%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A_(SMTP_%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88_%2B_SMTP_Auth)

- リレー先SMTPサーバがGMAILの場合の考慮(アプリパスワード)

GMailに対してメールを送る場合は、googleアプリ以外の信頼できないデバイスにあたるので生成したアプリパスワードを以下のpasswordに指定する。

```ruby:パスワードマップファイルの中身例(GMAILサーバ)
[smtp.gmail.com]:587  username:<アプリパスワード>
```

`参考`
https://codeforfun.jp/how-to-send-email-with-postfix-and-gmail/


##②SMTPサーバ側の場合の話

企業内部のNW上のメールサーバとして、企業内からの各ユーザのメールを認証した後、外部またはローカルに配送するようなケースを想定

###サーバ向けパラメータ
`smtpd_sasl_auth_enable`
SMTP認証を有効化・無効化を制御するパラメータ。認証を有効化する場合はyes
例)smtpd_sasl_auth_enable=yes

`smtpd_sasl_security_options`
SMTP認証に関するオプション。

例)smtpd_sasl_security_options=may

`smtpd_sasl_local_domain`
認証要求が来たユーザのドメインを暗黙的に指定する。例えば認証ユーザがtest1の場合、test1.smtpd_sasl_local_domain と解釈する
例)smtpd_sasl_local_domain = $mydomain

`smtpd_relay_restrictions`
メールサーバとしてメールを配送するための条件を指定する。例では、mynetworksに含まれるクライアントからの配送要求は認証なしで配送、SMTP認証が通ったクライアントのメールも配送、それ以外は配送しないことを意味する。
例)smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

`smtpd_use_tls`
SMTPサーバとしてSSL/TLS認証をするか否か。
例)smtpd_use_tls=yes

`smtpd_tls_security_level`
SSL/TLS認証の種別を定義

- none 暗号化なし
- may クライアントがSSL/TLSに対応していれば暗号化通信するが、対応していなければ平文通信となる。(STARTTLS)
- encrypt 暗号化通信を強制

例)smtpd_tls_security_level=may

`smtpd_tls_key_file`
SSL/TLS認証に用いる秘密鍵ファイルを指定
例)smtpd_tls_key_file=/etc/postfix/ssl/server.key

`smtpd_tls_cert_file`
SSL/TLS認証に用いる証明書ファイルを指定
例)smtpd_tls_cert_file=/etc/postfix/ssl/server.crt

`smtpd_tls_protocols`
許容する暗号化プロトコルを指定
例)smtpd_tls_protocols = !SSLv2 !SSLv3

`smtpd_tls_loglevel`
SMTPサーバとして暗号化通信する際のログの出力レベル。1にすれば、暗号化プロトコル、スイートが出るためおすすめ。
例)smtpd_tls_loglevel=1

###サブミッションポート/SMTPsポート開放
前提としてメールサーバとしてはスパムの踏み台にならないように信頼できるNWに関しては25番で受けるでよいと思うが、それ以外からはSMTP認証を必須とすべき。その際にメールクライアント側から指定すべきポートを開ける。
このために/etc/postfix/master.cfを編集する。master.cfの-oオプションの各パラメータで各サービスに関してデフォルト値のmain.cfを上書きできる

<strong>`サブミッションポート(587)`</strong>
用途としては主に送信専用のポート。SMTP認証を必須として、Starttls前提で構成するのがベストプラクティス。
メールソフトがSSL/TLSを使えないなどの事情がある場合に利用するべき。ただし暗号化通信を保証しない。
暗号化を必ずしも必須としない587と暗号化を必須とする465を併用すべきと考える。

```ruby:/etc/postfix/master.cfでコメント解除する、または追加すべき項目
submission inet n       -       n       -       -       smtpd
   -o syslog_name=postfix/submission
   -o smtpd_tls_security_level=may
```

<strong>`SMTPsポート(465)`</strong>
用途としては主に送信専用のポート。SMTP認証を必須として、SSL/TLS前提で構成するのがベストプラクティス。
基本方針、自社のメールクライアントからの通信としてはこちらを使うべき。

```ruby:/etc/postfix/master.cfでコメント解除する、または追加すべき項目
smtps     inet  n       -       n       -       -       smtpd
   -o syslog_name=postfix/smtps
   -o smtpd_tls_security_level=encrypt
```

smtpd_tls_security_levelに関して,may(SSL/TLS必須ではない),encrypt(SSL/TLS必須)とも、基本的な動きとしてはSMTPクライアントからの接続時に、STARTTLSをクライアント側にアナウンスする。その後、クライアントがSTARTTLSするか否かを選択(パケット的にはSTARTTLSと宣言)するが、mayの場合は選択してもしなくてもメールが送信可能、encryptの場合は選択しないとメールは送れないという動き的な違いで現れる。勿論、mayの場合でSTARTTLSを選択しない場合は平文でメールが送信される。


###補足: smtpd_tls_wrappermode(TLSラッパーモード)に関して

TLSは時々、STARTTLSサポートをアナウンスしてクライアントがTLSサービスを要求(STARTTLS)するのではなく、サーバが常にTLSを使う、非標準 "ラッパー" モードを構成することがある。smtpd_tls_wrappermode=yesにするとこのモードが有効化される。一部の古いクライアント(Outlook [Express] )ではこの "ラッパー" モードを利用するのでこのパラメータをyesにする必要性がある。ただ多くのクライアントはサーバからのSTARTTLSアナウンスを受けてSTARTTLSを発行する動きをするため、有効化してしまうと正常にメールが送信できなくなる可能性もある。

`参考`
http://www.postfix-jp.info/trans-2.3/jhtml/TLS_README.html


#3.動作確認方法&パケット解析

###・SASL 認証するために経由するsaslauthdが正常に稼働しているか確認

```
# saslauthd 稼働状態で実行
testsaslauthd -u mailuser1 -p xxxxxxx -s smtp
0: OK "Success."
```


###・telnet によるメール送信テスト(25 番ポート)
メールサーバが SMTP サーバになる場合を想定して、メール送信ができるか検証
以下項目を SMTP セッション内で入力する。

- EHLO クライアントからメールサーバへ挨拶。適当な文字列で良いが慣習的に自分のホスト名等。
- MAIL FROM メール送信元
- RCPT TO メール送信先
- DATA メールの主題と本文。.を押すとメールがキューに入り送信される

```ruby:telnetによるsmtp通信

# telnet <MAILサーバ> 25
Trying 10.10.3.25...
Connected to <MAILサーバ>.
Escape character is '^]'.
220 mail.xxxxxxxx ESMTP Postfix
EHLO localhost
250-mail.xxxxxxxx
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: root
250 2.1.0 Ok
RCPT TO: mailuser1
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
subject: TestMessage
TestTestTest
.
250 2.0.0 Ok: queued as 0C8F99179EF
quit       
221 2.0.0 Bye
Connection closed by foreign host.
```

###・openssl によるメール送信テスト(587, 465 番ポート)
メールサーバがSMTPサーバになる場合を想定して、メールを認証や暗号化を介してメール送信できているか検証。
SSL/TLS 暗号化するため、telnet では対応不可のため、openssl　を使う。

- EHLO クライアントからメールサーバへ挨拶。適当な文字列で良いが慣習的に自分のホスト名等。
- AUTH PLAIN [SMTP認証用のユーザ・パスワードのハッシュ(※)]
- MAIL FROM メール送信元
- RCPT TO メール送信先
- DATA メールの主題と本文。.を押すとメールがキューに入り送信される

(※)以下コマンドで生成
`printf '<ユーザ名>\0<ユーザ名>\0<パスワード>' | base64`

```ruby:opensslによるsmtp通信(starttls+smtp認証)

# openssl s_client -connect <MAILサーバ>:587 -crlf -ign_eof -starttls smtp
CONNECTED(00000003)
depth=0 C = XX, L = Default City, O = Default Company Ltd, CN = too
verify error:num=18:self signed certificate
verify return:1
depth=0 C = XX, L = Default City, O = Default Company Ltd, CN = too
verify return:1
---
Certificate chain
 0 s:/C=XX/L=Default City/O=Default Company Ltd/CN=too
   i:/C=XX/L=Default City/O=Default Company Ltd/CN=too
---
Server certificate
-----BEGIN CERTIFICATE-----
〜〜〜〜〜〜〜〜
-----END CERTIFICATE-----
subject=/C=XX/L=Default City/O=Default Company Ltd/CN=too
issuer=/C=XX/L=Default City/O=Default Company Ltd/CN=too
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1734 bytes and written 450 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 037148755E71A85808FDD745392441217182736B7310B9913E35F06103648DAB
    Session-ID-ctx: 
    Master-Key: DA3FA1001F3A07BAA13ABC126870FE1B048F682054398481A60A5A4775D38CDEE8E0FDFBAD9A52161AEF1AD6ED88CACE
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - 9e 4e 87 d8 86 6c a9 32-91 91 60 9d c5 c2 19 bf   .N...l.2..`.....
    0010 - 0e 60 19 34 e6 7e d7 84-24 bc f6 95 09 31 32 e3   .`.4.~..$....12.
    0020 - bd 6d 34 46 b2 a2 a5 b9-b5 eb 15 f7 ae a5 aa 9d   .m4F............
    0030 - 05 ec 5f 47 e6 44 45 72-74 4d 92 ef 01 ea 4d 0a   .._G.DErtM....M.
    0040 - d5 de af ea c7 3a e3 94-d9 9d fe ff 0a 58 9f fa   .....:.......X..
    0050 - 0a d6 71 ac ab 4d 30 c0-36 fc 6d 7f ec c2 56 a3   ..q..M0.6.m...V.
    0060 - 12 9a c1 d4 72 3b 86 80-df 9d 28 17 d0 5d 1b 8d   ....r;....(..]..
    0070 - 32 91 8a 04 30 c9 b0 2b-30 e1 49 4a 22 9c 31 c6   2...0..+0.IJ".1.
    0080 - 01 43 06 12 b9 cf a6 61-da 07 53 04 6c f6 85 44   .C.....a..S.l..D
    0090 - 82 51 9d 84 fc 3c 93 12-24 10 9a f6 91 56 41 b6   .Q...<..$....VA.

    Start Time: 1584975125
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
250 DSN
EHLO localhost
250-<MAILサーバ>
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN bWFpbHVzZXIxAG1haWx1c2VyMQBQI3NzdzByZA==
235 2.7.0 Authentication successful
MAIL FROM: root
250 2.1.0 Ok
RCPT TO: mailuser1
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
subject: TestMessage
TestTestTest
.
250 2.0.0 Ok: queued as EEE7F9179EF
quit
221 2.0.0 Bye
closed
```

もし、smtps通信(465番ポート)へ通信を行ってメール送信する場合は、ポート番号の変更、及び openssl コマンド発行時に -starttls オプションを外せばOK。


#4送信ドメイン認証に関して(!!!)

メールアドレスは、アットマークを挟んで、ユーザ名とドメイン名に分割されている。
SMTP AUTHを用いれば、ユーザ名の部分が認証できるようになるが、加えてドメイン名の部分まで認証できれば、メールアドレスを詐称することができなくなる。現在だと、ほとんどのメールサービスでドメイン認証を行っていないメールはSPAM扱いされる可能性が高いので自メールサーバからGMAIL等他のメールシステムをリレー等しない限りはドメイン認証の仕組みを実装する必要がある。勉強がてら作るが、実際は既にこの仕組みが施されたメールサーバ（GoogleのGMAILやAWSのSESだったり）をリレーする構成にするのが妥当か。。。

主要なドメイン認証かつ両方とも実装されていないとSPAM扱いされる可能性の高い技術としてSPFとDKIMというものがある。

`参考`
https://salt.iajapan.org/wpmu/anti_spam/admin/tech/kiso/
http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/
http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/
http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/tls-arc/


##SPF(Sender Policy Framework)

SPFは、送信サーバを宣言する仕組み。メールの送信元ヘッダーに対する検証を行うイメージ。
SPFの送信側は、ドメインに対する送信サーバのIPアドレスをDNSに登録する。メール配送の際、受信側では、まずSMTPコネクションの送信側のIPアドレス(a)を取得。また、SMTP MAIL FROMに指定されたメールアドレスからドメイン部分を取り出す。そのドメインに対しDNSを検索して、宣言された送信サーバのIPアドレス(b)を得る。(a)が(b)に合致していれば、そのドメインの正式な送信サーバから送られてきたことがわかる。
<strong>=ドメイン認証成立!!!!!</strong>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245585/c1e6ea5d-e023-9ed8-2a46-27435daa4519.png)


下記のように対象ドメインのSPFレコードを登録するとOK。IPアドレスは受信サーバが送信元として認識するものを指定（NAT変換等に注意）

```ruby:SPFレコード
#IPで指定
メールドメイン(例:xxx.com.) TXT "v=spf1 ip4:対象許可IP -all"

#自ドメインのMXレコードと同値と指定
メールドメイン(例:xxx.com.) TXT "v=spf1 mx -all" 
```
`SPFチェックツール`
https://dmarcian.com/spf-survey/


##DKIM(DomainKeys Identified Mail)

DKIMは、ドメインレベルでメールに署名し、その署名を検証する仕組みである。メールのBODY部分に対しても送信元ドメインが妥当かを検証するイメージ。
DKIMの送信側は、まず公開鍵と秘密鍵の組を作成する。公開鍵をDNSで公開し、秘密鍵はメール送信側サーバにインストールされている状態。メールを送る際は、この送信サーバが秘密鍵を用いてメールに署名を行う。ちなみにこの時、メールの内容（本文とメール・ヘッダ）を基に電子署名を作成してメールのヘッダに付与する。受信側では、署名の部分からドメイン名を特定し、それに対する公開鍵をDNSから得ます。そして、その公開鍵を使って署名をきちんと複合ができるかどうかを検証する。
<strong>=ドメイン認証成立!!!!!</strong>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245585/29903069-7aae-fe5e-13c6-83e828db539e.png)

`DKIMチェックツール`
https://dmarcian.com/dkim-inspector/

DKIM環境を送信サーバ側で構築する方法。下記のようなやり方が非常に参考になる。正直結構大変↓
`参考`
https://www.abten.net/2018/03/1576/



#5.Postfixキュー操作

送信予定のメールをため込んでいるキューの情報を参照・操作する。deferd等で送信できなかったメールがたまっているので不要ならば削除も視野に入れるべき。
1送信予定メール=1キューの組合せで存在する。

###キュー確認
```ruby:
postqueue -p
```

###特定キューの削除
```ruby:
postsuper -d {QUEUE_ID}
```

###キュー全削除
```ruby:
postsuper -d ALL
```

###キュー強制送信
```ruby:
postsuper flush
```

`参考`
https://server-setting.info/debian/postfix-submission-smtp-auth.html
https://hacknote.jp/archives/21277/
https://access.redhat.com/articles/1468593

#(番外)AWS内でOP25Bになっている件

基本的に緩和申請を出さないとOutbound25ポートへは出られないというAWSのネットワーク(SG等クラウド基盤のFWを全て許可していたとしても。)。実際に外部のメールサーバへtracerouteを試行してみたところ、その通りの動き。（日本リージョンのVM⇒アメリカリージョンのVM。

```ruby:Outbound25ポート(TCP)へ

#宛先(35.221.110.8)に対して一向に途中の経路も現れないのでそもそもAWS内で止まっているように見える。
#少なくとも後述の587ポートに対しては27hop以内で到達、かつ途中の経路も表示されているため。。。
00:08:35[root@bat1 ~]### traceroute -m 255 -n -T -p 25 vm1
traceroute to vm1 (35.221.110.8), 255 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *
>>>結局255hopまでこの状態

```

```ruby:Outbound587ポート(TCP)へ

#宛先(35.221.110.8)へ最終的には到達しているのでOK。数回Tryしてみたが27hop目でいずれも到達

00:03:08[root@bat1 ~]### traceroute -m 255 -n -T -p 587 vm1
traceroute to vm1 (35.221.110.8), 255 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  100.65.14.33  0.794 ms 100.65.13.129  0.281 ms 100.65.15.225  0.279 ms
 7  52.93.29.43  0.660 ms 52.93.29.57  0.777 ms 52.93.29.201  0.945 ms
 8  100.100.2.46  0.849 ms 100.100.2.32  1.352 ms 100.100.2.40  0.651 ms
 9  99.82.181.25  0.825 ms 99.82.181.23  1.018 ms 99.82.181.25  0.829 ms
10  108.170.240.97  1.687 ms 216.239.56.168  0.859 ms 209.85.241.240  1.025 ms
11  108.170.246.3  1.274 ms  1.351 ms 108.170.246.67  1.216 ms
12  216.239.50.93  1.500 ms 209.85.244.167  1.576 ms 108.170.235.157  7.397 ms
13  209.85.252.46  19.933 ms  19.525 ms 209.85.253.248  38.466 ms
14  209.85.247.5  29.461 ms 72.14.232.70  29.222 ms 209.85.247.5  29.452 ms
15  * 108.170.233.245  63.965 ms 209.85.241.247  67.582 ms
16  108.170.236.125  150.061 ms 108.170.235.221  153.702 ms 108.170.235.217  150.913 ms
17  216.239.63.135  149.033 ms 216.239.63.163  150.572 ms 209.85.244.184  153.596 ms
18  72.14.234.66  154.659 ms 209.85.244.63  153.007 ms 209.85.244.34  155.181 ms
19  108.170.246.193  156.344 ms 108.170.246.225  155.033 ms 108.170.245.193  151.871 ms
20  209.85.249.56  152.675 ms 216.239.63.168  153.405 ms 216.239.42.230  149.249 ms
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  35.221.110.8  150.130 ms  153.630 ms  154.011 ms
```

#(番外)メール送信テスト用の便利コマンド

```ruby:メール送信テスト
echo "テストメール" | mail -s $Subject -S $SMTP_Server -r $From_Address $To_Address
```

| -s | メール件名を指定 |
|:--|:--|
| -S | SMTPを指定（例:smtp=smtp://192.168.1.10:587） |
| -r | 送信元メールアドレスを指定 |
| $To_Address | 宛先アドレスをコマンドの最後に指定 |