MacにHomebrewを使ってdovecotをインストールしてみた。

Symfony2の事についてほったらかしにしていますが、
テスト用にpopサーバが欲しくなったので書いてみますたノシ
仮想環境を使って作れば良いじゃんという話もありますが、それはめんどくさいので。。。

Homebrewを使うには、以下のurlよりお願いね。
macOS 用パッケージマネージャー — Homebrew


では早速dovecotをインストールしましょう。

brew install dovecot

こんな感じでインストールされます。

==> Downloading http://dovecot.org/releases/2.1/dovecot-2.1.15.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/dovecot/2.1.15 --libexecdir=/usr/local/Cellar/dovecot/2.1.15/libexec --sysco
==> make install
==> Caveats
For Dovecot to work, you will need to do the following:

1) Create configuration in /usr/local/etc

2) If required by the configuration above, create a dovecot user and group

3) possibly create a launchd item in /Library/LaunchDaemons/homebrew.mxcl.dovecot.plist, like so:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>homebrew.mxcl.dovecot</string>
        <key>OnDemand</key>
        <false/>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/local/sbin/dovecot</string>
                <string>-F</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>ServiceDescription</key>
        <string>Dovecot mail server</string>
</dict>
</plist>

Source: http://wiki.dovecot.org/LaunchdInstall
4) start the server using: sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dovecot.plist
==> Summary
 /usr/local/Cellar/dovecot/2.1.15: 744 files, 13M, built in 2.2 minutes


インストールが終わったら、次にするのは設定ファイルの準備

cd /usr/local/etc/dovecot

まで移動すると中にREADMEファイルが。
それを見ると設定ファイルの場所が記述されているので、
/usr/local/etc/dovecotへとコピーしましょう。

cd /usr/local/etc/dovecot
cp -pr /usr/local/Cellar/dovecot/2.1.15/share/doc/dovecot/example-config/dovecot.conf .
cp -pr /usr/local/Cellar/dovecot/2.1.15/share/doc/dovecot/example-config/conf.d .

コピーする時は注意してください。

これで設定ファイルの準備が出来たので、
次に、launchdで起動できるようにplistファイルを作成します。
launchdというのは何かというと、説明できないので調べてください。

cd /Library/LaunchDaemons
sudo vi homebrew.mxcl.dovecot.plist

rootユーザでplistファイルを作成します。
ここに記述する内容はインストール時に表示されていた
3)の内容を入力します。

入力したらlaunchctlでloadします。

sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dovecot.plist


正直launchdとかlaunchctlとかよく分かっていません。
イメージとしてはLinuxWindowsでいうサービスと同じ物かと思ってます。はい。

この設定をしておく事で、Macを再起動してもdovecotは勝手に自動起動されるようになります。
自動起動したくないという方は

sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.dovecot.plist

と入力して自動起動の設定を無効にしておきましょう。

launchctlを設定した時はページの下部も参考にしてね。


じゃあ早速dovecotを起動してみましょう。
ターミナルより

dovecot

と入力するだけでdovecotは起動するはずですが、、、あれれ

doveconf: Fatal: Error in configuration file /usr/local/etc/dovecot/conf.d/10-ssl.conf line 12: ssl_cert: Can't open file /etc/ssl/certs/dovecot.pem: No such file or directory

とエラーが出ました。

というわけで10-ssl.confの内容を修正しましょう。

#ssl = yes
↓
ssl = no

としてsslを無効にしましょう。

ついでに、

ssl_cert = 

コメントアウトしましょう。

もう一度dovecotと入力すると、、、、

doveconf: Fatal: Error in configuration file /usr/local/etc/dovecot/dovecot.conf: default_login_user doesn't exist: dovenull

今度は別のエラーが発生しました。
Dovecot2系からdovenullユーザーも必要になったんだけど、
dovenullユーザを作らないといけないんだなと思って

view /etc/passwd

とユーザを確認すると

_dovenull:*:227:227:Dovecot Authentication:/var/empty:/usr/bin/false

と_dovenullユーザとしてあるではありませんか!!!
ついでに_dovecotユーザもあるではりませんか!!!

