2015年12月15日火曜日

玄人志向 玄箱(Debian Jessie)へ IMAP メールサーバを設置

Debian Jessie をインストールしている玄箱へ IMAP メールサーバ(Courier-imap)を設置しました。

我が家ではすでに自宅サーバ(FreeBSD 9)で IMAP メールサーバの Courier-imap を稼動させています。単純に FreeBSD から Debian への焼き直しという感じのつもりでしたが、実際にはいろいろと苦労がありました。

メールサーバの設置は結構奥深いものがあって、私自身も全てを体験したわけではありません。今回の記事では、プロバイダのメールサーバに届いているメールを受信して、パソコンのメールソフトウェアでメールを閲覧できる最低限の設定までです。玄箱経由のメール送信はまだできません。

Exim4 のインストール

メール転送ソフトウェア(MTA)の Exim4 をインストールしました。自宅サーバの FreeBSD 9 では MTA に Sendmail を使用していましたが、ここでは Debian 標準の Exim4を使用することとしました。なお今回の記事ではメール送信の部分を省略しますので、 Exim4 の設定も行なっていません。
# apt-get update
# apt-get install exim4

Courier-imap のインストール

単純に家庭内 LAN の中だけでアクセスする場合には、 SSL などによる秘匿化は無理に必要ありませんので、ここでは暗号化なしで設定を行いました。次の通り Courier-imap と gamin の二つをインストールするだけで動作可能です。インストールの途中で「ウェブベースでの管理ソフトウェアのためにディレクトリを作成するか」の問い合わせがありましたが、不要でしたので "NO" で応答しておきました。
# apt-get update
# apt-get install courier-imap gamin

ユーザ・アカウント

