用 qmail 实现 Firebird 接收 Internet 邮件
by flyriver@smth.org
以前有没有人弄过就不清楚了,我只管灌我的水。:)
假设域名为 example.com,在 BBS 里面的帐号为 faint,运行 BBS
系统的用户为 bbs,宿主目录为 /home/bbs,则本文所讲的方法可以
实现 faint@example.com 形式的邮件地址。当然了,在 DNS 中
example.com 的 MX 记录必须指向 BBS 主机。
1. 为什么选择 qmail 而不是 sendmail?
参考 qmail 的相关文档就知道了,最主要的原因是安全方面的考虑。
2. 应该如何做呢?
第一步 安装 qmail
如何安装 qmail 请参考 qmail 的相关文档,这里不说了。
第二步 修改 qmail 的配置
(1) 在 /var/qmail/control/rcpthosts 中加入 example.com,这样确保
qmail-smtpd 会接收投递给 user@example.com 的邮件。
(2) 在 /var/qmail/control/virtualdomains 中加入 example.com:bbs。
(3) 保证 /var/qmail/control/locals 中没有 example.com。
(4) 在 /home/bbs 目录中生成 .qmail-default 文件,加入一行:
|./bin/bbsmail
第三步 修改 mail2bbs 实用程序
我对 sendmail 和 PERL 都不熟,这一步的方法比较简单粗暴。:-)
进入 bbssrc/util/mail2bbs 目录,修改一下 Makefile 文件,把
all: mail2bbs fillperl install
中的 install 去掉,保存之后在 shell 中输入 make 生成 mail2bbs,
bbsmail, mailgate.pl 三个程序。
主要修改的地方在 bbsmail 文件中,这是一个 PERL 脚本。前面的
.qmail-default 文件中有 |./bin/bbsmail,表示 qmail 会调用 bbsmail
程序。要注意运行 bbsmail 时并没有参数,而原来用 sendmail 的话,
sendmail 会从 ID.bbs 中解出 ID 来,然后在调用 bbsmail 时,把 ID
作为第一个参数传递给 bbsmail。我在阅读了 qmail-command 的帮助之后,
明白了 qmail 在调用程序时,会设置很多有用的环境变量,而 bbsmail 所
需要的 ID 正好可以从环境变量中获得。完整的 bbsmail 例子如下:
#!/usr/bin/perl -U
# $Id: bbsmail.in,v 1.3 1999/05/08 00:14:30 edwardc Exp $
$bbsuid=30001;
$bbsgid=504;
$mail2bbs="/home/bbs/bin/mail2bbs";
require "/home/bbs/bin/mailgate.pl";
$)=$bbsgid;
$(=$bbsgid;
$<=$bbsuid;
$>=$bbsuid;
$ENV{'PATH'}='/bin:/usr/etc:/usr/local/bin:/usr/ucb';
# removed by flyriver, 2001.10.1
# Happy birthday to my lovely country.
# not need for qmail
#while ( $ARGV[0] =~ /^-/ ) {
# $_ = shift;
# if ( /^-d/ ) {
# $debug=1;
# }
#}
#$normaluser = $ARGV[0];
# get normaluser name from environment variable
$normaluser = $ENV{'EXT'};
$logdir="/home/bbs/log";
mkdir($logdir,0700) unless -d $logdir;
open(LOG,">> $logdir/mail-log") || warn "can't open warn file $!\n";
print LOG "\n";
print "\nMail to $normaluser \n";
print LOG "Mail to $normaluser \n";
&readmail;
for ($n=0; $n < $MAILBODY; $n++) {
print LOG $MAIL[$n];
}
print LOG "\'$Header{'From'}\' \'$normaluser\' \'$Header{'Subject'}\' "
."\'$Header{'Received'}\'\n";
open(BBSGATE,"| $mail2bbs \'$Header{'From'}\' \'$normaluser\' "
."\'$Header{'Subject'}\' \'$Header{'Received'}\'");
for ($n= $MAILBODY; $n <= $#MAIL; $n++) {
print BBSGATE $MAIL[$n];
}
close(BBSGATE);
if ($? ==0 ) {
print LOG "$Header{'From'} mail to $normaluser successfully\n";
print "$Header{'From'} mail to $normaluser successfully\n";
} elsif ($? ==767 ) {
print LOG "$Header{'From'} mail to $normaluser failed, return code $?\n";
print "$Header{From} mail to $normaluser failed, return code $?\n";
close(LOG);
die "Shared memory error\n";
} elsif ($? ==768 ) {
print LOG "$Header{'From'} mail to $normaluser failed, return code $?\n";
print "$Header{From} mail to $normaluser failed, return code $?\n";
close(LOG);
die "Service refused\n";
} else {
print LOG "$Header{'From'} mail to $normaluser failed, return code $?\n";
print "$Header{From} mail to $normaluser failed, return code $?\n";
close(LOG);
die "BBS user $normaluser unknown\n";
}
close(LOG);
0;
其他的两个程序 mail2bbs 和 mailgate.pl 请自行修改,另外使用 qmail 已经
不再需要 mail2bbs 是 setuid 的了,也用不着 chroot() 和静态链接了,因为
qmail 在调用 bbsmail 时是以 bbs 用户身份的。
3. 一些参考资料
(1) qmail 自己提供的文档,都应该细细阅读。
(2) Life with qmail,qmail 方面的极好的书,里面有一个极其有用的脚本。
(3) 《qmail 实用指南》,中国电力出版社。qmail 方面非常好的中文书籍,
尽管从里面可以看到很多 Life with qmail 的影子。
(4)
http://www.qmail.org/--
FROM 166.111.160.80