qmail邮件系统(一)Qmail系统的介绍和准备工作

1.1目的。
本文的目的,是用自由软件在一个Linux平台上安装一套功能完整的邮件系统,和如何来管理他。这里我以qmail作为smtp服务器,vpopmail做pop3服务器和实现虚拟域、用mysql数据库来进行用户验证,用qmailadmin来实现图形化的用户管理。用ezmlm来提供对邮件列表的支持。使用igenus来提供一个友善的webmail界面。
1.2qmail管理与维护章节
(一)Qmail系统的介绍和准备工作。
(二)qmail+vpopmail+mysql+qmailadmin+ezmlm+igenus的安装
(三)qmail的工作原理和配置文件的设置。
(四)ucspi-tcp的原理和设置。
(五)vpopmail和qmailadmin对用户的管理。
(六)qmail的日志分析和管理。
(七)ezmlm实现邮件列表的应用和管理。
(八)系统的备份和FAQ。
1.2安装要求
1、请在安装系统前,最好要多看几片他人写的文档。
2、悉了所有DanBernstein(qmail的作者)发布的文档;熟悉www.qmail.org(qmail官方站点)的相关资源,尽量理解LifeWithqmail。
3、安装软件包前,仔细阅读各自的READMEANDINSTALL文件,这是最好的安装指南!

1.3感谢
感谢www.chinaunix.net的论坛网友locklzy、wxy、gadfly,尤其感谢gadfly在 技术上给的执导和支持。

1.4软件介绍
httpd-2.0.40.tar.g提供web服务的server。
autorespond.tar.gz实现e-mail自动回复功能。
ezmlm-0.53.tar.gz实现qmail邮件列表功能。
ezmlm-idx-0.40.tar.gzezmlm's的补丁程序,使ezmlm支持qmail。
qmail-1.03.tar.gzQmail软件包
qmailadmin-0.80.tar.gzqmail的web管理软件。
ucspi-tcp-0.88.tar.gztcpserverservice程序。
vpopmail-5.2.tar.gz实现pop3服务和支持虚拟域。
qmail-smtpd.cqmail的补丁程序,实现smtp认证功能。
php4-200303121030.tar.gz实现apache对php的支持
igenus_2_20030311.tgz实现webmail的软件包。
Qmail-setup.1.5.3.tar.gz用其中的qmailadmin汉化部件。
以上软件,可以到各自的网站去获取:
http://www.apache.org/
http://cr.yp.to/qmail.html
http://www.qmail.org/
http://www.inter7.com/vpopmail/
http://cr.yp.to/ezmlm.html
http://www.ezmlm.org/
http://www.inter7.com/qmailadminlookforautoresponderlink
http://www.igenus.org
http://down.rree.com/iceblood/qmail_setup-v1.5.3.tar.gz

1.5实现的功能
1、Qmail帐号与系统帐号的分离。
2、SMTP服务的密码验证功能,能有效的防止别人利用自己的服务器发送匿名信。
3、用vpopmail提供pop3服务。
4、实现对虚拟域的支持。
5、实现邮件帐号WEB管理方式。
2、Qmail邮件列表功能。
3、Qmail自动回复功能。
5、邮件的WEB使用方式,如:WEB发邮件,查看邮件。
6、支持qmail的管理脚本,安装后可以运行qmailstart|stop|restart来管理qmail。
7、全面支持Mysql数据库,用户信息和邮件列表都通过mysql存储和验证。
8、实现了QmailAdmin和webmail的中文界面。

1.6系统设置
我用的是redhat8.0的系统,在一台康柏的pcserver上作的。安装的时候,选择了custom模式。我安装系统的时候,就选择了安装mysql的所有的包。
1.7apache
在安装系统时,我没有默认安装apache。我用源代码编译APACHE,是使它打开DSO模块。然后编译PHP,将SO文件安装到你的APACHE的模块目录里,这样也方便以后扩展功能。
1.8sendmail
在这里,sendmail已没有任何意义了。本文就是想用qmail来替代unix系统传统上的sendmail。这里我们将要删除他:
#rpm–e–nodepssendmail
1.9系统分区建议
由于本系统的qmail采用了Maildir格式存储用户的邮件消息。造成大量小文件存在,数量庞大的小文件如果放在/var或/home下,将造成系统性能下降。建议vpopmail单独使用另一块硬盘。还要注意/var/和/home的分区大小。因为/var/要产生大量的日志文件和qmail队列,/home/下用户要保留用户的信件文件。所以规划好硬盘的分区,可以免除以后不必要的麻烦。其实大家可以使用逻辑卷管理磁盘,这样可以动态的更改各分区的大小,是个不错的选择。Linux8安装的时候可以设置。

