docker mailserverでメールサーバを構築する

## はじめに
　`docker-compose`を使用して、メールサーバを構築しました。dockerには`mailserver`というコンテナがあり、それを使用すれば簡単に構築できる様です。設定ファイルも自分で作成する必要は無く、[こちら](https://hub.docker.com/search?q=mailserver&type=image)で色々な人が作成した設定ファイル一覧を見ることが出来ます。今回はダウンロード数も多く、メジャーな[tvial/docker-mailserver](https://hub.docker.com/r/tvial/docker-mailserver)を使用して、サーバを構築してみます。


## 準備するもの

docker-composeが使用できるレンタルサーバを用意して下さい。
**aws**でも**gcp**でも何でも良いです。
用意出来たら、docker-composeが使用できる様な環境設定をお願い致します。


## 手順その１　プロジェクトフォルダ作成
　最初にプロジェクトフォルダを作成して下さい。

```sh
  #プロジェクトフォルダ作成
  $ mkdir project_mail

  #プロジェクトフォルダに移動
  $ cd project_mail
```


## 手順その２　モジュール入手

　次にモジュールを入手します。

```sh
  $ wget https://raw.githubusercontent.com/tomav/docker-mailserver/master/setup.sh

  $ wget https://raw.githubusercontent.com/tomav/docker-mailserver/master/docker-compose.yml

  $ wget https://raw.githubusercontent.com/tomav/docker-mailserver/master/mailserver.env

  $ curl -o .env https://raw.githubusercontent.com/tomav/docker-mailserver/master/compose.env

  $ chmod a+x ./setup.sh

  $ ls -la
```

## 手順その３　フォルダ作成

　フォルダが作成されていない場合は、作成して下さい。

```sh
  #フォルダ作成
  $ mkdir docker-data/dms/config
  $ mkdir docker-data/dms/mail-data
  $ mkdir docker-data/dms/mail-logs
  $ mkdir docker-data/dms/mail-state
```

## 手順その４　環境変数設定

`.env`にドメイン名を追記して下さい。
一応、ここで設定しなくても、メールアドレス登録時に自動的に登録されるっぽいです。
今回はローカルドメインを指定するので、自分自身へのメール送受信のみ可能になります。


```txt
DOMAINNAME=domain.local
```

## 手順その５　ポート使用プロセスの停止

25番ポートを使用しているプロセスがあったら、停止して下さい。

```sh
#使用ポート表示（sudo使用）
$ sudo lsof -i -P | grep "LISTEN"

#25番ポートのプロセス停止
$ kill プロセスid
```


## 手順その６　コンテナ設定

コンテナを起動して、メールアドレスの登録などを行います。
ここで、登録するメールアドレスは、`sample_mail@domain.local`、パスワードは、`mailpass`になります。メールアドレスは、複数登録可能です。

```sh
  #docker-compose起動
  $ docker compose up -d

  #メールアドレス登録
  $ sudo ./setup.sh email add sample_mail@domain.local mailpass

  #ポストマスター登録
  $ sudo ./setup.sh alias add postmaster@domain.local sample_mail@domain.local

  #dkim設定
  $ sudo ./setup.sh config dkim

  #登録アドレス一覧表示
  $ sudo ./setup.sh email list

  #登録ポストマスター一覧表示
  $ sudo ./setup.sh alias list

  #docker-compose停止
  $ docker-compose down

  #docker-compose起動
  $ docker-comopse up -d

  #ログ確認
  $ docker-comopse logs
```

### 補足

補足ですが、`./setup.sh`のコマンド一覧は、下記になります。詳細は、[こちら](https://github.com/O0lele0O/docker-mailserver/wiki/Setup-docker-mailserver-using-the-script-setup.sh)や[こちら](https://polarathene.github.io/docker-mailserver/tutorials/installation-examples/)を参照してください。

```sh
#email:
    ./setup.sh email add <email> <password>
    ./setup.sh email update <email> <password>
    ./setup.sh email del <email>
    ./setup.sh email restrict <add|del|list> <send|receive> [<email>]
    ./setup.sh email list

#alias:
    ./setup.sh alias add <email> <recipient>
    ./setup.sh alias del <email> <recipient>
    ./setup.sh alias list

#config:
    ./setup.sh config dkim <keysize> (default: 2048)
    ./setup.sh config ssl

#debug:
    ./setup.sh debug fetchmail
    ./setup.sh debug show-mail-logs
    ./setup.sh debug inspect
    ./setup.sh debug login <commands>
```

## 手順その７　ポートを開く

使用しているサーバのポートを開きます。
開くポートの番号は、下記になります。

- 143
- 587
- 25

以上で、設定は終了になります。


## 実際にメールを送信してみる

それでは、実際にメールを送信してみます。
**ドメイン名に独自ドメインを使用していない場合は、自分自身にしかメールを送信できません。**
Thunderbirdなどのメールソフトに下記の設定を行います。

### 設定内容

  メールアドレス　:　sample_mail@domain.local
  パスワード　　　:　mailpass

  プロトコル : IMAP

  受信メール 
　　サーバ名　　：　サーバのIPアドレス、または独自ドメイン名
　　ポート番号　：　143
　　暗号化方法　：　なし
　　認証方式　　：　通常のパスワード認証

  送信メール 
　　サーバ名　　：　サーバのIPアドレス、または独自ドメイン名
　　ポート番号　：　587
　　暗号化方法　：　なし
　　認証方式　　：　通常のパスワード認証

実際に送受信出来たら、設定成功です。
もし、独自ドメインを取得したけど外部にメール送信できない場合は、[メールサーバを構築したけどメール送信が出来ない](https://qiita.com/qiiChan/items/3d3a51478adf987e39a7)をご参照ください。

## 参照

[Dockerで構築！メールサーバーを5分で](https://tech.walkit.net/docker-mailserver)