【Postfix + dovecot + Gmail】自前のメールサーバとGmailを連携させてみた

2016.01.24
何とか自力で**設定完了しました**。顛末は下で記述。
タイトルを完了したから変更しました。
これ見てやる人いないと思いますけど、躓いたらコメント残したら思い出して書くかも。
というか、お金にせっぱつまってないなら簡単で安全なGoogleAppsとか使った方がいいです。面倒くさい…
.
.
##誰？
片手間にサーバをいじくって楽死んでます。
数年前にUbuntu触ってLinuxなんだこれって言ってたら、去年CentOSにWebアプリケーションもどきを白目むきながら作ることに。今はそのどうしようもなく下手くそなコードを書き直してたりします。
####つまり？
>>>素人です。

##何がしたいの？
現在持っているGmailアカウントから独自ドメインでメールの送受信ができるようにする。

##なんでそんなことしたいの？
Gmailでアカウント取ろうと思ったけどアカウントすでにとられていて作れなかったのと、独自ドメインにするにしてもどうせなら今使ってるGmailと連携して送受信ができたらいいなぁ。
サーバとかLinuxとかの勉強にもなれば一石二鳥やん（迫真）

###Gmailの設定でできるじゃん
設定 > アカウントとインポート > 名前 > メールアドレスを追加
から独自ドメインを追加できる方法は使えなくなりました。有償のAppsにするか、メールサーバだけ自前で用意する必要があります。
###SMTPサーバのところにGmailのSMTPさーばを...
それも使えなくなりました(半ギレ)

...
...
...
画像なんかはあとから追加します
ちょいちょい追記すると思うので、書き足りてなかったら変わると思います

#要件？
####前提
- 独自ドメインを取得(ここではexample.com, example.jpとする)
- ドメインの名前解決済み
- 25/tcp, 110/tcp, 587/tcp が開放されている
- レンタルVPSでサーバ運用
- 既存Gmailアカウントあり

####構成
- onamae.com VPS 3Core/2GB/200GB
- CentOS7.0 64bit
- Postfix2.10.1
- Dovecot2.2.10
- procmail3.22
- cyrus-sasl2.1.26

--------------------------------%<ｷﾘﾄﾘ--------------------------------

- PostfixでSMTPサーバを立てる
- DovecotでPOP/IMAP サーバを立てる
- Gmailから独自ドメインで送受信ができる
- バーチャルメールサーバとして立てて複数のメールアカウント(マルチドメイン)で運用できる
- SSL/TLSは今回導入しません(きちんと立てられてから入れます)

#インストール
特別コンパイルするようなものもないので全てyumでインストールしました。
PostfixはCentOS7のデフォルトMTAなので最初から入っています。必要に応じてアップデートかけておきます。
`cyrus-sasl-plain` `cyrus-sasl-lib` は入れた覚えがあったりなかったり。必要かどうかは分かりません。

`yum install dovecot procmail cyrus-sasl`

##Postfixの設定
リアルドメインをexample.jp、バーチャルドメインをexample.comとします。今の環境は特にサブドメインを作ってません。
だいたい注釈のページの通りに作ったので、変更点のみ上げていきますね。

```:/etc/postfix/main.cf
myhostname = example.jp
mydomain = example.jp
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.1.0/24, 127.0.0.0/8
relay_domains = $mydestination
mailbox_command = /usr/bin/procmail

#ここからは一番下に書きました
smtpd_sasl_path = smtpd

smtpd_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_mechanism_filter = plain
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination

virtual_alias_maps = hash:/etc/postfix/virtual
virtual_mailbox_base = /home/user_mails
virtual_mailbox_domains = /etc/postfix/virtual_domains
virtual_mailbox_maps = hash:/etc/postfix/virtual_maps
virtual_minimum_uid = 499
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000

broken_sasl_auth_cliants = yes
smtpd_sasl_security_options = noanonymous
```

```:/etc/postfix/virtual
変更なし
```

`postmap  /etc/postfix/virtual`で設定DB化

```:/etc/postfix/virtual_domains
example.com
```

リアルドメインを書くとうまく動かなくなるので注意

```:/etc/postfix/virtual_maps
#RealDomain example.jp
postmaster@example.jp  example.jp/postmaster/Maildir/
#VirtualDomain example.com
gerogero@example.com example.com/gerogero/Maildir/
```

