分享
 
 
 

qmail邮件系统(3)qmail的工作原理和配置文件的设置

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

(三)qmail的工作原理和配置文件的设置

作者:peng

论坛ID:peng www.chinaunix.net

QQ: 螃蟹 16360544

前言

在这章里,我们主要是介绍qmail的工作原理和配置文件的设置。通过这一节,让我们

更好的分析问题和设施qmail。

3.1 qmail是什么?

qmail包是在unix系统上的一个邮件程序。qmail程序是由dan bernstein开发出来的

为标准的unix服务器提供邮件传输代理的(mail transfer agent,mta)功能的,用来替代sendmail。qmail因特网主页http://www.qmail.org。

3.2 qmail和相关的服务

qmail提供了mta功能,但是客户要能看到自己的信件,还需要其他协议和软件。两种

常见的远程用户取回他们消息的机制是邮政协议(post office protocal,pop3)和互交邮件访问协议(interactive mail access protocol,imap)。

综述:

qmail系统包括几个可执行程序、配置文件、qmail工具和环境变量,这些彼此互相影响,共同提供邮件服务。

3.3 qmail投递邮件进程流程

qmail系统中有9个核心程序,这里简单的介绍一下。qmail-smtpd负责接收来自远程主机的邮件消息并将它们传送给qmail-queue处理。qmail-inject程序是用来接收本地产生的邮件消息并传送给qmail-queue程序。qmai-queue程序处理他们发来的邮件,移进邮件队列以便发送。一旦消息被成功的放在邮件队列中,就调用qmail-send程序来处理他。qmail-send检查邮件队列中每一个消息状态,前一次邮件请求失败的消息被识别,并决定它是临时失败还是永久的,临时失败会再次投递,永久失败将被送递到qmail-clean程序,被删除掉。也就是说, qmail-clean实用来清除永久失败的的邮件消息的。

qmail-send调用了qmail-lspawn 和qmail-rspawn程序。qmail-send判断邮件是发给谁的,发给本地的,就交给qmail-lspawn程序,再由qmail- local投送到本地邮件服务器。要是确定为远程主机,就调用qmail-rspawn程序,qmail-rspawn为每一个邮件消息的接受方决定目的的邮件服务器,再调用qmail-remote程序发送。

2.2qmail的进程

qmail-send

splogger qmail

qmail-lspawn

qmaiil-rspawn

qmail-clean

qmail在任何时候都要求有五个程序在后台运行。这些核心的程序允许qmail扫描新邮件,并将他们发送到适当的目的地。

3.4 qmail实用工具程序

除了以上五个qmail进程外,进程和本地用户在处理和传输消息的过程中,都还会用到几个其他的qmail实用工具程序。如下:

bouncesaying 允许用户将消息转发给程序或者程序不可用时反弹回信息

condredirect 允许用户将消息转发给程序,然后把消息转发到另一个地址

except 过去常用来修改一个调用程序的退出编码

forward 将消息转发给一个备用的邮件地址

maildir2mbox 将在maildir格式邮箱中的消息转换到一个标准的sendmail邮箱中

maildirwatch 产生一个maildir格式的邮箱

maildirwatch 监控一个用户的邮件目录并报告所有的新消息

preline 在将消息转发给相关程序前预处理这些消息

qbiff 当新消息到达后向用户终端显示器上写一个通知

qmail-clean 从qmail邮件队列中永远的移出无法到达的消息

qmail-inject 将新消息插入到qmail邮件队列中

qmail-local 向本地邮件系统上的用户投递消息

qmail-lspawn 由qmail-send调用以便向qmail-local程序转发消息

qmail-newmrh 用来从morercpthosts文件中创建qmail数据库

qmail-newn 从一个包含系统用户名和邮件名的ASCII文件表建立一个qmail用户文件

qmail-pop3d 接受pop3连接以便让用户阅读他们的邮箱

qmail-popup 用来验证pop3连接中的用户ID和密码

qmail-pw2u 将UNIX系统的用户id和密码转换成qmail-newn能用的一个表结构

qmail-qmtpd 接受远程主机发来的qmtp连接请求

qmail-qread 产生一个显示当前qmail邮件队列里消息的报告

qmail-qstat 产生一个报告来显示当前处在qmail投送状态下等待发送的消息数目

qmail-queue 将邮件消息排队等待投送

qmail-remote 将消息投送给远程邮件用户

qmail-rspawn 由qmail-send调用来向qmail-remote转发消息

qmail-send 尝试投送qmail邮件队列里的邮件消息

qmail-showctl 显示当前的qmail系统配置情况

qmail-smtpd 接收来自远程主机的smtp连接请求

