nkjmkzk.net

Virtualization, Operating System, Storage, Cloud Computing

Archive for the ‘IMAP’ tag

IMAPを使う3の理由

せっかくなので何故にIMAPがいいのか語っておきます。

1. どのPCからでも同じメールにアクセスできる。
これが一番基本的なメリットだと思いますが、IMAPはメールのデータをサーバ上に保存するため個々のPCに依存しません。「あ、メールにあの情報があった気がするけど今PCもってない・・orz」のような状況はIMAPだと起こりません。 ただ、この点はWebメールには若干劣ります。 Webメールが実にブラウザとID/Passwordしか必要としないのに比べて、IMAPは一旦メールクライアントを設定する必要があるためです。 なのでネットカフェや友達のPCをちょっと借りてメールを、、という用途には向きません。

2. メールを簡単にサーバへアップロードできる
例えばpopのアカウント:nkjm-pop@gmail.comとIMAPのアカウント:nkjm-imap@nnd.jpがThunderbirdに設定してあったとします。するとユーザはnkjm-pop@gmail.comに届いたメールをnkjm-imap@nnd.jpにドラッグ・アンド・ドロップで簡単に移動できます。これはユーザエクスペリエンス的にはただフォルダ間をメールが移動しているだけですが、バックグラウンドではローカルPC上のメールデータがIMAPサーバへとアップロードされています。これが何故いいかというと、IMAPの特性であるメールの一元化の能力をさらに強力にするからです。
IMAPのメールをどのPCからでも見れるのは先に述べた通りですが、このアップロード機能を併用するとIMAPでないPOPのメールもあわせてひとつのサーバに集約することができます。複数メールアカウントを所持しており、その中にPOPしか提供してくれないメールサーバがあったとしてもIMAPサーバがひとつあればそこに全メールをまとめることができるわけです。 しかもこれがドラッグ・アンド・ドロップでできちゃうというのがスゴい。

3. Webメールより使いやすい
このGooglizeされた現代でこれを言うのは少しばかり勇気がいるのですが、非難を恐れずに言えば実はGmailってあんまり使い易いと思ったことがないのです。 以下、僕がGmailを使わない3の理由です。

1. フォルダ階層が作れない。
Web2.0の重要な要素のひとつにラベリングがあるのは周知の事実でGmailもそれを踏襲してると言えます。情報の合理的かつ共有を前提とした分類方法としてはたしかにFolksonomyは優れていると思いますが、僕はFolksonomyは個人の頭の中を整理するのには向かないと思います。メールの分類はユーザ個人が必要なメールがどこにあったか直感的に判断できることが重要です。フォルダ階層でそれを行うには計画的な階層設計が必要ですが、良く設計されたフォルダ階層はメールを分類するには非常に有用であると経験上感じます。

2. チェックボックスやプルダウンをつかった操作は面倒。
Gmailではメールを選択するのにチェックボックス、アクションを指定するのにプルダウンメニューを使用しますが、このようなチェックボックスやプルダウンを使った操作はドラッグ・アンド・ドロップに比べて一手以上多い手順を必要とします。特にビジネスにおいてメールは時間あたりに相当な量を受信します。繰り返し行う作業で手順がひとつでも増えるとそれは大きなストレスになります。

3. ロードが重い。
Gmailはログインしてトップページが表示されるまでにサーバと相当な処理が走ります。これはブロードバンド環境ではあまり気にならないのですが、PHS等低速回線を利用していると顕著になります。新幹線の車中でPHSを使うと当然コネクションの質はめちゃくちゃ悪くなるのでGmailを開くにはかなりの忍耐を必要としますが、POPやIMAPといった純粋なメールのプロトコルであればこの劣悪な環境でもなんとかサバイバルできます。

*ちなみに誇張してGmailを使わないと書いてますが実際は使いまくってます。

Ajaxという技術はたしかにスゴく、最初にGoogle Mapをみたときは唖然としました。しかしそれから世間のAjax熱は過熱感があると思っていて、今までローカルアプリで動かしていたものをなんでもかんでもAjax化してWeb上に持っていこうとしている気がします。 Ajaxは今までブラウザでできるとおもわれていなかったことを覆すという離れワザを実現した素晴らしい技術だと思います。 USのYahoo Mail Betaはこれまた凄まじいユーザインターフェースを提供しており、使い勝手はかなりローカルアプリに近くなっています。

ただし今のところまだ「メールをさばく」という一日に数え切れない程のオペレーションを要するところではThunderbirdのようなPCベースのアプリケーションが操作性、応答性において優れていると感じます。

