火曜日, 25 4 月 2006

qmail+MySQL この記事(qmail+MySQL)を「はてなブックマーク」に追加 この記事をクリップ! この記事(qmail+MySQL)を「del.icio.us」に追加

qmailとMySQLを連携させてメールサーバを作る機会があったのでその時の備忘録。
でも正直qmailはあまり好きではありません。djb氏独特のディレクトリ構成、設定方法とかがヤダ。
普段はMTAとしてPostfixを選んでいます、何しろ楽だし分かりやすい。

まずはqmailのインストールですが今回はnetqmailを使用しました。
アカウントの追加など基本的な部分は省いています。
あとMySQLは既にインストールされているものとします。
$ ./collate.sh
ここでqmailをMySQLに対応させるパッチをここからダウンロードしてきて当てます。
$ patch -p0 < netqmail-mysql-1.1.15.patch
$ cd netqmail-1.05
# make setup check
これでインストール完了です。
makeでコケる場合はMakefileを変更する必要があります。
ウチでは以下のように変更しました。
MYSQL_LIBS=/usr/local/mysql/lib/mysql/libmysqlclient.a -lm -lz
MYSQL_INCLUDE=-I/usr/local/mysql/include

次にMySQLの設定をします。
qmailからMySQLへの接続情報を/var/qmail/control/sqlserverに以下のフォーマットで書きます。
server MySQLサーバホスト名
login ログインID
password ログインパスワード
db データベース名
で、上で設定したデータベースに入ってアカウント情報の入ったテーブルを作ります。
テーブル名とカラム名は固定なので以下のテーブルをそのまま作ります。
CREATE TABLE mailbox (
  id mediumint(9) NOT NULL auto_increment,
  username varchar(32) NOT NULL default '',
  uid mediumint(9) NOT NULL default '0',
  gid mediumint(9) NOT NULL default '0',
  home varchar(128) NOT NULL default '',
  password varchar(16) NOT NULL default '',
  password_type enum('Password','Crypt-Password','MySQL-Password') NOT NULL default 'Password',
  suspended enum('N','Y') NOT NULL default 'N',
  PRIMARY KEY  (id),
  UNIQUE KEY username (username),
  UNIQUE KEY home (home),
  KEY password (password)
);
テーブルが出来たらメールアカウント情報をinsertします。
insert into mailbox (username,uid,gid,home,password,password_type) values('test',1001,1001,'/var/mail/test/','test','Password');
みたいな感じで。
解説すると1つ目のカラムからユーザー名、UID、GID、メール配送ディレクトリ、パスワード、パスワード形式となってます。
パスワード形式はPasswordでプレーンパスワード、Crypt-Passwordで暗号化パスワード
MySQL-PasswordでMySQLのハッシュ形式パスワードの3種類あります。上記の例はプレーンパスを使っています。

ここまでで一応メールは届くようになるんですが、この状態だとバーチャルホストには対応していません。
バーチャルホストにして複数のドメインからのメールを受けるためには以下のテーブルを作成します。
CREATE TABLE virtual (
  id mediumint(9) NOT NULL auto_increment,
  username varchar(32) NOT NULL default '',
  ext varchar(128) NOT NULL default '',
  virtual_username varchar(32) NOT NULL default '',
  virtual_host varchar(128) NOT NULL default '',
  PRIMARY KEY  (id),
  UNIQUE KEY address (virtual_username,virtual_host),
  UNIQUE KEY virtual (username,ext,virtual_username,virtual_host),
  KEY virtual_username (virtual_username),
  KEY virtual_host (virtual_host)
);
上記テーブルのvirtual_usernameとvirtual_hostを@でくっつけたのがバーチャルメールアドレスになり、
メールが送られてきたときこのテーブルを見て該当するメールアドレスがあれば
usernameで指定されているユーザーに登録されているディレクトリへ配送されます。
例えばabc@dummy.comというバーチャルメールアドレスを作りtest宛に配送したいならば
virtualテーブルに対して以下のようなクエリを発行します。
insert into virtual(username,virtual_username,virtual_host) values('test','abc','dummy.com');
これでOK。
実はvirtual_usernameを省略することもできて、その場合はvirtual_hostに登録されているドメインに
送られてきたメールはすべてその登録されているユーザーに配送される仕組みになっています。

他にもエイリアス用のテーブルがあってエイリアスの設定もできたりします。
驚いた事にそのエイリアスからパイプで外部のプログラムにメールを渡すことも可能です。
PostfixとMySQLを連携させる場合はそれが出来ないのでこの点は魅力的ですね。

でもまぁやっぱqmailは慣れないですねぇ、なんで/var/以下に実行バイナリがインストールされるのか意味が分(ry

Technorati Tags:

Posted by tsujitako at 9:35 午後 in Linux/