mac mini 2018 (macOS Catalina) にてメール送信(postfix)サーバを立ち上げる（GMailへのリレー設定）

##1. はじめに
ずっと止まっていたmac miniでのサーバ構築。
久しぶりの投稿となります。

今回は、mac miniにてメール送信(postfix)サーバを立ち上げることにしました。

##2. 目次

```
 1. はじめに
 2. 目次
 3. インストールについて（必要ないんです。）
 4. /etc/postfix/main.cfの編集
 5. GMailにてアプリパスワードの生成
 6. sasl_passwdの作成
 7. org.postfix.custom.plistの作成と適用
 8. 動作確認
 9. 終わりに
10. 参考文献
```

##3. インストールについて（必要ないんです。）
Mac mini 2018を購入した2019年8月当初は、macOSはMojaveでしたが、その後Catalinaにバージョンアップしております。
Catalinaからシェルがbashからzshに変わっているなど、かなり大きな変更が加えられており、戸惑いました。
特にドライブ直下に作成したフォルダがなくなったときは本当に焦りましたよ。
（別の場所に移動していただけだった。。。が、勝手に動かすなよ！　セキュリティのためとはいえ。。。）
サーバ用途でMacを使っている人は色々驚かされたんじゃないでしょうか。

さて、本題に戻りまして、postfixですが、macOS Catalinaではすでにインストールされております。
UNIX OSを扱う方々には釈迦に説法となりますが、UNIXやLinuxは元々SMTPサービスが動いており、何かあったときにrootにメールが届く仕組みになっております。
Macも今はUNIX OSなので、その例に漏れずSMTPサービスが入っているのです。

昔UNIX OSやLinuxではSMTPサービスはsendmailが主流でした。（最近Linux触れてないので今はあまり知らないけどw）
でもどうやらMacではpostfixを採用しているようですね。

その関係なのか、Homebrewにもpostfixはいないようです。
（tapを加えればいるかもしれないけど。。。）


ということで、このpostfixを使って設定していきます。

##4. /etc/postfix/main.cfの編集
postfixの設定ファイルは`/etc/postfix/`に入っています。
この中にある`main.cf`に設定を追加していきます。
送信時のリレー先サーバはGMailとします。
Googleアカウントにて2段階認証を設定している想定で、
以下を末行に追加します。
（現在、GMailではメール送信時に送信サーバが受け付ける際、認証しているようです。）

```/etc/postfix/main.cf追加
relayhost=[smtp.gmail.com]:587                                 # gmailのSMTPサーバ（sasl_passwdで指定するからひょっとしたら要らないかも？）
smtp_sasl_auth_enable=yes                                      # SASLでの認証を有効
smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd          # 認証情報データベースを指定（sasl_passwd）
smtp_sasl_tls_security_options=noanonymous                     # SASL及びTLSセキュリティオプション(noanonymous)
smtp_sasl_mechanism_filter=digest-md5 cram-md login plain      # SASLメカニズムの指定
smtp_tls_security_level=may                                    # TLSセキュリティレベルを指定（may）
```
##5. GMailにてアプリパスワードの生成

上記にも書きましたが、
現在、GMailではメール送信時に送信サーバが受け付ける際、認証しているようです。
しかし、Googleアカウントでは2段階認証を設定することが推奨されており、その設定を促されています。
この2段階認証は人の手を介さないと色々なサービスの操作ができない仕組みになっているのですが、
例えばメールの送受信など、自動で取得したり送信したりしたいようなアプリには、特別のパスワードを発行する仕組みになっています。
それがアプリパスワードです。

以下のリンクにアクセスしてください。

[Googleアカウントのセキュリティ設定ページにアクセス](https://myaccount.google.com/security "Google アカウント")

※ログインを訊いてきたらログインしてください。

次に、以下の場所のアプリパスワードをクリックして下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132084/25f1e2a8-df09-094a-2f21-954f2faed2ec.png)

もう一度ログインを訊いてきます。（設定を変えるということはそれだけセキュリティを求められるということ）

そうすると、以下のページになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132084/da970bc0-a7ff-9b0b-2b82-abde83f07158.png)

今まで設定したアプリパスワードのリストですね。
メールソフトなどで設定した場合はここにリストアップされます。

今回、メールサーバ用にアプリパスワードを生成するので、赤枠のところで生成していきます。
以下のように設定して、生成ボタンを押してください。

アプリの選択: メール
デバイスの選択: Mac

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132084/db7df49f-2a20-ba99-38f1-ed0f8aa7569a.png)

生成ボタンを押すと、パスワードが発行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132084/1ec6bdb9-7514-c3e5-1671-e235ec35673c.png)

この黄色の枠の中にある、4文字×4つの全16文字が生成されたアプリパスワードです。
使用するのはこの16文字ですが、実際に設定するときは間のスペースは必要なく、詰めた状態で入力します。

##6. sasl_passwdの作成

sasl_passwdに、リレー先となるGMailの認証情報を入力します。

```
sudo vim /etc/postfix/sasl_passwd
```
```/etc/postfix/sasl_passwd
[smtp.gmail.com]:587 yourmailaccount@gmail.com:xxxxxxxxxxxxxxxx
```
ここで、

`[smtp.gmail.com]:587`

はGMailの送信サーバを指定します。
送信サーバのドメインを[]で囲んでいますが、これをすることでMail Exchanger検索を防止します。