1.10dnsserver设置。
在这里我的域名假设是:chinaunix.net
qmail这台主机名是:mail.chinaunix.net
qmail这台主机的ip地址是:192.168.1.2
我的mail用户的格式是:peng@chinaunix.net
虚拟域名1是:chinaunix.com
虚拟域名2是:fanqiang.com
以上的域名,他们各自的解析主机所对应的zone文件设置是:
mailINA192.168.1.2
@INMX10mail

qmail邮件系统(三)qmail的工作原理和配置文件的设置
在这章里,我们主要是介绍qmail的工作原理和配置文件的设置。通过这一节,让我们更好的分析问题和设施qmail。
3.1qmail是什么?
qmail包是在unix系统上的一个邮件程序。qmail程序是由danbernstein开发出来的
为标准的unix服务器提供邮件传输代理的(mailtransferagent,mta)功能的,用来替代sendmail。qmail因特网主页 http://www.qmail.org。
3.2qmail和相关的服务
qmail提供了mta功能,但是客户要能看到自己的信件,还需要其他协议和软件。两种
常见的远程用户取回他们消息的机制是邮政协议(postofficeprotocal,pop3)和互交邮件访问协议(interactivemailaccessprotocol,imap)。
综述:
qmail系统包括几个可执行程序、配置文件、qmail工具和环境变量,这些彼此互相影响,共同提供邮件服务。
3.3qmail投递邮件进程流程
[img:aab85b0985] http://www.majiandesk.com/imag/1013.jpg[/img:aab85b0985]

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
sploggerqmail
qmail-lspawn
qmaiil-rspawn
qmail-clean
qmail在任何时候都要求有五个程序在后台运行。这些核心的程序允许qmail扫描新邮件,并将他们发送到适当的目的地。

3.4qmail实用工具程序
除了以上五个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.5qmail环境变量
除了控制文件之外,qmail程序还能使用unix环境变量来控制他们的动作。多数的控制文件的值都能被一个相应设定的环境变量重载。如果该环境变量没有设定,就使用控制文件的值。qmail的环境变量是在qmail程序运行前就被设置好的。这是由一个包装程序完成的。常见的是tcpwrapper和tcpserver。本文就是用的tcpserver。在以后的《(四)ucspi-tcp的原理和设置》内容中,再详细讨论。
3.6qmail控制文件
这一部,对于管理好qmail,非常重要的。控制文件是qmail配置中的中心环节,它控制了qmail的操作性为。它位于/var/qmail/control目录下。每一个文件包含一个值,这个值定义了相应的qmail可执行程序的变量。qmail控制文件是定义了qmail参数的ASCII文本文件。大多数控制文件要求一个单一的文本值,该值可以在一行中输入。也有一些控制文件能包含多个值。在这种情况下,每一个值被输入到单独的一行中,每一行以一个标准的UNIX换行符(LF)结尾。还有一个要重点注意,就是控制文件的权限问题,推荐root可读写,其他只读。
#chmod644/var/qmail/control/*

以下将逐一介绍个控制文件:
--------badmailfrom
这个控制文件实现拒收邮件功能的,每一个地址遵循前面说的规则,要单独一行。而且,不用重起qmail就能生效。
例如:

peng@96633.net--

qmail邮件系统(四)ucspi-tcp的原理和设置
(四)ucspi-tcp的原理和设置。

Qmail的开发者danBernstein开发了ucspi-tcp(UNIX客户-服务器程序端口)包来取代inetd程序。Ucspi格式定义了一种程序来交换数据的方法,主要体现出三个优点:
1、ucspi端口独立于底层的通讯介质。
2、ucspi允许shell脚本程序利用网络的互联。
3、ucspi程序建立了unix环境变量,这些变量定义了可以被程序和用户使用的网络信息。
Ucspi-tcp使用称为tool的程序在应用程序之间建立连接。有两种类型的ucspitool---客户tool(tcpclient)和服务器tool(tcpserver)。

