FreeBSD + Postfix + Spamassassin

仕事でまた spamassassin を使ってます。今回は念願の FreeBSD postfix postgresql の組み合わせです。
やぱり postfix でないと。

maillog で、

spamd: still running as root: user not specified with -u, not found, or set to root, falling back to nobody

みたいなエラーが出ました。
なんかspamdがrootで動いてるみたいな感じらしいです。ですので、

/usr/local/etc/rc.d/sa-spamd を

ommand_args=”-d -d -x -r -v -q -u hogehoge -A 202.211.xx.xx -r ${pidfile}”

で -u hogehoge みたいな感じで別のユーザーにしてあげると行けそうです。

あと、-A 202.211.xx.xx は、

spamd[40410]: spamd: unauthorized connection from noname.freedom.ne.jp [202.211.xx.xx] at port 24135 at /usr/local/bin/spamd line 1271.

がmaillogに出た時の対処です。なんかこうしないと、127.0.0.1からしかspamdは受け付けてくれないみたいです。

pgsqlの場合の/usr/local/etc/mail/spamassassin/sql.cf

user_scores_dsn DBI:Pg:dbname=spamassassin;host=localhost;port=5432
user_scores_sql_password xxxxxxx
user_scores_sql_username zzzzzzz
×user_scores_sql_custom_query SELECT preference, value FROM _TABLE_ WHERE username = _USERNAME_ OR username = ‘$GLOBAL’ OR username = CONCAT(‘%’,_DOMAIN_) ORDER BY username ASC
○user_scores_sql_custom_query SELECT preference, value FROM _TABLE_ WHERE username = _USERNAME_ OR username = ‘$GLOBAL’ OR username = ‘%’ || _DOMAIN_ ORDER BY username ASC

※postgresqlではconcatは使えない。

pgsqlの場合のuserprefテーブル作成

userpref

http://www.koders.com/sql/fid0DF2E1AD66C6EB4CE480765A739AD867D8EA4A07.aspx?s=update

CREATE TABLE userpref (
prefid bigserial NOT NULL unique primary key,
username varchar(100) NOT NULL,
preference varchar(30) NOT NULL,
value varchar(100) NOT NULL
);
CREATE INDEX userpref_username_idx ON userpref(username);

pgsqlの場合のawlfテーブル作成

http://www.opensource.apple.com/source/SpamAssassin/SpamAssassin-124.5/SpamAssassin/sql/awl_pg.sql

CREATE TABLE awl (
username varchar(100) NOT NULL default ”,
email varchar(200) NOT NULL default ”,
ip varchar(10) NOT NULL default ”,
count bigint default ‘0’,
totscore float default ‘0’
);
CREATE UNIQUE INDEX awl_pkey ON awl (username,email,ip);

pgsqlの場合のbayesテーブル作成

http://svn.apache.org/repos/asf/spamassassin/branches/3.0/sql/bayes_pg.sql
CREATE TABLE bayes_expire (
id integer NOT NULL default ‘0’,
runtime integer NOT NULL default ‘0’
);

CREATE INDEX bayes_expire_idx1 ON bayes_expire (id);

CREATE TABLE bayes_global_vars (
variable varchar(30) NOT NULL default ”,
value varchar(200) NOT NULL default ”,
PRIMARY KEY (variable)
);

INSERT INTO bayes_global_vars VALUES (‘VERSION’,’3′);

CREATE TABLE bayes_seen (
id integer NOT NULL default ‘0’,
msgid varchar(200) NOT NULL default ”,
flag character(1) NOT NULL default ”,
PRIMARY KEY (id,msgid)
);

CREATE TABLE bayes_token (
id integer NOT NULL default ‘0’,
token char(5) NOT NULL default ”,
spam_count integer NOT NULL default ‘0’,
ham_count integer NOT NULL default ‘0’,
atime integer NOT NULL default ‘0’,
PRIMARY KEY (id,token)
);

CREATE TABLE bayes_vars (
id serial NOT NULL,
username varchar(200) NOT NULL default ”,
spam_count integer NOT NULL default ‘0’,
ham_count integer NOT NULL default ‘0’,
token_count integer NOT NULL default ‘0’,
last_expire integer NOT NULL default ‘0’,
last_atime_delta integer NOT NULL default ‘0’,
last_expire_reduce integer NOT NULL default ‘0’,
oldest_token_age integer NOT NULL default ‘2147483647’,
newest_token_age integer NOT NULL default ‘0’,
PRIMARY KEY (id)
);

CREATE INDEX bayes_vars_idx1 ON bayes_vars (username);

smtp authについてはここがすごく参考になります。
http://satospo.sakura.ne.jp/blog_archives/tech/centos/postfix_smtpauth.html