fml4.x(MySQL連携)を設定した

数年(下手したら10年来)振りにfmlをインストールしたのでメモ。8.xが出ているんだけど、ネットの情報量の多さ&MySQLとの連携方法が判っているという理由で4を導入した。

前提:

  • 専用ユーザ「fml」を作成する。
  • メールサーバはqmailを使用。
  • ML名は「testml」とする。
  • 行頭が「#」の場合はユーザfmlで作業。「$」はrootで作業。

システム仕様:

  • MySQLと連携させ、登録アドレスはそちらで管理したい。(makefmlは叩かない)

1. fmlをインストールする。

# su
$
$ wget ftp://ftp.fml.org/pub/fml/stable/fml-4.0-stable-20040215.tar.gz
$ tar zxvf fml-4.0-stable-20040215.tar.gz
$ (展開ログ)
$ cd fml-4.0-stable-20040215
$ perl makefml install
$ (インストールログ)
$
$ su - fml
# /usr/local/fml/makefml newml testml
# (ML作成ログ)

2. /etc/aliasに、MLで使用するエイリアス情報を追加する。

$ ln -s /var/spool/ml/etc/qmail/alias/.qmail-* /var/qmail/alias/

3. /var/spool/ml/etc/qmail/alias/qmail-testml-admin・qmail-testml-request の中にあるアカウントを、管理者のメールアドレスに変更する。
デフォルトではどちらも「fml」。変更が必要ない場合はスルーで。

4. assignの設定をqmailに追加する。

$ ln -s /var/spool/ml/etc/qmail/users/assign /var/qmail/users/assign

/var/qmail/users/assign が既に存在する場合は、/var/spool/ml/etc/qmail/users/assign の内容を末尾に追加する。

5. MySQLと連携させるので、まず接続用のモジュールをコピーする。

# cp /usr/local/fml/databases/mysql /var/spool/ml/etc/fml/mysqldriver.pl

次に、config.cf の設定を変更する。

# vi /var/spool/ml/testml/config.ph
# DBを使用する
$USE_DATABASE                = 1;

# DBはMySQLを使用する
$DATABASE_METHOD             = "mysql";

# 先ほどコピーしたモジュールを指定する
$DATABASE_DRIVER             = "/var/spool/ml/etc/fml/mysqldriver.pl";

# MySQLのホスト
$SQL_SERVER_HOST             = "localhost";

# MySQLの使用しているポートを指定(デフォルト設定のままなら、MySQLは3306)
$SQL_SERVER_PORT             = "3306";

# DB接続ユーザ
$SQL_SERVER_USER             = "testuser";

# DB名
$SQL_DATABASE_NAME           = "testdb";

# DB接続パスワード
$SQL_SERVER_PASSWORD         = "testpass123";

6. MySQLデータベースに専用テーブルを追加する
http://www.fml.org/software/fml4/Japanese/RDBMS/3.html#C3S2
をそのまま使用。

create table ml (
    ml char(64),
    file char(64),
    address char(64),
    off int,
    options char(64)
);

きちんと書き直してみた。

CREATE TABLE IF NOT EXISTS ml (
    id       int(1)                                  NOT NULL  auto_increment,
    ml       char(64)      collate  utf8_unicode_ci  NOT NULL  default "testml",
    file     char(64)      collate  utf8_unicode_ci  NOT NULL  default "",
    address  char(64)      collate  utf8_unicode_ci  NOT NULL  default "",
    off      int(11)                                 NOT NULL  default "0",
    options  char(64)      collate  utf8_unicode_ci  NOT NULL  default "",
    memo     varchar(128)  collate  utf8_unicode_ci  NULL,
    PRIMARY KEY  (id)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT;
);

今回は

  • CakePHPと連携させる
  • 1システムにつき1MLの使用が前提
  • mlテーブルは、そのデータベースを使用している1システムでしか使用しない

以上の理由から、[ml]にはデフォルト値を設定した。複数MLを1テーブルで運用するのであれば、defaultは設定しない方がいいかな。
カラムを追加した関係で4でコピーしたmysqldriver.plがそのままで動かないので、、各所にあるINSERT文を以下のように修正する。

#	$query  = " insert into ml";
# 項目名をきちんと指定してやる。
	$query  = " insert into ml (ml, file, address, off, options) ";

7. 設定が済んだらとりあえずテスト。

# /usr/local/fml/makefml test testml

Perlモジュールが足りてなかったりMySQLと連携がうまくいってなかったりする場合はここで判るので、結果を見て調整。

8. アドレスを追加する。

# /usr/local/fml/makefml add test@testmail.ne.jp

6で作成したテーブルに、[file]が「actives」「members」となった同アドレスのデータが2行追加されていれば成功。

9. アドレスにメールを送ってみる
返信があればとりあえず設定完了。

私の場合、/var/log/maillog に

Jun 23 18:25:03 testmail qmail: 1245749103.527142 delivery 374: deferral: fastforward:_fata
l:_unable_to_read_/var/spool/ml/testml/include.bin:_file_does_not_exist/

というログが出てうまくいかなかった。そもそもinclude.binなんてファイルないしどこにも書かれてなくて「?」だったので、とりあえず

ln -s /var/spool/ml/testml/include /var/spool/ml/testml/include.bin

としたら通った。ホントにいいのかしらこれで。

ちなみに以上の手順だと、fmlデフォルトの挙動である

  • 登録のないアドレスからのメールは拒否
  • 受信したメールは即時に配送

で稼動する。なので、

  • 登録のないアドレスからメールを受けたら案内を流す
  • 登録のないアドレスからメールを受けたら仮登録して案内を返す
  • メールを○時にまとめて送りたい

などなど要望があるなら、設定を変更する必要がある。

参考 : "fml" tutorial (Japanese)