IMAP メールサーバの個人データを保管するために、ユーザ・アカウントを玄箱へ作成します。Debian などの Linux マシンを使用している場合には、Linux マシンで使用しているユーザ名で登録するのが後で混乱を防ぐためには有効です。以下は mailuser というユーザ・アカウントを作成した様子を示します。対話式にアカウントを作成しました。
# adduser mailuser (mailuser でアカウントを作成)
Adding user `mailuser' ...
Adding new group `mailuser' (1001) ...
Adding new user `mailuser' (1001) with group `mailuser' ...
Creating home directory `/home/mailuser' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: (希望するパスワードを入力)
Retype new UNIX password: (再度パスワードを入力)
passwd: password updated successfully
Changing the user information for mailuser
Enter the new value, or press ENTER for the default
    Full Name []: IMAP Mailuser
    Room Number []:
    Work Phone []:
    Home Phone []:
    Other []:
Is the information correct? [Y/n] y

IMAP メールサーバ用ディレクトリ作成

一度玄箱からログアウトした後、再度上記で作成したユーザ・アカウントでログインし直します。ログイン出来た場所がユーザのホーム・ディレクトリです。このホームディレクトリへ IMAP メールサーバ用ディレクトリを作成することとなります。 su コマンドで特権ユーザへ昇格した後、maildirmake コマンドで IMAP メールサーバ用のディレクトリを作成します。
$ su
Password: (パスワードを入力)
# maildirmake Maildir
# chown mailuser:mailuser -R Maildir

IMAP メールサーバの動作確認

以上で IMAP メールサーバの最低限のインストールが終了しました。動作するか確認するために、手元のパソコンの IMAP 対応のメールソフトウェア(Thunderbirdなど)で玄箱の IMAP サーバへメール設定をしました。Thunderbird では対話式に玄箱の IP アドレスやユーザ・アカウントを入力すると、自動的に玄箱のポートを捜索してメール設定をしてくれるはずですが、何故か上手く設定できませんでした。そこで手動で設定しました。
(2016-01-03 追記:Thunderbird のバージョンによっては自動設定が正常にできるようです。)

 Thunderbaird の例
サーバの種類:IMAP サーバ
サーバ名:(玄箱の IP アドレス)
ユーザ名:(上記で作成したユーザ・アカウント)
ポート:143

セキュリティ設定
 接続の保護:なし
 認証方式:平文のパスワード認証

ユーザ名などを入力して設定を開始しました。
自動設定はできませんでした。手動で設定しました。
「接続する上での危険性を理解しました」へチェックを入れて「完了」ボタンで設定終了

Fetchmail と Procmail のインストール

上記で IMAP メールサーバへアクセスすることが出来たところで、プロバイダのメールサーバまでに到達しているメールを玄箱の IMAP メールサーバへ読み込むためのソフトウェアの Fetchmail と Procmail をインストールします。

なおメールの流れは次のようになります。
[プロバイダ] - [Fetchmail] - [Procmail] - [Courier-imap]

# apt-get install fetchmail
# apt-get install procmail

Fetchmail の設定

設定ファイル(.fetchmailrc)を次のように設定しました。なお定期的にメールを読みこませる方法は、Fetchmail のデーモン機能ではなく、cron で行わせるようにしました。ここでは Gmail からメールを受信することを前提に記述しています。
$ touch .fetchmailrc
$ chmod 600 .fetchmailrc
$ vi .fetchmailrc
--- .fetchmailrc の内容 ---
set nobouncemail

defaults
    uidl
    no mimedecode
    keep (メールをサーバへ残す場合)

poll pop.gmail.com
    protocol imap (または pop3)
    port 993    (または 995)
    username "(ユーザ名)@gmail.com"
    password "(パスワード)"
    ssl
#   fetchall (テスト時に再度全てのメールを読み出すとき)
    mda "/usr/bin/procmail"

Fetchmail の受信テスト中に発見した問題ですが、玄箱のホスト名 "kurobox" の名前の解決ができておらず、受信エラーとなっていました。そこで /etc/hosts を修正しました。
# vi /etc/hosts

127.0.0.1    localhost
127.0.1.1    kurobox (この部分を追加)
::1        localhost ip6-localhost ip6-loopback
ff02::1        ip6-allnodes
ff02::2        ip6-allrouters

/etc/default/fetchmail は、デーモン動作用のファイルです。今回は修正しません。
START_DAEMON=no (no のままにしておきます)
/etc/fetchmailrc もデーモン動作で必要ですが、ここでは必要ありません。

Procmail の設定

設定ファイル(.procmailrc)を次のように設定しました。Procmail は宛先や差出人などの条件によってメールを保存する場所を変更したり、余所へ転送させる機能があります。今回は基礎の基礎ということで、条件分岐(レシピ)を記述せず、全て Courier-IMAP で使用する Maildir へ転送させる内容です。
$ touch .procmailrc
$ chmod 600 .procmailrc
$ vi .procmailrc
--- .procmailrc の内容 ---
PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/ (※)
LOGFILE=$MAILDIR/procmaillog
LOCKFILE=$HOME/.lockmail

(※)分岐条件(レシピ)に当てはまらないものは全て "DEFAULT="  で指定したディレクトリへ配送されます。ここでは条件分岐がありませんので、Maildir へ全て配送されます。

動作確認(単独動作)

以上で設定は終了です。単発で動作させて異常が発生しないか確認しました。もし問題があればネット上を検索して対処してください。
$ fetchmail
  ↓
プロバイダのメールサーバへ溜まっていたメールが次々と受信されるはずです。
  ↓
reading message (ユーザ名)@gmail.com@gmail-pop.l.google.com:324 of 324 (2402 header octets) (37578 body octets) not flushed

動作が終わったところで、操作するパソコンのメールソフト(Thunderbird など)で確認をしてください。「受信トレイ」の部分へメールが受信されていれば成功です。

下記のような結果となった場合には認証エラーですので設定を見直してください。
fetchmail: Authorization failure on (ユーザ名)@gmail.com@pop.gmail.com
fetchmail: For help, see http://www.fetchmail.info/fetchmail-FAQ.html#R15
fetchmail: Query status=3 (AUTHFAIL)

cron で定期受信

cron を使って fetchmail コマンドを定期的に実行させて、メールを受信させるようにしました。ここでは 5 分おきに受信するようにしました。
$ crontab -e

# m h  dom mon dow   command
*/5   *   *   *   *   /usr/bin/fetchmail >/dev/null 2>&1

動作確認(cron の定期受信)

上記の cron の設定が終了したら、既に Fetchmail による自動受信は開始されています。
Fetchmail メールで読み出しているサーバ(ここでは Gmail)へテストメールを送信します。送信して 5 分以内に IMAP メールサーバへ配送されていれば成功です。

0 件のコメント:

コメントを投稿