Ucspi-tcp的tcpserver程序就是替代unix的inetd程序的,有如下优点:
1、他能够把来自服务器端的所有输入和输出都记到一个文件中。
2、他能提供访问控制特征,拒绝或者允许来自客户端的连接。
3、它包含了并发限制,防止使unix系统过载。

Tcpserver程序通过使用管理员配置的一个hash规则库提供对访问的控制。
Tcpserver命令行的格式是:
tcpserveroptionshostportapplication
host和prot参数制定了将要运行应用程序的本地服务器的主机名和端口号。Host参数可以是localhos、主机ipaddress、或者是主机的完整域名。Port参数可以是一个数字或者是/etc/services文件中的一个tcp端口的名字,例如:smtp。Application是连接建立后要传输给的应用程序。
Options参数定义了tcpserver程序的行为。有三种类型的选项:
常规选项------定义用于ucspitool的选项。
连接选项-----处理到达的连接请求。
数据收集选项-----如何获得在传给应用程序的unix环境变量中使用信息。
Tcpserver连接选项(1)
---------------------------------------------------------------------------
选项描述
-------------------------------------------------------------------------
-bn允许n个连接请求的存储
-Bbanner在连接建立后将banner写到网络连接上
-cn不接受多于n个同时连接
-d当主机相应较慢时延迟向远程主机发送数据
-D从不延迟向远程主机发送数据
-ggid当接受连接准备完成后改变活动组ID为gid
-l打印本地端口号到stdout
-o在连接的分组中不改变ip选项
-uuid当接受连接准备完成后改变活动用户ID为uid
-O删除ip选项为分组寻找路径
-U相当于-g$GID–uUID
-xdb使用hash数据库db中的规则来接受或拒绝远程客户端的访问
-X当由-x选项指定的数据库不存在时允许连接
-------------------------------------------------------------------
tcpserver程序可以使用的数据收集选项(2)
----------------------------------------------------------------
选项描述
--------------------------------------------------------------------
-h使用dns查找远程主机
-H不使用dns查找远程主机名。你必须对端口53使用此选项
-llocalhost不使用dns查找本地服务器主机名,而使用localhost
-p怀疑。使用反向dns查找远程主机ip地址,将其与主机名相比较。如果不匹配,删除环境变量$tcpremotehost
-r试图从远程主机获得$tcpremoteinfi(默认)
-R不试图从远程主机获得$tcpremoteinfo数据。你必须为端口53和端口113使用这一选项
-tn在n秒之后停止试图连接到$tcpremoteinfo数据。默认26
------------------------------------------------------------------------------
有几个unix环境变量tcpserver试图为其接受数据。这些环境变量帮助应用程序处理有关的网络间接信息。
Tcpserver的unix环境变量(3)
------------------------------------------------------------------------------
变量描述
----------------------------------------------------------------------------
$PROTO使用的协议(默认为TCP)
$TCPLOCALIP本机的IP地址
$TCPLOCALPORT本地TCP端口号
$TCPLOCALHOST本地主机的DNS查询值
$TCPREMOTEIP远程客户端的IP地址
$TCPREMOTEPROT远程客户端的TCP端口号
$TCPREMOTEHOST远程主机的DNS查询值
$TCPREMOTEINFO远程客户端的用户名
------------------------------------------------------------------------------
当接受了一个远程客户端的连接,tcpserver就是图为应用程序提供环境变量,当他不能为一个特定的变量接受信息时,tcpserver不设置变量。
Tcprules程序
tcprules程序是创建可以限制与应用程序连接的规则。是手工创建规则,来制定接受和拒绝单个地址、多个ip地址、全部网络地址的访问。规则在一个文本中创建,每行一条规则。文本建立后,使用cdb数据库格式将其转变成一个hash数据库。这使得tcpserver程序能够在远程客户向服务器请求连接时动态处理规则。
规则以这样的格式创建:
address:action,varible
address是和到达连接的值相匹配的。此参数的几种格式都是基于表(3)环境变量的,可以使用这些变量的组合来创建有效的地址。下面列出了tcpserver能识别的不同地址:
tcpserver规则的地址格式
-----------------------------------------------------------------------------
地址示例
------------------------------------------------------------------------------
$tcpremoteinfo@tcpremteippeng@[192.168.3.11]
$tcpremoteinfo@=$tcpremotehostpeng@96633.net
$tcpremoteip&

