CyrusIMAPdとの連携運用

前提条件

設定目標

インストール

/etc/make.conf

以下の内容を追記する。

# for sendmail
mail_sendmail_SET=    LA NIS SEM TLS DANE SASL SHMEM MILTER SMTPUTF8
mail_sendmail_SET+=   SOCKETMAP BLACKLISTD CYRUSLOOKUP PICKY_HELO_CHECK
mail_sendmail_UNSET=  BDB LDAP SASLAUTHD

/usr/local/etc/ports.conf

以下の内容を追記する。

mail/sendmail: CFLAGS=-O2 -pipe -DTLS_EC=2 -D_FFR_TLS_USE_CERTIFICATE_CHAIN_FILE -D_FFR_TLS_ALTNAMES -D_FFR_QUEUE_GROUP_SORTORDER

インストール

cd /usr/ports/mail/sendmail && make install

セットアップ

/usr/local/lib/sasl2/Sendmail.conf

以下の内容のファイルを作成する。

pwcheck_method: auxprop
auxprop_plugin: sasldb

SASLライブラリがケアしてる設定ファイルにて設定を行う必要がある。

本条件において適用可能なオプションとしては、下記の物があるが、CyruIMAPd側の設定との調整を考えるとデフォルトのままとする。

設定名

デフォルト値

意味

sasldb_path

/usr/local/etc/sasldb2

SASLDBファイル(本件ではLMDB)のパス

sasldb_mapsize

1048576 バイト

(LMDB固有)全ユーザーをオンメモリにマッピングするためのサイズ

sasldb_maxreaders

126

(LMDB固有)SASLDBファイルを同時アクセス可能な最大セッション(プロセス)数

SASLクライアントが参照すべき設定ファイル名は sasl_server_init() 関数に引き渡される appname 引数により決定される。 マニュアルに明記されてないケースで調査が必要な際は参考までに。

https://www.cyrusimap.org/sasl/sasl/reference/manpages/library/sasl_server_init.html

/etc/mail/Makefile.local

以下のファイルを作成する。

SENDMAIL_CF_DIR=/usr/local/share/sendmail/cf

/etc/mail/ホスト名.mc

いわゆるsendmail.cf作成準備

ln -s freebsd.submit.mc /etc/mail/$(hostname).submit.mc
cd /etc/mail && make

切り替え

cd /usr/ports/mail/sendmail && make mailer.conf

なお切り戻しは make mailer.base の実行となる。

よくある質問とその答え

Q.portsで入れないと駄目なんですか?

A.ベースシステムにSASLライブラリが無いのでしょうがないです。 ベースシステムにインストールされたSASLライブラリ付でビルドすることもできないでもないですが、 OSのバージョンアップ時等のメンテナンスがめんどくさくなるのでオススメしません。

Q.以下のエラーが出てメールの送信ができません

AUTH failure (XXXXXXXX): generic failure (-1) SASL(-1): generic failure: Unable to open MDB transaction, user=...

A.以下のコマンドを実行して、LMDBファイルに接続しているセッション数およびプロセスIDを確認する。

# mdb_stat -ne /usr/local/etc/sasldb2
Environment Info
    :
  Max readers: 126
  Number of readers used: 101
Status of Main DB
    :

上記の例の場合、最大126セッション中101セッション使用していることが分かる。

# mdb_stat -nr /usr/local/etc/sasldb2
Reader Table Status
    pid     thread     txnid
     15223 801e12000 -
     15229 801612000 -
   :

上記のように、具体的にLMDBファイルをつかんでるPIDのリストが取得できる。

# pgrep -lf -F <(mdb_stat -nr /usr/local/etc/sasldb2 | awk '/[0-9]/ { print $1 }')
15223 imapd: imaps: XXXXXX.XXXXXXXXXX.XXX [XXX.XXX.XXX.XXX] nork@ninth-nine.com ninth-nine.com!user.nork Idle

※ZSH/BASH拡張を使用しているので、SH等では実行できない点に注意。

ここで表示されるPIDのプロセスに対して、とりあえず再起動で。 SASLDBライブラリに接続リークを起こすことを確認。

参考文献