【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
[email protected]  example.jp/postmaster/Maildir/
#VirtualDomain example.com
[email protected] 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
[email protected]:{plain}12345678:500:500::/home/user_mails/example.jp/postmaster:/sbin/nologin:
# example.com
[email protected]:{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
}

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

確認

自分の持っているメールアドレスから、[email protected] に送信してみる。正しく設定されていれば/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. 設定 > アカウントとインポート > 名前 > メールアドレスを追加
 名前:受信者に表示される名前?
 メールアドレス:[email protected]
 SMTPサーバ:example.com
 ポート:587
 ユーザ名:gerogero
 パスワード:87654321(こ↑こ↓記憶薄い)
 SSL/TLS:なし
ここでSASLが入っていなかったり有効になってなかったりポートが開いて無かったりするとうまくいかない
2. Gmailに送信されたメールのリンクを開き認証する

受信側

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

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

再確認

ここまでできていれば、以下二点がエラーを吐かずにできるはずです。
・メールを受信すると、Gmail上に[email protected]というラベルがついて受信される
[email protected]名義でメールが送信できる

受信確認の際は携帯などから送らないと、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