Qmail系统完整篇相关推荐

  1. 快速搭建ELK7.5版本的日志分析系统--搭建篇

    一.ELK安装部署 官网地址:https://www.elastic.co/cn/ 官网权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide ...

  2. imx6ull移植Linux系统第二篇——Linux内核的移植

    imx6ull移植Linux系统第二篇--Linux内核的移植 花了大概两周的时间,把Linux的移植认真学了一遍,期间踩了不少坑,花费了不少时间去解决各种奇奇怪怪的问题,最终完成了uboot.系统镜 ...

  3. Bat批处理命令使用教程(完整篇)

    Bat批处理命令使用教程(完整篇) 原帖:http://www.anqn.com/arp/article/2007-09-14/a0986565.shtml 此处仅是学习只用: 这是一篇技术教程,我会 ...

  4. php单页应用,前端单页应用的路由系统 – 介绍篇

    单页应用 为了你能看懂这篇博客之后的所有内容,你必须知道什么是单页应用. 简单的讲,链接跳转时界面不会刷新应用就是单页应用.它的特点是,用户在浏览或者点击跳转的时候感觉不到界面的跳转过程,因为无需等待 ...

  5. linux系统移植篇(四)—— 根文件系统使用介绍

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  6. linux指令大全(完整篇)

    linux指令大全(完整篇) 名称:cat 使用权限:所有使用者 使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName 说明:把档案串连接后传到基本 ...

  7. phpstudy初体验使用教程说明完整篇

    phpstudy初体验使用教程说明完整篇 一.首先已经安装好了phpStudy程序,并确保能正常运行,打开phpstudy主界面,在左上角,显示的是当当前程序的状态,绿色代表的是运行正常,红色则代表异 ...

  8. 学着学着Linux系统写篇心得

    2019独角兽企业重金招聘Python工程师标准>>> 学着学着Linux系统写篇心得 本学期对于linux系统的学习,和自己买的一本<linux就该这么学>这本书,让我 ...

  9. esxi远程管理端口_如何在 vmware esxi 中开放 VNC功能及端口实现远程管理 完整篇...

    VMWare esxi中开放 VNC功能及端口实现远程管理 完整篇 在多个论坛上看了相关文章,总的写得不完整.现将各方资源整编写完整版.详文如下! 步骤1. 修改ESXi主机的firewall配置 在 ...

最新文章

  1. 如何测试网络视频服务器(DVS)
  2. php查找文件内元素,如何查看当前文档某个元素的子节点?有几种方法
  3. 华为swot分析2020_科技口译现场:华为2020全球分析师大会
  4. 自由职业的前半年,我是如何度过的?
  5. 修改elementUI组件样式无效的多种解决方式
  6. vba 自动排序_Excel VBA如何入门?VBA教程 Excel教程 VBA学习 Excel新手课程
  7. 初识EntityFramework6【转】
  8. 修改yum源的资源路径baseurl
  9. 网络游戏植入广告营销案例
  10. 有意思的域名Hack网站
  11. 管家婆辉煌-- 连接服务器失败处理办法
  12. python -- 计算 平方、乘方、平方根_python如何求平方
  13. Linux 修改密码出现“鉴定令牌操作错误”
  14. SDH(标准DH)和MDH(改进DH)
  15. 世界人工智能融合发展大会开幕 山东AI产业未来可期
  16. C语言鼠标操作方法及源码
  17. 推荐个免费ppt模板下载网站
  18. 科研热点|2023年IEEE Fellow入选者名单公布,中国学者占比1/4~
  19. 图形验证码的两种实现方式
  20. 计算机网络管理员技工题库,计算机网络管理员高级技师题库

热门文章

  1. vue项目接入视频监控系列-------播放器的选择
  2. C++设计模式——状态模式
  3. IoT物联网设备数据安全解决方案
  4. springcloud五大神兽及其原理
  5. SpringSecurity整合JWT
  6. GlusterFS基本概念
  7. 亚马逊QA是什么意思?
  8. 资讯类网站增量式爬虫
  9. 应届毕业生,让人欢喜让人忧
  10. D90四种对焦点模式