(三)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这一部分来说,应该是可以了。

qmail邮件系统(三)qmail的工作原理和配置文件的设置相关推荐

  1. 怎么解释三线圈直流电机工作原理更好?

    简 介: 针对网络上小型直流电机原理说明视频存在的问题,通过CSDN视频制作系统进行阐释.进一步把TEASOFT中的文稿-视频转换功能进行完善,实现快速零后期视频制作. 经过这次测试,为今后MOOC课 ...

  2. c语言是以文件为单位编译,c语言从头开始(三:编译器工作原理) (我们还可以自己编写头文件后缀是xx.h并把它当前代码文件所在目录我们要用就可以直接通过下面代码使用)...

    c语言从头开始(三:编译器工作原理) [[枫歌枫歌]c语言从头开始(三:编译器工作原理)]https://toutiao.com/group/6568056688174170628/?iid=1590 ...

  3. 计算机工作在原理课件,滇人版七年级信息技术下册第一单元第一课第三课时计算机工作原理.ppt...

    1 计算机工作原理 一.教学目标: 1.知识目标: (1)掌握计算机工作的几个基本过程: (2)认识冯诺依曼型体系的计算机结构: (3)了解计算机工作原理: 2.能力目标 (1)培养学生研究计算机工作 ...

  4. 虚拟网络编辑器三种模式工作原理详细介绍(桥接-网络地址转换-主机模式)

     1.桥接模式(Bridged) 使用该模式的虚拟操作系统是局域网中的一个独立主机,具有独立访问网络中其他主机的功能.它的配置信息由VMnet0虚拟网络提供,不支持DHCP服务.用户需要按照一定的规则 ...

  5. (三)dubbo工作原理

    dubbo主要核心部件 Remoting:网络通信框架,实现了sync-over-async和request-response消息机制. RPC:一个远程过程调用的抽象,支持负载均衡.容灾和集群功能. ...

  6. WireGuard 的工作原理

    WireGuard 的工作原理 官方:https://github.com/pirate/wireguard-docs 引用:WireGuard 教程:WireGuard 的工作原理 – 云原生实验室 ...

  7. 【邓侃】哈佛大学机器翻译开源项目 OpenNMT的工作原理

    一. 哈佛大学机器翻译开源项目 OpenNMT 2016年12月20日,哈佛大学自然语言处理研究组,宣布开源了他们研发的机器翻译系统 OpenNMT [1],并声称该系统的质量已经达到商用水准. 在 ...

  8. JavaWeb第一讲 Servlet的工作原理及生命周期

    Servlet的工作原理及生命周期 (一)Tomcat容器模型 Servlet的运行离不开Tomcat,那我们先弄清楚Tomcat的容器模型. 由上图可以看出,在Tomcat下有一个Container ...

  9. 可编程led灯带原理_SCPSD-250-04-27派克真空压力传感器故障和工作原理

    SCPSD-250-04-27派克PARKER真空压力传感器故障和工作原理 PARKER压力开关现货    PARKER压力传感器特价  派克真空压力传感器  PARKER数字压力开关 2020年还剩 ...

  10. Ajax工作原理和原生JS的ajax封装

    前言: 之所以用ajax作为博客的开篇,是因为无论从ajax的出现还是从它的作用上来说,ajax对于前端无疑是意义重大的.甚至可以说,是ajax带来了前端这个行业.当然,历史并不能说明当下,曾经的辉煌 ...

最新文章

  1. 流媒体实质上是计算机在哪方面的应用,流媒体技术主要用于什么
  2. 【转】python-word2vec模块使用详解
  3. DOS下如何访问4G内存
  4. AutoCAD_acadiso.dwt卡死
  5. python函数模块关键代码_从零开始学Python(六):函数,模块和类的使用
  6. FFmpeg学习(0)——使用ffmpeg视频切片并加密
  7. linux文件偏移函数实验报告,Linux实验报告二.doc
  8. 跃迁 成为高手的技术
  9. 使用Qt开发2D“沙盒”小游戏
  10. VMware中卸载Ubuntu
  11. android高仿ios11系统,安卓仿苹果iOS11主题APP
  12. 小白白红队初成长(4)文件的面纱
  13. 字节跳动后台开发实习面试回顾
  14. 简单记录一下雨量计的分类
  15. 电钻、电锤、电镐的区别
  16. SDP(Seesion Description Protocol)协议结构
  17. koa 中间件洋葱模型源码分析
  18. 阿里云配置密钥SSH登录
  19. 人之将死其言也善?30年来死囚遗言分析
  20. su域名是什么?su域名的历程是怎样的?

热门文章

  1. Supermap iClient for JavaScript 多数据集查询
  2. pytorch分布式训练使用Dataloader/WebDataset进行数据并行加载
  3. char *str[3] = {stra,strb,strc};问题?
  4. nodejs死亡笔记之socket.io那些事(附可用来撩妹的聊天功能)
  5. python制作系统监控_利用python实现一个简单的系统监控图表!
  6. 领导冲锋——项目中领导力的使用(转)
  7. 2023年【加氢工艺】新版试题及加氢工艺考试总结
  8. 2个红外传感器循迹原理_PM2.5传感器中,激光、红外原理之间的区别
  9. CAD的输出格式之一的Dwt格式有什么特点?怎么转换呢?
  10. gdc服务器硬盘修复,GDC环球数码SX-3000独立媒体模块AHCI设置