したがって、このような操作性を誇るローカルのアプリケーションとIMAPのデータ集約性、アクセシビリティを組合せた形が快適なメール生活を送る上で僕にとっては理想的だと思った次第です。これからGmailは一回POPしてそれをIMAPで自分のサーバにアップしよっかなと思っています。

というわけで今日はIMAPで一日終わりそうです。お疲れさまでした。

without comments

Written by nkjm

December 6th, 2008 at 7:03 pm

Posted in Uncategorized

Tagged with ,

dovecot + MySQLでIMAPサーバ(over SSL)を構築する

その昔はIMAPサーバにはCourierIMAP + OpenLDAPを使用していましたが、このサーバの設定には中々苦労した思い出があります。 最近はdovecot + OpenLDAPという構成でやってきましたが、DBをMySQLやらPostgreSQLやらOpenLDAPやらといろいろ動かしているとメンテナンスや移設のときに結構しんどいので、現在VPSで新たに環境を構築する上ではDBは基本的にMySQLに集約することにしました。 (そもそも当初はいろんなサーバの構築ができるようにと勉強目的で複数種のDBを動かしていましたが、もういいや、ということで。)

環境はdovecot-1.0.3, MySQL-5.0.41, CentOS-5.0です。前提としてMySQLはすでに/srv/mysqlとしてインストールされているものとします。dovecotと連携させる上でMySQLを特段追加のオプションを付けてビルドしなければならないといったことはありません。MySQL側では認証用のDBとテーブルを用意するだけでOKです。

ちなみに僕はソースからビルドしたアプリケーションはすべて/srv/以下に置くことにしているのでdovecotのインストールパスもそれにしたがいます。

手順は以下のようなステップとなります。
・dovecotのインストール
・Unixユーザの追加
・メールボックスの作成
・設定ファイルの編集
・データベースの作成

では上記のステップを順を追って見ていきます。
まずdovecotをソースからビルドしていきます。まずconfigureを適切に行う必要があります。

# tar xvfz dovecot-1.0.3.tar.gz
# cd dovecot-1.0.3
# CFLAGS="-I/srv/mysql/include/mysql" LDFLAGS="-L./srv/mysql/lib/mysql" ./configure --prefix=/srv/dovecot --with-mysql

MySQLと連携させるためにはMySQLのヘッダファイルとライブラリファイルへのパスを認識させる必要があります。 今回の環境の場合ではMySQLが/srv/mysqlと通常のパス設定では認識できないところにあるのでこれをconfigure時に認識できるようにCFLAGSとLDFLAGSを設定してあげる必要があります。

configureの結果をみて以下の用に「Building with SQL drivers」のところにmysqlと表示されていればOKです。

Install prefix ...................... : /srv/dovecot
File offsets ........................ : 64bit
I/O loop method ..................... : poll
File change notification method ..... : dnotify
Building with SSL support ........... : yes (OpenSSL)
Building with IPv6 support .......... : yes
Building with pop3 server ........... : yes
Building with mail delivery agent .. : yes
Building with GSSAPI support ........ : no
Building with user database modules . : static prefetch passwd passwd-file checkpassword sql (modules)
Building with password lookup modules : passwd passwd-file shadow pam checkpassword sql (modules)
Building with SQL drivers ............: mysql

なお、今回はIMAPサーバへの接続をIMAP over SSLにするので「Building with SSL support」の結果も同時に確認しておく必要があります。 もしyesとなっていなければOpenSSLのライブラリが正しく認識できていないので、CFLAGS, LDFLAGSにOpenSSLのヘッダファイル、ライブラリファイルへのパスも含める必要があります。(OpenSSLが既にインストールされている前提)

あとは通常通りコンパイル、インストールを行います。

# make 
# make install

次に必要なUnixユーザを作成します。

# useradd -s /bin/false dovecot
# useradd -s /bin/false -u 501 vmail

dovecotはサーバ起動用のユーザ、vmailは実際にメールボックスを操作するユーザです。
後に作成するメールボックスのディレクトリツリーはこのユーザに所有される必要があります。なお、dovecotのデフォルトの設定上、vmailのユーザIDは500以上としておいた方がよいでしょう。これらのユーザにはシェルは必要ないのでログインシェルには/bin/false等を指定して無効化しておきます。

メールボックスのルートとなるディレクトリを作成します。

# mkdir /var/spool/vmail
# chown -R vmail:vmail /var/spool/vmail

これはどこでも構いませんが、先に作成したvmailユーザによって書き込めるようにパーミッションを設定しておく必要があります。

メインの設定ファイルを作成します。/srv/dovecot/etc/dovecot-example.confというテンプレートが用意されていますのでこれをベースに編集していきます。

# cd /srv/dovecot/etc # cp dovecot-example.conf dovecot.conf # vi dovecot.conf