*Maildir/*と書かないとうまく動かないので(ry
`postmap  /etc/postfix/virtual_maps`で設定DB化

```:メールボックス作成
mkdir /home/user_mails
chmod 1777 /home/user_mails
mkdir /home/user_mails/example.jp
chmod 1777 /home/user_mails/example.jp
mkdir /home/user_mails/example.com
chown 5000:5000 /home/user_mails/example.com
chmod 700 /home/user_mails/example.com
```

Postfixを起動させる(多分既に起動してるから再起動)

##Dovecotの設定
```:/etc/dovecot/dovecot.conf
protocols = imap pop3
```

```:/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/home/user_mails/%d/%n/Maildir #これだとうまくいかなかった？(確認取れてません)
mail_location = maildir:~/Maildir #こっちは確実にうまくいった
```

```:/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain login
#コメントアウト
#!include auth-system.conf.ext
#コメントアウト解除
!include auth-passwdfile.conf.ext
```

```:/etc/dovecot-passwd
# example.jp
postmaster@example.jp:{plain}12345678:500:500::/home/user_mails/example.jp/postmaster:/sbin/nologin:
# example.com
gerogero@example.com:{plain}87654321:2000:2000::/home/user_mails/example.com/gerogero:/sbin/nologin:
```

どうせ一回でうまくいくわけがないのでデバッグログを出力するようにしておくとよいです。

```:/etc/dovecot/dovecot.conf
auth_verbose = yes
auth_debug = yes
#---EOF---
```


Dovecotを起動させる

##procmailの設定
```:/etc/skel/.procmailrc
MAILDIRECTORY=/home/user_mails/example.jp
LOGFILE=$HOME/procmail.log
LOCKFILE=$HOME/.lockfile
DEFAULT=$MAILDIRECTORY/$LOGNAME/Maildir/

:0
$DEFAULT
```

procmailのパーミッション変更
`chmod 600 /etc/skel/.procmailrc`

##SASLの設定
```:/etc/sasl2/smtpd.conf
pwcheck_method: auxprop
#コメントアウト
#mech_list: plain login
```

ユーザ追加(コマンドの後にパスワードの設定)
`saslpasswd2 -u example.jp -c postmaster`
`saslpasswd2 -u example.com -c gerogero`

パーミッション変更

```
chmod 640 /etc/sasldb2
chgrp postfix /etc/sasldb2
```

SMTP-Authを起動~~させる~~ させなくていいです。

パスワードの設定ファイルの指定がデフォルトと違う場所なのできちんと指定

```:/etc/dovecot/conf.d/auth-password.conf.ext
passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/dovecot-passwd #こ↑こ↓
}

userdb {
  driver = passwd-file
  args = username_format=%u /etc/dovecot-passwd #こ↑こ↓

  # Default fields that can be overridden by passwd-file
  #default_fields = quota_rule=*:storage=1G

  # Override fields from passwd-file
  #override_fields = home=/home/virtual/%u
}
```

**----%<----ここまでで設定が完了したはず----%<----**

##確認
自分の持っているメールアドレスから、```gerogero@example.com``` に送信してみる。正しく設定されていれば```/home/user_mails/example.com/gerogero/Maildir```配下にcur, new, tmp などのフォルダが作成され、タイムスタンプが届いた日時になっているはずである。~~わたし、ここで2週間躓きました。~~

###エラーはどこに吐かれるのか
だいたいこのへんです。だいたい

```:error_log
/var/log/maillog
/var/log/messages
journalctl -xe #パラメータ思い出せない
```

あと、```systemctl restart postfix -l``` だったかな？パラメータが思い出せませんけど、たしかこれでも一番新しいエラーが見られたかと思います。

###どんなエラーが吐かれるのか
ログさらってあとで書きます。だいたい上のファイルにはき出されてます。

#Gmail側の設定
##送信側
1\. 設定 > アカウントとインポート > 名前 > メールアドレスを追加
　名前：受信者に表示される名前？
　メールアドレス：```gerogero@example.com```
　SMTPサーバ：```example.com```
　ポート：```587```
　ユーザ名：```gerogero```
　パスワード：87654321(こ↑こ↓記憶薄い)
　SSL/TLS：なし
**ここでSASLが入っていなかったり有効になってなかったりポートが開いて無かったりするとうまくいかない**
2\. Gmailに送信されたメールのリンクを開き認証する

##受信側
メールアドレス ```gerogero@example.com```
ユーザー名 お好きに
パスワード /etc/dovecot-passwd で書いたパス
POPサーバー example.com
ポート 110
フィルターを作成して```gerogero@example.com```(色付けると更に良し)のラベルを付けるとGmail宛と区別しやすくて捗る。フィルターとインポートの作成からTo:```gerogero@example.com```, チャットは除く(チェックボックス)でラベルを作成(新規)でできる。

**----%<----ここまでで設定がすべて完了したはずです----%<----**

##再確認
ここまでできていれば、以下二点がエラーを吐かずにできるはずです。
・メールを受信すると、Gmail上に```gerogero@example.com```というラベルがついて受信される
・```gerogero@example.com```名義でメールが送信できる

受信確認の際は携帯などから送らないと、Gmailでの確認が混ざって分からなくなります。**Gmailから送るのはやめましょう**(戒め)
あと、1分経っても受信できてないなら、1日後にエラーで返ってくるので諦めましょう。
送信の確認もメールは複数宛に出してみて確認するのがよいです。画像なんか添付してみるのもいいかも。

###そもそも...
telnetが入ってない&環境汚したくない という初心者あるまじき理由からSMTP-Authのテストしてないです。
CentOSを必死こいて使い始めた時のApacheに躓いて、7回くらいOSから入れなおしてやり直しをした時のがトラウマになってますね。
testsaslauthdのテストはシステムユーザはOKってなります。どっか設定がおかしい。

#所感
トータル二か月近くこの問題を抱えて頭ハゲそうになりましたが、ようやく終わりました。CentOS触り初めでいきなりZone設定やらされて3か月頭抱えた時と同じような気持ちになりました。何度GoogleAppsに逃げようと思ったかわからんです。
終わってみればごくごく基本的な設定しかしてないんですけどね。あとまだSSL入れてないですし… Qiitaでは```Let's Encrypt```が何やら熱いので、もしかしたらそれを入れるかもしれません。

##ちょっとでも参考にしたところ
こことか見てGmailアカウントではなく独自ドメイン路線に決定
\>>> http://rcmdnk.github.io/blog/2015/04/16/computer-gmail/
インストールとかの手順はだいたいここから
\>>> http://kajuhome.com/multi_mail.shtml
\>>> http://kajuhome.com/postfix.shtml
SASL有効って書かないと動かないのか
\>>> https://forums.ubuntulinux.jp/viewtopic.php?id=16208
問題はSASL認証？
\>>> http://www.usupi.org/sysad/210.html
Apacheとかを立てた時はこっちのサイトを中心にして練習してました
\>>> http://centossrv.com/postfix.shtml

http://tech.ckme.co.jp/mailv.shtml
http://www.postfix.org/SASL_README.html
http://yuumi3.hatenablog.com/entry/20130916/1379320836