qmail-start 初始化qmail的启动脚本

qmail-tcpok 用来清空qmail-remote中用到的tcp超时记录表

qmail-tcpto 显示当前的tcp超时记录表

qreceipt 用来会应对要求受到进行确认的消息

sendmail 用来将sendmail程序的功能复制到mta程序中

splogger 将消息插入系统登陆程序中

tcp-env 将网络连接的信息转换成unix环境变量

每一个qmail实用工具程序都在正确的处理和投递邮件消息中扮演不同的脚色。其中有一些只能qmail内核程序调用,其他的就可以由qmail的系统管理员用来处理消息并得到统计信息。还有一些可以被单个普通邮件用户来制定自己的邮件消息处理。

3.5 qmail环境变量

除了控制文件之外,qmail程序还能使用unix环境变量来控制他们的动作。多数的控制文件的值都能被一个相应设定的环境变量重载。如果该环境变量没有设定,就使用控制文件的值。qmail的环境变量是在qmail程序运行前就被设置好的。这是由一个包装程序完成的。常见的是 tcpwrapper和tcpserver。本文就是用的tcpserver。在以后的《(四)ucspi-tcp的原理和设置》内容中,再详细讨论。

3.6 qmail控制文件

这一部,对于管理好qmail,非常重要的。控制文件是qmail配置中的中心环节,它控制了qmail的操作性为。它位于 /var/qmail/control目录下。每一个文件包含一个值,这个值定义了相应的qmail可执行程序的变量。qmail控制文件是定义了 qmail参数的ASCII文本文件。大多数控制文件要求一个单一的文本值,该值可以在一行中输入。也有一些控制文件能包含多个值。在这种情况下,每一个值被输入到单独的一行中,每一行以一个标准的UNIX换行符(LF)结尾。还有一个要重点注意,就是控制文件的权限问题,推荐root可读写,其他只读。

#chmod 644 /var/qmail/control/*

以下将逐一介绍个控制文件:

-------- badmailfrom

这个控制文件实现拒收邮件功能的,每一个地址遵循前面说的规则,要单独一行。而且,不用重起qmail就能生效。

例如:

peng@96633.net -----限制一个特定的用户

@jp.yahoo.com -----限制一台远程主机上的所有主机上的所有用户

@sina.com ----限制整个域中的邮件

------ bouncefrom

用来定义用户名的,该用户名是出现在那些被退回给原始发件人的消息中,一般都是永久的投递失败消息。Bouncefrom默认值是MAILER-DAEMON,它通常是一个虚拟用户名,是一个真实用户的别名。你要是想给用户的退信消息中用另一个名字,可以用一下命令:

# echo postmaster > /var/qmail/control/bouncefrom ---给改为postmaster,我习惯的。

------- bouncehost

制定了退信消息中的主机名,默认的值是me文件的主机名。

-------- concurrencylocal

定义了qmail能够同时运行的本地投送进程数。对于大型的邮件主机,非常重要。他的默认参数是10。就是允许多达10个本地邮件投递进程同时运行。这个控制文件的最大值是由qmail源代码中的conf-spawn变异参数设置的,这个编译参数默认值是120,他的最大值是255。

-------- concurrencyremote

定义了qmail可以同时运行的远程投递进程数,默认值是20。它也是由conf-spawn设置的,默认值是120,最大可设255。但是要根据你的实际情况,因为运行进程要需要内存和硬盘的,设太大了小心你的服务器负载!

------- defaultdomain

默认域名,如果给本地的邮件用户发信,没有加上域名,qmail-inject会给他添加defaultdomain文件中的域名。如果设置了QMAILDEFAULTDOMAIN环境变量,他就会重载defaultdomain控制文件的值。

--------- defaulthost

默认主机名,同一邮件服务器上,给本地用户发邮件,如果收信的用户地址没加域名,就会添加主机名。例如:邮件主机mail.chinaunix.net, 给本地用户peng@rchinaunix.net发邮件,from:peng ,那么qmail就会给这个消息扩充为peng@mail.chinaunix.net,qmail-send识别更容易了。通常,大家希望只看到域名 @chinaunix.net,不看到主机名@mail.chinaunix.net,因而qmail就只让你看到了域名。

------databytes

定义由qmail-smtpd接受到的邮件消息所允许的最大字节数,也就是发送和接受邮件的大小(本机上给本机用户出发和接受除外)。就是说,远程邮件主机和你用outlook、foxmail等远程的mua工具发信,都受他的限制。默认值是0,表示不限制。无法理解的是,默认没有这个文件,一定要加上。假想以下,有个电信的哥们给你使坏,在骨干网机房,写个定时任务,没事就给你发几个100m的信件,嘿嘿。。。

