Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2521284
  • 博文数量: 867
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 9800
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-27 14:44
文章分类

全部博文(867)

文章存档

2007年(6)

2006年(861)

我的朋友

分类: LINUX

2006-08-26 00:33:38

本帖收集论坛内的Qmail相关的FAQ。
抄袭无双的话,“在论坛的回答中有许多好的回答,但是如果每一个都要写到精华的话
那么精华又未免太多了”;同时也为了避免各位重复讨论相同的小问题,我就整理了这篇文档。

另外,涉及的方面太多,我不可能一一尝试,如有谬误,请不吝赐教。

建议大家把自己认为好的回答写到这个帖子的回复中,并写上讨论的帖子连接

准备分几个部分。


第一部分:MTA

第二部分:igenus

第三部分: sqwebmail

第四部分: vpopmail + qmailadmin

各位还可以补充。

我们会定期将各位提供的FAQ和论坛上的好东西整理进去,并为各位作者署名。


第一部分:MTA

1: 怎么加快 qmail 投递邮件速度?

A: /var/qmail/control下面是qmail的控制文件,这两个文件:
  Concurrentcylocal default: 10 最大本地同时传送数
  Concurrencyremote default: 20 最大远程同时传送数

2: Qmail的主要配置文件有哪些?
A:

3: qmail+LDAP安装配置方法? (netloafer)
A:

4mail如何限制附件的大小呢??
A:
在/var/qmail/control/databytes 文件中设置附件的大小,可以实现对qmail附件大小的限制,一般安装完成后,这个文件是没有的,你可以自己创建。
smtp方式是以qmail的databytes作限制的

5: 用qmail怎么封mailfrom? (peng)
A:使用qmail控制文件封整个域或邮件地址
vi/var/qmail/control/badmailfrom
这个控制文件实现拒收邮件功能的,每一个地址要单独一行。而且,不用重起qmail就能生效。
例如:
peng@96633.net-----限制一个特定的用户
@sina.com----限制整个域中的邮件

B:使用tcprules规则文件封IP地址(gadfly)。

#网段
10.10.10.:deny
#ip
10.10.10.1:deny

重新生成cdb文件就好了


6. 如何让队列中的邮件马上传递? (peng)

A:
# kill -HUP qmail-send

要删除队列中的邮件

1) 停止QMAIL
2) mv /var/qmail/queue/lock /var/qmail/;find /var/qmail/queue/ -type f -exec rm {} \; ;mv /var/qmail/lock /var/qmail/queue/
3) 重启QMAIL.
队列中的邮件包含在以下目录中 /var/qmail/queue/{info,mess,remote,local}/hash/#number

7、在邮件队列中快速删除从一个地方发过来但又不存在的邮件? (peng)
A:
设bad.jite.com是这个域。可以键入以下命令

# echo # >; ~alias/.qmail-baddomain-default
# echo bad.jite.com:alias-baddomain>;>; /var/qmail/control/virtualdomains
# echo bad.jite.com:127.0.0.1 >;>; /var/qmail/control/smtproutes
然后运行/var/qmail/bin/qmail-tcpok,给qmail-send 一个HUP信号

8、如何删除队列中的大量广告信息? (peng)
A:
先停止QMAIL.
1) 停止qmail, qmail-smtpd
2) 在以下默认目录下 /var/qmail/queue/mess
find . -type f -exec grep "^Subject:" {} \; -print -exec rm {} \;
3) 运行queue-fix清除相关文件,
4) 重启qmail.

9、rh9下编译qmail出错:
./load auto-str substdio.a error.a str.a
substdio.a(substdo.o)(.text+0x43): In function `allwrite':
: undefined reference to `errno'
collect2: ld returned 1 exit status
make: *** [auto-str] Error 1
什么问题?(microcao &linuxsky)


A: errno 这个错误是因为 RH9 系统使用了新的 GLIBC 库 2.3.1 造成的
需要修改 QMAIL 的代码才能编译另外 DJB 的几乎所有程序都存在这个问题

