这几天这是多灾多难,修复烂系统真是考验人阿。。。。。。下面把Qmail的错误及解决汇总一下:
■ qmail-1.03的编译出现问题:
../load auto-str substdio.a error.a str.a
/usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss
mismatches non-TLS reference in substdio.a(substdo.o)
/lib/libc.so.6: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [auto-str] Error 1
后来搜了一下,在哪说的忘记了,是因为gcc版本高了以后对extern int errno这种写法不自动修正了。解决办法:
grep “extern int errno”
把所有grep出来的地方的”extern int errno”换成 #include
试了一下,果然解决。
原文找到了:http://www.webservertalk.com/archive66-2006-3-1441516.html
[bianbian补注]:其实这个错误再打个errno的patch就可以解决的。。。
■ Sorry,_message_has_wrong_owner._(#4.3.5)
queue队列损坏,删除/var/qmail/queue目录,重新make setup check生成目录
■ Sorry,_no_mailbox_here_by_that_name._(#5.1.1)
修改了/var/qmail/control/locals文件,所以,虚拟域名就无效了。
把locals文件清空,就不会出现这个问题了。
■ qmail能发不能收, qmail_has_prog_delivery_but_has_x_bit_set
连自己域内发给自己的都收不到。一般是.qmail-default的权限问题。查看日志会发现:
deferral: Uh-oh:_.qmail_has_prog_delivery_but_has_x_bit_set._(#4.7.0)
前面我抱怨过了,给我的网站恢复数据居然是NTFS的,导致所有文件权限丢失。详见抱怨贴
一定要去掉 /home/vpopmail/domains/域名/.qmail-default 的x权限
即 chmod -x /home/vpopmail/domains/域名/.qmail-default
■ 454 oops, unable to write pipe and I can’t auth
详见:[原] qmail打了smtpd-auth补丁后454 oops, unable to write pipe and I can’t auth
■ pop3 遇到 -ERR this usr has no $HOME/maildir
supervise/qmail-pop3d/run里启动pop3d的脚本可能有错,应该是:
|
#!/bin/sh PATH=/var/qmail/bin:/usr/local/bin:/usr/bin:/bin export PATH QMAILDUID=`id -u vpopmail` NOFILESGID=`id -g vpopmail` exec tcpserver -H -R -v -c100 -u "$QMAILDUID" -g "$NOFILESGID" 0 110 qmail-popup nju.org.cn \ /home/vpopmail/bin/vchkpw \ /var/qmail/bin/qmail-pop3d Maildir 2>&1 |
■ 解决qmail经常收到投递失败的邮件
这一段部分来自:http://blog.5ilinux.com/archives/2006/04/qmailerror.html
首先说明一下<>和<#@[]>都是系统bouce信件信封(envelope)上的寄信人地址
这两种信都是系统产生的,区别在于<>往往是系统single bouce的地址,而<#@[]>则是系统double bounces或者triple bouces的地址
系统用这两种地址是为了避免邮件回路(mail loops)
来自<#@[]>一般都是系统的double bounces
要去掉这些double bounces可以有一种简单的办法
其原理是产生一个nobody的地址,发往这里的信件都会被丢弃,这样double bouces就不会烦你的postmaster了
具体步骤如下:
|
echo "#" > /var/qmail/alias/.qmail-doublebounceto (或者直接丢弃:echo "| cat > /dev/null" ... ) echo "doublebounceto" > /var/qmail/control/doublebounceto |
■ 垃圾邮件太多
1)装上发信黑名单 CBL: http://anti-spam.org.cn
2)装上maildrop和垃圾邮件过滤器 SpamAssassin: http://spamassassin.apache.org/
简单点,直接用perl的cpan安装:cpan Mail::SpamAssassin
这里有具体方法:
Getting SpamAssassin, MailDrop, VPopmail and qmail to play friendly
用 qmail + vpopmail + maildrop + spamassassin 实现邮件过滤的方案
其实我觉得老外的那个办法更好,直接改.qmail-default一个文件就行了。结合两者长处,我写了一个又支持用户自定义黑白名单,又不需要到处放.mailfilter的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
.qmail-default |/usr/local/bin/maildrop ./.mailfilter .mailfilter VPOP="| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox" VHOME=`/home/vpopmail/bin/vuserinfo -d $EXT@$HOST` #check dir `test -d $VHOME/Maildir/` if( $RETURNCODE != 0 ) { echo "Sorry,_no_mailbox_here_by_that_name." EXITCODE=77 exit } #blacklist # `test -f $VHOME/.blacklist` if ($RETURNCODE==0) { $DOMAIN=`expr $SENDER : '.*@\(.*\)'` if ($SENDER ne '' && (lookup($SENDER, "$VHOME/.blacklist") || lookup($DOMAIN, "$VHOME/.blacklist"))) { #to "$VHOME/Maildir/.Trash/" to /dev/null } } #whitelist # `test -f $VHOME/.whitelist` if ($RETURNCODE==0) { if ($SENDER ne '' && lookup($SENDER, "$VHOME/.whitelist")) { to "$VHOME/Maildir/" } } #spamassassin # if ($SIZE < 262144) { exception { xfilter "spamc -f -u $EXT@$HOST" } } else { exception { to "$VHOME/Maildir/" } exception { to "$VPOP" } } if (/^X-Spam-Flag: *YES/) { ADDQUOTA = " $SIZE 1" `echo $ADDQUOTA >> $VHOME/Maildir/maildirsize` to "$VHOME/Maildir/.Trash/" } else { exception { to "$VHOME/Maildir/" } exception { to "$VPOP" } } |
■ 加入maildrop作为投递程序后的可能错误
maildrop:_Cannot_have_world/group_permissions_on_the_filter_file_-_for_your_own_good./
.mailfilter必须是0600属性
failure: Unable_to_execute_/sbin/nologin/Unable_to_execute_/sbin/nologin/
或者
Sorry,_no_mailbox_here_by_that_name._(#5.1.1)
如果编译maildrop的时候设置了vpopmail作为uid来跑,即
|
./configure --enable-maildrop-uid=vpopmail \ --enable-maildrop-gid=vchkpw --enable-maildirquota --without-db \ --with-trashquota |
则必须给vpopmail一个shell,默认好像是/sbin/nologin,修改/etc/passwd,改为/bin/bash即可