ポイントとなる箇所を抜粋して記載します。特に重要なパラメータのみコメントしています。

protocols = imaps
disable_plaintext_auth = no
log_path = /var/log/dovecot.log
ssl_cert_file = /srv/dovecot/etc/ssl.crt
ssl_key_file = /srv/dovecot/etc/ssl.key

# メールボックスの形式にMaildirを指定し、その場所を指定します。後にデータベースで設定するメールアカウントには「home」というフィールドがあり、mail_locationを「~/」と設定することでこのhomeフィールドの値がそのまま各ユーザのメールボックスへのパスになります。

mail_location = maildir:~/

mail_debug = yes
protocol imas {
 ssl_listen = *:993
 login_executable = /srv/dovecot/libexec/dovecot/imap-login
 mail_executable = /srv/dovecot/libexec/dovecot/imap
}
auth_executable = /srv/dovecot/libexec/dovecot/dovecot-auth
auth_default {
 mechanisms = plain
 #passdb pam {
 #}

#認証用のデータベースにSQLを指定しています。dovecotでは既定でパスワード情報を取得するためのSQLクエリとユーザ情報を取得するためのクエリの2クエリを発行しますが、userdb prefetchを設定することによってこれらのクエリを1クエリにまとめることができます。

 passdb sql {
  args = args = /srv/dovecot/etc/dovecot-sql.conf
 }
 userdb sql {
  args = args = /srv/dovecot/etc/dovecot-sql.conf
 }
 userdb prefetch {
 }
}

SSL接続のためのRSA秘密鍵と証明書は既に作成してある前提ですが、もしまだ作成していなければ以下のように作成しておきます。

# openssl keygen 1024 > /srv/dovecot/etc/ssl.key
# openssl req -new -x509 -days 365 -key /srv/dovecot/etc/ssl.key -out /srv/dovecot/etc/ssl.crt

次にSQLの設定ファイルを作成します。

# cd /srv/dovecot/etc
# cp dovecot-sql-example.conf dovecot-sql.conf
# vi dovecot-sql.conf

以下が設定ファイルの中身です。

driver = mysql
connect = host=/tmp/mysql.sock dbname=mail user=root
default_pass_scheme = PLAIN
password_query = SELECT userid as user, password, home as userdb_home, uid as userdb_uid, gid as userdb_gid FROM users WHERE userid = '%u'
user_query = SELECT home, uid, gid FROM users WHERE userid = '%u'

僕の環境ではMySQLは同一サーバ上にあるのでアクセス制御を容易にするためにconnect=にhost=/tmp/mysql.sockとUNIX SOCKETを指定していますが、TCP/IPでMySQLに接続する場合はここにホスト名(またはIPアドレス)を指定します。user=にはrootを指定してうるぅあ!って感じで接続することになっていますが、適宜適切な権限のユーザを指定したりパスワードをpassword=パラメータで追加したりして下さい。
password_queryとuser_queryは後に作成するデータベースのテーブルスキーマに合わせて設定しています。

次に認証用のデータベースを作成します。

# mysql -u root
> CREATE DATABASE mail;
> USE mail
> CREATE TABLE users (
  userid VARCHAR(128) PRIMARY KEY NOT NULL,
  domain VARCHAR(128) NOT NULL,
  password VARCHAR(64) NOT NULL,
  home VARCHAR(255) NOT NULL,
  uid INTEGER NOT NULL,
  gid INTEGER NOT NULL
);
> INSERT INTO users VALUES ('nkjm','nkjmkzk.net','nkjm_passwd','/var/spool/vmail/test', 501,501);
> q

ここではまず「mail」データベースを作成し、実際にメールアカウントを格納するテーブル「users」を作成しています。このテーブルの中のdomainフィールドは今回特に気にする必要はありません。useridとpasswordがユーザがメールクライアントのアカウント設定でログインidとパスワードに指定するものになります。homeはこのユーザのメールデータが格納されるディレクトリになります。このディレクトリは初回ユーザがログインした際に自動的にdovecotが作成してくれます。なんて便利なんでしょう! uidとgidには先に作成したvmailユーザのuidとgidを指定します。最後にテストアカウントとして’nkjm’を作成しています。

これで構築は完了です。
/srv/dovecot/sbin/dovecotを実行してサーバを起動し、メールクライアントから接続できます。クライアントのアカウント設定では接続方式にSSLを指定して宛先ポートを993に指定することをお忘れなく。うまくいかないときは/var/log/dovecot.logのメッセージがシューティングに役立つと思います。

without comments

Written by nkjm

December 6th, 2008 at 7:02 pm

Posted in Virtualization

Tagged with , ,