なぜ「_」がついているのは分かりませんけど、これだけでは駄目みたいなので、
dovecot.confの最終行にエラーの内容を追加しましょう。
(追記)
なぜ「_」がつくのか調べてみました。
どうやらMacではデーモンで動作するユーザにはユーザ名の前に「_」をつけるようです。
Macはまだまだ知らない事だらけですね。

default_login_user = _dovenull

再度dovecotと実行すると、、、

doveconf: Fatal: Error in configuration file /usr/local/etc/dovecot/dovecot.conf: default_internal_user doesn't exist: dovecot

今度は別のエラーが出たので同じく、dovecot.confの最終行にエラーの内容を追加しましょう。

default_internal_user = _dovecot

もう大丈夫だろうと思って再度dovecotと実行すると、、、
無事に起動することが出来ました。

ps -ef | grep dovecot

と実行するとプロセスが実行している事が分かります。


以上でdovecotのインストールから実行まで終了しますたノシ


じゃあ次は実際にpopへ接続してみましょう。
popへはtelnetコマンドからつなぐとします。

telnet 127.0.0.1 110

これでログインできました。
次にpopコマンドでアクセスしましょう。

USER Macでログインしているユーザ名
 +OK

PASS Macでログインしているユーザのパスワード
 -ERR Authentication failed.

おぉっとエラーが発生しましたね。

というわけで早速解析してみましょう。
/var/log/mail.logを確認すると、、、

auth-worker(579): Error: pam(username,127.0.0.1): pam_authenticate() failed: authentication error (/etc/pam.d/dovecot missing?)

pam.dにdovecotなんてありませんよと言われてるっぽいですね。
これは困った、Macにpamなんてないし、、、、と悩んでいたのですが、
以下の方法でpamを使わずにMacのログイン機能(正しくは違いますが)を使っていけます。

cd /usr/local/etc/dovecot/conf.d
vi auth-system.conf.ext

以下の場所にあるargs = loginを追加します。

passdb {
  driver = pam
  # [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=]
  # [cache_key=] []
  #args = dovecot
  args = login
}

追加後、dovecotをreloadすればOK!
と思いきやまたしてもエラーが発生。

dovecot.confの設定でpopをコメントアウトするのを忘れていました。

# Protocols we want to be serving.
#protocols = imap pop3 lmtp
↓
# Protocols we want to be serving.
protocols = pop3

imapを使いたい人はimapも一緒に書いとけば良いんだけど、今回は不要だからpop3のみにしています。

あともう一つ設定があって、古いdovecotなら既に設定されていたんだけど、mail_locationの設定が必要です。
というわけで、conf.d/10-mail.confを開いて、

# 
#
#mail_location =
↓
# 
#
mail_location = maildir:~/Maildir

と変更しちゃいましょう。


一応これでtelnetから接続出来るようになりました。

ちなみにdovecotを停止するには

dovecot stop

と入力すればおk。

これで一通りdovecotの設定は終わりました。



ここからはlaunchctlを設定した話を前提とします。

launchctlで自動起動を有効にした後、Macを再起動するとdovecotはrootユーザでの実行となります。
そのため、dovecotを操作をするにはrootユーザかsudoを使っての操作となります。
但し、dovecotを実行するには/usr/local/sbinまで環境変数を設定しておく必要がありますのでご注意ください。

dovecot stop
ではなく
rootユーザで
dovecot stop
または
sudo dovecot stop

で停止します。
→但し、plistにOnDemand falseと記述があるので、dovecotは停止してもすぐに起動されるのですがね。。

launchctlを有効にしていない方はrootユーザでなくてもdovecotと入力すれば起動されます。
))


以上で駆け足となりますが凄く適当に説明したので、Maildirの設定の仕方とかは他のページを参考にしてくだせぇ。


(追記 2013/03/05)
dovecot起動時に、

Warning: fd limit (ulimit -n) is lower than required under max. load (256 < 1000), because of default_client_count

と警告が発生した場合、dovecotを停止後、

ulimit -n 1024

と入力後、dovecotを起動すれば警告は発生しません。
まぁテスト的な環境だから特に気にする必要はありませんが一応念のため。。。