QMAIL 官方已经提供了推荐的补丁



打个这个补丁就行了

至于tcpserver可能也有相同的问题,patch都可以在以下目录找到


10:Apr 7 17:52:15 www qmail: 1049709135.048259 delivery 38: deferral: Uh-oh:_home_directory_is_writable._(#4.7.0)如何解决?
A:需要将用户的邮件目录修改为700
由于vpopmail利用的是wildcard方式匹配的,所以homedir必须从domain的目录开始。假设gadfly@test.com目录是/home/vpopmail/domains/test.com/gadfly/
这样修改属性:
cd /home/vpopmail/domains/;chmod 700 test.com test.com/gadfly test.com/gadfly/Maildir/

11:.qmail file is writable错误如何解决?(xmy)
A:用户目录下的.qmail文件组和其它用户属性不能可写。
至于vpopmail方式, 域目录下的.qmail-*必须去掉写属性
chmod go-w .qmail-*
或者
chmod 600 .qmail-*
此外还需注意的文件属性有libmysqlclient.so.10.0.0
chmod 755 /usr/lib/libmysqlclient.so.10.0.0


12: 每发完一封
邮件后都会自动回复一封内容大概就是说发不出去的意思。自动回复的信件内容是这样的
.....
;:
Sorry, no mailbox here by that name. vpopmail (#5.1.1)


A:你的qmail是用新的iceblood版本安装的吧。

这个版本的qmail,缺省情况下,每封出入的信件都会发到log用户。

如果想禁止这个动作,需要替换qmail-queue.
将extra.h中的
#define QUEUE_EXTRA "Tlog\0"
#define QUEUE_EXTRALEN 5
改成
#define QUEUE_EXTRA ""
#define QUEUE_EXTRALEN 0

重编译替换qmail-queue就好了。
具体见life with qmail 的E.3

如果想把进出的邮件都复制一份给一个特定的用户,反过来修改就行了.

CODE:
将extra.h中的
#define QUEUE_EXTRA ""
#define QUEUE_EXTRALEN 0

改成
#define QUEUE_EXTRA "Tlog\0"
#define QUEUE_EXTRALEN sizeof(QUEUE_EXTRA)
把log改成你需要copy到的用户,重新编译qmail-queue就ok了。


13.客户端发信,报错如下:
553sorry,that domain isn't in my list of allowed rcpthosts (5.7.1)
怎么解决?

A:
smtp server需要auth么?
判断方法如下:
telnet localhost 25
ehlo gadfly

如果显示有Auth....,就是需要Auth的。

如果需要,客户端是否配置auth了。如果没有,发往外域,就是这个错。

如果不需要,客户端的mailfrom是否是/var/qmail/control/rcpthosts中配置的域,如果不是,就是这个错.


14.发信有问题?如何检查SMTP服务是否有问题?是否启动了?
A:最好的办法就是直接连接smtp服务,如下:
telnet your_server_ip 25
用smtp命令去测试,具体的命令使用,参见


15.每次客户端发信时,qmail总要试图连接客户端113端口,从而导致发现过程缓慢 在网上查到说,关掉Auther Idnet可以解决,但应该怎样做呢?
A: tcpserver的命令行加上 -H -R就好了

16.配一台qmail服务器,不管to的地址是什么,都转发到另一台SMTP服务器这个时候Qmail该如何设置呢??
A:可以利用smtproutes
rainbow.linuxfane.com:mail8.rainbow.jp
:fw.rainbow.linuxfane.com:8088
第一行的存在会将发给rainbow.linuxfane.com的邮件重定向到mail8.rainbow.jp主机
第二行的存在会将任何不符合之前行条件的邮件重定向到fw.rainbow.linuxfane.com的8088端口,让
邮件安全的穿越防火墙
另外,注意,如果不想收任何域的信件,virtualdomains也必须置空。

17.smtp 使用auth patch后,出现以下一些问题:
    a.加认证报out of memory, 不加就过了。
    b. 如果带域名,正常;不带,报auth failure
      c.随便输入什么用户名密码都能过。
怎么解决?

A:参看
如果还是不行,建议换另外一个试试

18. qmail中如何清空队列(queue)中的所有消息?
A:find /var/qmail/queue/ -type f -a -name [1-9]* -exec rm {} \;

19. solaris下编译ezmlm的时候,错误提示是/usr/include/time.h
出现getdate错误,请问因该如何解决?(agang)

A: 这是ezmlm的一个bug,只在solaris下编译才出现:

把第885和第1869行的修改:

885 void getdate(struct msginfo *infop,int flagfail)
1869 getdate(infop,0);
为:
885 void ezmlmgetdate(struct msginfo *infop,int flagfail)
1869 ezmlmgetdate(infop,0);

就可以编译通过了。

20.在REDHAT9.0下安装qmail,POP3或smtp非常慢,为什么?
A: pop或smtp的脚本中,tcpserver命令行中加上-H -R -l 0参数,防止客户端域名反查,用户indent反查和本地域反查。

21.这段日志是什么意思?第一列比如 “@400000003f53417b37a114cc ”代表什么意思啊?
我能直接转换成具体的时间吗?比如某年某月某日某分某秒吗??
或者是像 messages 那样表示时间?


QUOTE:
@400000003f304780381352e4 tcpserver: status: 0/40
@400000003f3631091d390694 tcpserver: status: 0/40
A:
这是tai64格式的时间。 具体的描述见

你可以用

tai64nlocal
来显示可读的时间

22.sina的mail问题,给新浪发信出现一下错误,如何解决?(artxing)

CODE:
553 Domain information in your 'HELO' dialog is not in the stadand format reque
sted by RFC 821 and RFC 1035, please send your correct domain information accord
ingly. 您的IP为国内IP,且与您的MTA服务器IP信息不符!Please contact our mail serv
ice engineers on antispam@staff.sina.com.cn. if you have other problems, or anyt
hing disallowed by our system.. --------------------------------------------您会
话中的helo没有按照RFC 821 RFC 1035的标准,发送您正确的domain信息。Your IP addres
s belonging to domestic domain, and your IP informaiton dismatch with the inform
ation provided by the MTA server 如果存在其他问题或者不符合我们屏蔽要求,请发信
到antispam@staff.sina.com.cn
A:
echo "我的邮件服务器的真实域名(A记录)" >; /var/qmail/control/helohost

23.qmail下smtp不能发信,telnet也不成?
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
(wjger)
A:
检查vchkpw, tcp.smtp.cdb文件的属性是否正确。
主要是在编译过程中,不知为何tcp.smtp.cdb 丢失。另外还有一个体会是 mysql 中的grantq权限设置中的域名(vpopmail@localhost)应该和vmysql.h中的mysql服务器名是一致的。否则会造成vadddomain 拒绝连接失败的现象!!

第三部分: sqwebmail
1. 升级sqwebmail的注意事项? (redfox)

A: 升级好后最好把qmail停止,把authdaemond重启动
/usr/local/qmail/webmail/libexec/authlib/authdaemond stop
/usr/local/qmail/webmail/libexec/authlib/authdaemond start  
然后再启动qmail,不然会出现一些莫名其妙的问题

2.sqwebmail如何限制附件大小啊?(lovecelery)
A: 我想把附件大小设成4M,但是默认是2M,方法如下:
在configure的时候指定
--with-maxformargsize=4194304 --with-maxmsgsize=4194304
就可以了
--with-maxformargsize是允许上传的附件大小,不包含邮件正文的, --with-maxmsgsize是全部邮件的大小,正文+附件的

3.如果我们有默认域,可以凭用户名和密码直接登陆,但是登录后往往出现
user@localhost.loacldomain,而不是你所想要的user@yourdomain.com,
怎么解决?(oranger2001)

A: 在/usr/local/share/sqwebmail下面建立一个hostname文件,默认情况下好像无此文件,文件里面加入 yourdomain

这样以用户名进入就可以正常显示你的后缀啦!!

4.请问我如何设定sqwebmail上页面的空闲停留时间?
因为我登陆sqwebmail后,如果超过一定时间就会要求我重新登陆,我想把这个时间值改大一些。

A:两个办法,
1、sqwebmail编译的时候,指定
--enable-hardtimeout=7200 Hard session timeout (2hrs default)"
--enable-softtimeout=1200 Inactivity timeout (20 min default)"

后者是没有活动下的session timeout,
前者是有活动,也强制timeout。

2、也可以给cgi指定环境变量SIGWEBMAIL_TIMEOUTSOFT,SIGWEBMAIL_TIMEOUTHARD来取代configure时缺省指定的时间。

但是注意,这种方式一定要和cleancache.pl中的时间一致。



第四部分: vpopmail + qmailadmin

1: 如何通过vpopmail实现qmail邮件账户的数据库管理?(netloafer)


2:能不能修改默认的域名?(peng)
A:
要更改haohao.com为默认域。
方法:
更改~qmail/control/
defaultdomain
me
plusdomains
逐一更改启动pop3和 smtp的启动脚本:
修改:email.3sk.com为haohaoo.com
在最上边添加:export VPOPMAIL_DOMAIN=haohaoo.com

只要你的dns server给虚拟域做好了设置。
你的outlook and foxmail里的用户输入用户的全名,就没问题阿!
不要用:master ,系统默认认为是master@email.3sk.com了
要用master@haohaoo.com ,这样才可以的。

2.如何做Qmail用户的备份?也就是如何将一个系统的Qmail用户完整地转移到另一个系统?(peng & netloafer)
A:
a.cdb配置的?那么请把/home/vpopmail/domains这个文件夹备份好就可以了。用户和密码文件,还有用户信件都在这个目录下。
还应该备份/var/qmail/control下的相关配置文件。

b.如果是以MYSQL数据库方式来存储用户认证信息的
只需要备份
~vpopmail/domain下的所有邮件
/var/qmail/control的配置文件
MYSQL数据库目录下的vpopmail库目录。一般是/var/lib/mysql(RPM)、/usr/local/mysql/data、/usr/local/mysql/var下面。


3.以下错误怎么解决?
warning: file name is symbolic link header.html warning: file name is symbolic link show_login.html warning: file name is symbolic link footer.htm. (xmy)

A:
出错原因应该是htmlibdir目录不能正确读取,重新编译qmailadmin:
./configure 的时候带option--with-htmllibdir=....
注意目录的属主uid和gid:vpopmail vchkpw

4.安装VPOPMAIL以后发现MYSQL里还是没有VPOPMAIL的DB啊?
A:
vadddomain第一个域,才有vpopmail db     

5. 我用vadddomain时时提示:
#/home/vpopmail/bin/vadddomain xxx.com
Please enter password for postmaster:
enter password again:
Error: Domain already exists
但是mysql里的确没有vpopmail这个库,怎么回事?

A:

原因是如果你先前用vadddomains加过域,后来又手工删除数据库,后来vadddomain加相同的域,就加不了,报
"Error: Domain already exists "

这是因为在/var/qmail/control/virtualdomains和/var/qmail/users/assign及cdb包含相应的域,vaddaddomains时会检查这些文件,有就报这个错。

所以解决方法如下:
1.删除/var/qmail/control/virtualdomains和/var/qmail/users/assign相应的域信息

2.运行/var/qmail/bin/qmail-newu重新生成cdb

3.vaddadomains your.domain
就好了

所以为了避免这种麻烦,以后尽量用vdeldomain删除域,而不是手工的删除数据库中的数据,容易造成不一致。     

4.编译qmailadmin和vpopmail的时候报找不到mysql的头文件或库文件。(nicosoft)
A:
1.如果是rpm方式安装的mysql,方法如下
rpm -qa|grep -i mysql
看看有没有开发包,如果有,一般再devel中
rpm -ql mysql-devel
2。如果是源码安装
--prefix=/usr/local/mysql
的话那么你的
indir=/usr/local/mysql/include/mysql
libdir=/usr/local/mysql/lib/mysql
如此类推     

5.能不能更改域的默认管理账号?在qmail+vpopmail中,能不能更改域的默认管理账号,怎么更改。默认是postmaster,能不能改成如,webmaster?
A: vmoduser有个-a参数,可以赋予用户管理权限。

如果想全面禁用postmaster的特殊权限话,就只能改源代码了。   

6.如何成批添加/导入用户

第一种方法(garfy):

a.在home目录下建立文件adduser.sh
touch adduser.sh

b.编辑adduser.sh
ee adduser.sh 加入一下内容:

while read line
do
echo $line
/home/vpopmail/bin/vadduser $line $line
done < user

c.建立文件user,并输入用户
   touch user
   ee user
   
   11
   22
   33
d.执行adduser.sh
   ./adduser.sh

这样user文件中输入的用户就添加到默认域中了,用户名和密码都是一样的。

第二种方法(gadfly):

CODE:
#!/bin/sh

#batchadduser.sh: batch add mail user.
#install step.
#chmod u+x batchadduser
#./batchadduser.sh domain datafile

if [ $# -lt 2 ]
then
    echo "usage: $0 domain datafile"
    exit 1
fi

domain=$1
datafile=$2
addcmd=/home/vpopmail/bin/vadduser

while read username passwd
do

$addcmd $username@$domain $passwd

done < $datafile
文件内容的格式
username1 passwd
username2 passwd2
............   
把内容保存到datafile文件中
执行
./batchadduser.sh localhost.com datafile

7、vpopmail make Error ,
[root@localhost vpopmail-5.2.1]# make
make all-recursive
make[1]: Entering directory `/root/download/qmail/vpopmail-5.2.1'
Making all in cdb
make[2]: Entering directory `/root/download/qmail/vpopmail-5.2.1/cdb'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/root/download/qmail/vpopmail-5.2.1/cdb'
make[2]: Entering directory `/root/download/qmail/vpopmail-5.2.1'
gcc -I. -I/usr/local/mysql/include -g -O2 -Wall -c vpopmail.c
vpopmail.c:26:20: string.h: 没有那个文件或目录
...
make[2]: *** [vpopmail.o] Error 1
make[2]: Leaving directory `/root/download/qmail/vpopmail-5.2.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/download/qmail/vpopmail-5.2.1'
make: *** [all-recursive-am] Error 2

A: 把glibc-devel安装上先。

告诉你们一个好办法,以后缺什么文件,这样找原因。

例如我的机器没问题,我就可以这样找到原因,
1.
string.h这类的头文件,一般都在/usr/include下
find /usr/include -name string.h
/usr/include/string.h

2.
rpm -qf /usr/lib/bcc/include/string.h

pm -qf /usr/include/string.h
这样你就知道缺什么了。

找的方法只是针对linux系统的情况,其它os都有相应的找软件包的办法。
但是错误的原因的是一样的,就是缺软件包。

有的时候make报ld .... -lz之类的错误,也是这个原因。

可以用类似的办法找错误

8.把一邮件域的名字比如a.com更改为b.com,如何实现?(beck2000)
A:以下几个步骤:
1、cd /home/vpopmail/domains
mv a.com b.com

2、把vpopmail数据库的vpopmail表导出把所有a.com改为b.com,然后删除vpopmail表,再导入.

3、把把vpopmail数据库的dir_control表的a.com改为b.com

4、在/home/qmail/control 目录下把 virtualdomains和rcpthosts下的的a.com改为b.com.

5、在/home/qmail/users目录下把assign文件的a.com改为b.com

6、需要运行qmail-newu重新生成cdb。assign只是配置文件,cdb才是实际的数据文件。
阅读(2644) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~