# echo 10000000 >/var/qmail/control/databyte ---设置为10m,超过10m,将得到code 552,告知:其邮件大小超出了该邮件主机所能容忍的限度

---- doublebouncehost

用来为那些经历了两次反弹后的消息指定主机名。默认是me文件的值

---- doublebounceto

用来为那些经历了两次反弹后的消息指定用户名,默认是postmaster。

---- envnoathost

是qmail-send用来为没有指定主机名的邮件接受方指定他的主机名的,默认是没有这个控制文件的,qmail-send使用me文件定义的

---- helohost

指定在qmail-remote与远程邮件服务器的smtp会话中用到的主机名。如果helohost控制文件没有给出,qmail-remote使用me文件的值。

---- idhost

指定了用来在消息中产生message-ID:头字段得主机名,默认qmail-inject用me文件的值。

---- localiphost

用来为邮件消息指定本地地址的,内容是邮件主机的ip地址。但是它用在dns上就会有问题。建议不要设置。

---- locals

指定邮件本地地址,不存在,qmail-send就假定me文件的值为邮件主机的唯一可用本地邮件主机。

---- me

用来指定本地邮件服务器的主机名,最重要的控制文件,如果没有,qmail将不会运行。

me控制文件通常是靠运行qmail配置子目录下的config脚本文件来建立的,config脚本自动判断邮件服务器的dns域名,并产生一个适当的控制文件(me ,locals,rcpthhosts)。如果某种原因你的邮件服务器无法连通dns服务器,可以手工运行configfast来指定邮件服务器主机名:

# /var/qmail/configure/config-fast mail.chinaunix.net

---- plusdomain

用来将一个域名指定成任何一个以一个加号(+)结尾的地址。缺省的情况下,出现在me文件的域名被添加到任何一个以加号结尾的邮件地址中。

---- queuelifetime

用来指定一个消息在他被删除前,可以在邮件列表中保存的时间秒数。默认是604800,当投递失败的消息超过规定的时间,将被从邮件队列中删除。

---- rcphosts

定义了qmail可以接收消息的主机和域名。 不过因为rcpthosts中的域名最好不要超过50行,多出的添加到morercpthosts中。

---- morercpthosts

用来指定qmail将要为其接受消息的额外的主机和域名。

---- smtpgreeting

用来指定SMTP连接的欢迎标志 ,默认是用me文件的主机名。

例如:smtpgreeting值为 welcome connect to out open relay mail server –mail.chinaunix.net

那么建立一个smtp连接的时候将会看到如下信息:

Trying 198.160.x.x...

Connected to mail.96633.net

Escape characteris ^].

220 welcome connect to out open relay mail server –mail.chinaunix.net ESMTP

---- smtproutes

用来指定能够被用来将邮件投送给特定目的地的静态smtp连接的。

smtprouter行格式如下:

host : relay

其中host可以是一个主机名或者域名,这个值将被重定向到有relay所定义的一个特定的邮件主机上。

举例:

beijing.chinaunix.net :shanghai.chinaunix.net

chinaunix.net :

:tianjin. chinaunix.net :2000

第一行,定义了任何到beijing. chinaunix.net的消息重定向到shanghai. chinaunix.net

第二行,强制qmail对任何以chinaunix.net结尾的地址进行dns查询。

第三行,通过不指定第一个参数,任何不在前两行范围内的消息都会被转发到邮件服务器tianjin.96633.net。同时,还用2000端口替代标准的smtp tcp的25端口。这个技术常常用在通过一个防火墙连接到internet邮件中继中。

注意:smtproutes可定义许多特定的smtp路由。需要主机的是他的地址列表,qmail会按照smtproutes文件中出现的顺序,来处理这些地址。有时顺序不对,会引起邮件循环,切记!

---- timeoutconnect

用来指定qmail-remote将要等待的一个时间秒数。也就是说等待远程smtp服务器接受本地的一个smtp请求响应的时间,默认是60秒。对于质量不好的网络,可以适当调节。

---- timeoutremote

用来指定qmail-smtpd等待远程SMTP主机发送数据的时间线。默认的情况下,如果连接建立后1200秒内没有 接受到远程SMTP主机的任何信息,那么将关闭这个连接。

---- timeoutsmtpd

用来指定qmail-smtpd等待远程smtp客户端连接的时间秒数。默认是1200,超过这个时间,连接取消。

---- virtualdomains

让qmail接受本地邮件以外,还接受该文件中指定的域或者邮件地址,就是常说的虚拟域支持。