また、587はメールサーバのポート番号です。
通常、メールサーバのポートは25ですが、色々な攻撃やその中継に利用されないようにブロック（Outbound Port25 Blocking）しているケースが多く、その場合一般的に587ポートを使用します。GMailもそのようです。

`yourmailaccount@gmail.com:xxxxxxxxxxxxxxxx`

は以下の通りです。

yourmailaccount@gmail.com: あなたのメールアドレス
xxxxxxxxxxxxxxxx: 上記で生成したGoogleアカウントのアプリパスワード（16文字・スペースなし）

ファイルを生成したら、以下のコマンドを実行します。

```
sudo postmap /etc/postfix/sasl_passwd
```

すると、`/etc/postfix/sasl_passwd.db`が生成されます。

また、上記で作成した`/etc/postfix/sasl_passwd`の権限を600に変更します。

```
sudo chmod 600 /etc/postfix/sasl_passwd
```

以上でpostfix自身の設定は終わりです。

##7. org.postfix.custom.plistの作成と適用

postfixを設定したら、自動起動できるように変更する必要があります。
ただし、その前にpostfixがサービスとしてすでにlaunchdに登録されています。
これは、上記で述べたようにmacOSがUNIX OSと同様にシステムで利用しようとしているからです。
以下のコマンドで確認します。

```
sudo launchctl list | grep postfix
```
すると、下2行は以下のようになります。
```
-	0	com.apple.postfix.master
-	0	com.apple.postfix.newaliases
```
行頭が"-"であれば動いていません。
動いている場合は以下のコマンドで無効にします。

```
sudo launchctl disable com.apple.postfix.master
sudo launchctl disable com.apple.postfix.newaliases
```
実行したら再度動作確認して動いていないことを確認するようにしましょう。

次に、新たにpostfix起動用のplistを作成します。

```
sudo vim /Library/LaunchDaemons/org.postfix.custom.plist
```

```/Library/LaunchDaemons/org.postfix.custom.plist
<plist version="1.0">
<dict>
	<key>KeepAlive</key>
	<true/>
	<key>RunAtLoad</key>
	<true/>
	<key>Label</key>
	<string>org.postfix.custom</string>
	<key>Program</key>
	<string>/usr/libexec/postfix/master</string>
	<key>ProgramArguments</key>
	<array>
		<string>master</string>
	</array>
	<key>QueueDirectories</key>
	<array>
		<string>/var/spool/postfix/maildrop</string>
	</array>
	<key>AbandonProcessGroup</key>
	<true/>
	<key>StandardOutPath</key>
	<string>/var/log/mail/postfix/postfix_exec_stdouterr.log</string>
	<key>StandardErrorPath</key>
	<string>/var/log/mail/postfix/postfix_exec_stdouterr.log</string>
</dict>
</plist>
```
ここでは、postfixの実行時に標準出力、及び標準エラー出力をログとして残せるように、
logファイル出力先を指定しています。

`/var/log/mail/postfix/postfix_exec_stdouterr.log`

この場所にファイルが保存できるように、出力先のフォルダを作成します。

```
sudo mkdir -p /var/log/mail/postfix
```

ここまでしたら、サービスの登録を行います。

```
sudo launchctl load -w /Library/LaunchDaemons/org.postfix.custom.plist
```

このplistでは、自動でサービスが起動するように設定されています。
登録したらサービスは自動的に実行されます。

以下のコマンドでサービスの実行状態を確認しましょう。

```
sudo launchctl list | grep postfix
```

以下のメッセージが出たらOKです。

```
xxxxx	0	org.postfix.custom
```

xxxxxには適当な数字（プロセスID）が入ります。

もしxxxxxが-の場合、起動に失敗しています。

上記の設定をもう一度見直して下さい。
また、上記に示したログファイルが作成しているかを確認し、その中のメッセージを読んでください。
そこにヒントが隠されていることが多々あります。

また、そのファイルが作成されていない場合、それが原因でサービスが立ち上がっていないこともあります。

##8. 動作確認

サービスが立ち上がったら、実際に動作確認をします。
以下のコマンドを実行してください。

```
echo "test mail from Mac\!" | mail -s test yourmailaccount@gmail.com
```

ここで、`yourmailaccount@gmail.com`は送信先メールアドレスです。
（上記で設定したメールアドレスと異なっても構いません。）

正しく設定されていれば、メールが届くと思います。

##9. 終わりに

今回、postfixを設定してきました。
macOS Serverから色々なサービスがなくなりましたが、メールサービスがなくなったことが最も困っております。
それとカレンダーサービスですね。
QiitaでもMacでカレンダーサービスの立ち上げについての情報があまりなく、困っております。ここでその辺も記載できればと思っております。

また、GMailへのリレーをする場合の設定について、GMail側のセキュリティ向上に向けた仕様変更に伴って年々方法が変わっているようですね。
今回は2020年次点での方法を記載しましたが、変更した際はまたここで記述していきたいと思います。

##10. 参考文献
[Gmail経由で、Macでメールを送る](https://qiita.com/noracorn92/items/cfbb57d8b8df6c07fba8)
[MacでPostfixを使ってlocalhostからメールを送信する方法](https://joyplot.com/documents/2016/11/07/postfix-send-mail/)