以上说的一些控制文件,qmail默认不是都有的,只有一些必须要得。根据你的mail不同的使用情况,自己选择来建立和设置。

3.6 系统别名

qmail的系统别名和sendmail不太一样,没有用一个大文件来包含所有的。而是建立了许多独立的别名文件。

在/var/qmail/alias中,格式如下:

。qmail-alias ---alias是要建立的别名。

举例:我要给postmaster建立一个别名文件,使寄给postmaster的邮件都给peng

echo peng > /var/qmail/alias/.qmail-postmaster

3.7用户别名

除了系统文件,。Qmail还可以支持独立的用户系统配置文件。在用户的家目录中。

例如,在用户peng目录下,建立一个peng-sales的邮件列表,就可以建立 .qmail-sales文件,在文件中添加邮件地址,每个一行。这样发给peng-sales的邮件,就会给任何一个地址copy一份。

3.8改变MUA程序接口

qmail程序包含了一个可执行程序,该程序替代了unix标准的sendmail程序。你要想用qmail作为你的mail服务器,必须用qmail的sendmail包装程序替代现有的sendmail程序。

# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak

# chmod 0 /usr/sbin/sendmail.bak

# ln –s /var/qmail/bin/sendmail /usr/sbin/sendmail

3.9建立qmailsmtp功能

传统上使用inetd程序来监听网络,但是缺点很多。本文中用ucspi-tcp包的tcpserver服务来代替它。参考了iceblood的qmail-setup.1.5.3的脚本文件,我是这样完成的:

1、 建立/etc/qmail目录,建立了smtp.sh and pop3.sh启动脚本

2、 建立了tcp.smtp 和tcp.smtp.cdb文件。

具体我是这样做的:

#echo “/etc/qmail/start” >> /etc/rc.d/rc.locad --- 开机执行/etc/qmail/start

# touch /etc/qmail/start --- 建立执行文件

# touch /etc/qmail/smtp --- 建立smtp脚本文件

# touch /etc/qmail/pop --- 建立pop脚本文件

# touch /etc/qmail/tcp.smtp ---建立tcpserver的连接规则文件

# echo "csh -cf '/var/qmail/rc &'">/etc/qmail/start -- 开机启动qmail

# echo "/etc/qmail/smtp.sh">>/etc/qmail/start -- 开机执行smtp.sh

smtp脚本内容:

/usr/local/bin/tcpserver -H -R –l chinaunix.net -t 1 -c 100 -v -p -x/etc/qmail/tcp.smtp.cdb

-u 502 -g 501 0 smtp /var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw /bin/true | /var/qmail/bin/splogger &

(注:502 and 501换成系统上的qmaild与nofiles的uid and gid的值。)

pop脚本内容:

/usr/local/bin/tcpserver -c 100 -v -l chinaunix.net -U -H -R 0 pop3 /var/qmail/bin/qmail-popup chinaunix.net /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1

| /var/qmail/bin/splogger &

tcp.smtp脚本内容

127.0.0.1:allow,RELAYCLIENT=" "

:allow

# /var/qmail/bin/tcprules /etc/qmail/tcp.smtp.cdb /etc/qmail/tcp.smtp.tmp < /etc/qmail/tcp.smtp

以上配置,可以做到开机自动启动了。具体的详细参数配置,我们《(四)ucspi-tcp的原理和设置》部分再详细讨论。

其实,/var/qmail/control/下的位置文件,有许多是不必要的。我的系统就用了一下几项:

databytes locals me rcpthosts virtualdomains

defaultdomain locals.lock plusdomain rcpthosts.lock virtualdomains.lock

badmailfrom

只有databytes 、badmailfrom是我添加的,剩下都是系统默认有的。之所以介绍这么多,就是让大家根据自己的不同情况,自己设置。

3.10小结。

到这里,qmail这一部分就介绍完了。回顾一下:

我们明白了qmail的工作流程。

创建了基本的qmail控制文件。

在安装时,创建了必要的qmail系统别名。

决定了本地邮件的投递方式,安装时用的maildir。

创建了qmail启动脚本。

改变了mua的程序接口。

建立了qmail的smtp功能。

简单的讲了qmail配置文件.qmail。

从qmail这一部分来说,应该是可以了。

关于本文挡的声明:

这份文档,是我参考了大量的网友的文章和书籍而写成的。自己经过反复安装和测试,均安装成功。但由于本人水平有限,文档难免有一些遗漏。如果你在安装的时候发现有什么地方有错误的话,请去www.chinaunix.net 的mail论坛讨论,我尽快回复的。

对于这片文档,网友可以任意转贴。但出于对作者的尊重,转贴时请注明作者姓名。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有