大家好,欢迎来到IT知识分享网。作者:薛忠胜 2005-02-01 11:25:04 来自:linuxforum.net
Exim是基于GPL协议的开放源代码软件,由英国剑桥大学的Philip Hazel开发,目前最新版4.24。Exim是一个MTA(Message Transfer Agent),即消息传输代理,负责邮件的路由、转发和投递。Exim被作者设计成可运行于绝大多数的类Unix系统上,包括Solaris,AIX,Linux等。
Exim与其它开源的MTA(QMail、Postfix)相比,最大的特点是配置极其灵活。Exim的配置文件也是一个文本文件,但它支持一种称为String Expansion的技术。String Expansion可以理解为一种简单的脚本语言,能够执行诸如条件判断、字符串转换等功能。当然,Exim基本的功能也是非常丰富的。
一、Exim的工作模式
在Exim中,有两种称为Driver的元素:Router和Transport。Router对一个邮件地址进行操作,决定如何投递,即交给哪个Transport,或对地址进行转换,如通过Alias文件。Transport将邮件从Exim的队列中投递到目的地。Exim中存在两种类型的Transport:本地和远程。邮件被Router成功处理后交给Transport。如果一封邮件有多个收件人,它可能被同时多个不同的Transport处理。
每个地址都会被依次被配置的各个Router处理,直到其中一个Router接受或被弹回。每个Router都被配置成必须满足一定的前置条件,比如域名必须符合某特定特征,否则就是忽略。每个Router必须指定一个Transport,这样当Router运行成功时,就把邮件交给此Transport来投递。下面的图描述了Exim的投递过程。
Exim的Router有:
- accept: 通常用来处理系统用户和自动回复等
- dnslookup:根据收件人地址中域名的DNS记录(MX),决定邮件如何路由。
- ipliteral:对域名是纯IP地址的邮件地址(如my@192.168.0.1)进行路由
- iplookup:剑桥大学专用的
- manualroute:这是Exim中最强大的Router。管理人员可以根据若干种不同的条件决定如何路由邮件。
- queryprogram:顾名思义,这是根据某一程序运行的结果来决定如何路由邮件。
- redirect:邮件重定向,比如根据.alias文件。
Exim的Transport有:
- appendfile:这是一个本地Transport,将邮件添加到本地的一个文件或目录中。Exim支持至少三种格式的邮箱:maildir、mbx和mailstore。
- autoreply:自动回复
- pipe:由程序来处理邮件的投递。
- smtp:这是远程Transport,通过SMTP协议与远程主机通讯,来完成邮件的投递。
- lmtp:使用LMTP协议完成邮件的投递。
为了更好地说明,这里列出作者所在公司使用的Exim的配置文件片断。
二、Exim支持的数据库
Exim在处理邮件时,可能配置成从文件或数据库中提取信息。Exim支持两种类型的语法:单键类型和查询类型。
Exim支持如下数据检索:
- 单键类型
- cdb:Constant DataBase数据文件
- dbm:Unix DBM 数据文件
- dbmnz:类似于DBM
- dsearch:目录检索
- lsearch:文本文件
- nis:NIS
- wildsearch:类似于lsearch,但允许通配符
- 查询类型
- dnsdb:用DNS数据库作为存储器的记录
- ldap:轻量目录访问协议。这个可能是使用得最多的一种查询了。
- mysql:MySQL
- nisplus
- oracle:
- passwd
- pgsql:PostgreSQL
- whoson:(http://whoson.sf.net/)一种新的协议,用来确认一个分配的IP地址是否为可信的。
数据查询实例 |
################################################################################
|
三、String Expansion
Exim配置文件中,大部分配置选项的值在使用之前,会被扩展。比如,上面,Router配置实例中的not_in_this_host_but_in_this_domain中的route_data选项,其值在使用前总是根据LDAP检索的结果来生成。
其实,Exim的String Expansion就是预先定义了一些操作符,让管理员可以对给定的字符进行特定的操作,并得到一个结果。String Expansion包括普通条目、操作符、条件判断以及变量等几个部分。
Exim配置上的灵活性,很大程序上来源于String Expansion。通过String Expansion,Exim几乎有了无限的扩展能力,实现无限复杂的需要。管理员完全可以根据自己的需要,设计相应的数据格式,然后用String Expansion进行转换、判断。
四、验证手段
Exim可能被配置成SMTP验证。Exim目前提供三种类型的验证手段:plaintext、cram_md5和spa。plaintext验证手段用于实现PLAIN和LOGIN两种SMTP验证机制。cram_md5验证手段用来实现RFC2195定义的验证机制。spa验证手段则用来实现微软的Secure Password Authentication机制(NTLM)。
验证手段实例 |
ldap_login: driver = plaintext public_name = LOGIN server_prompts = Username:: : Password:: server_condition = ${if crypteq {$2} {AUTH_USER_PASS} {yes}{no}} server_set_id = $1 client_send = : $1 : $2 ldap_cram_md5: driver = cram_md5 public_name = CRAM-MD5 server_secret = ${AUTH_USER_PASS} server_set_id = $1 |
五、访问控制列表
运行在互联网环境中的邮件服务器通常需要解决的一个问题是防止open relay。近年来,垃圾邮件泛滥,其中很大程度上是由于open relay服务器的存在。现代的SMTP服务器基本上都有一些手段来避免自己成为open relay,Exim的手段是ACL定义。
Exim的ACL是针对SMTP的不同阶段进行设置的,包括:
- acl_smtp_auth
- acl_smtp_connect
- acl_smtp_data
- acl_smtp_etrn
- acl_smtp_expn
- acl_smtp_helo
- acl_smtp_mail
- acl_smtp_rcpt
- acl_smtp_starttls
- acl_smtp_vrfy
换句话,Exim可以在SMTP的任何阶段允许或拒绝用户的连接、邮件或收件人。在所有的ACL中,使用最多的可能是acl_smtp_rcpt和acl_smtp_data了。前者可以对收件人的地址进行识别,并决定是否接受;后者则对发送的邮件数据进行检查,比如病毒检测。
ACL配置实例 |
acl_check_rcpt: accept hosts = : deny local_parts = ^.*[@%!/|] : ^\\. accept local_parts = postmaster domains = +local_domains deny message = ERR_MSG_TOO_MANY_RECIPIENTS condition = ${if > {$recipients_count} \ {SNDR_USER_RCPT_MAX} {yes}{no} } accept domains = +local_domains endpass message = ERR_MSG_NO_SUCH_RECIPIENT verify = recipient accept domains = !+local_domains endpass message = ERR_MSG_AUTHEN_NEEDED condition = ${if !eq {$authenticated_id} {} {yes}{no}} message = ERR_MSG_SNDR_NIDENT_AUTHID condition = ${if eq {$sender_address_local_part}\ {$authenticated_id} {yes}{no}} message = ERR_MSG_DOMAIN_NOT_ALLOWED condition = ${if eq {yes} {${extract \ {sendToExternalSystem} {AUTH_USER_DATA}}} \ {yes}{no}} accept hosts = +relay_from_hosts deny message = relay not permitted acl_check_data: deny message = ERR_MSG_MESG_SIZE_TOO_LARGE condition = ${if >{$message_size}{SNDR_USER_SIZE_MAX} \ {yes}{no}} |
六、Exim附带工具
Exim本身只有一个执行文件exim,有着与sendmail兼容的选项。之外,还包括一些实用工具,列表如下:
- exiwhat:告诉你当前Exim正在做什么,典型的输出如:
164 daemon: -q1h, listening on port 25 10483 running queue: waiting for 0tAycK-0002ij-00 (10492) 10492 delivering 0tAycK-0002ij-00 to mail.ref.example
[10.19.42.42](editor@ref.example) 10592 handling incoming call from [192.168.243.242] 10628 accepting a local non-SMTP message - exiqgrep:根据条件显示队列中的内容
- exiqsumm:队列中的邮件统计,其典型结果如下:
Count Volume Oldest Newest Domain ----- ------ ------ ------ ------ 12 89KB 10d 7d mycorp.com --------------------------------------------------------------- 12 89KB 10d 0000d TOTAL
- eximstats:根据日志文件,对Exim的邮件进出情况进行统计,并给出详细的报告。
- exim monitor:这是一个XWindows的监测工具,可显示当前队列的情况、负载等情况,还能对队列中的邮件进行操作。
七、结论
上面对Exim的几个重要特征进行了简单的说明,并附上了作者的例子。除此以外,Exim还有许多功能,比如地址重写、IPV6支持、TLS/SSL支持、正则表达式(PCRE)、列表与匹配、系统级过滤器(system wide filter),SMTP批处理。
希望能够起到一点点的作用,让更多的人对Exim有所了解。
八、资源
- Exim官方站点:http://www.exim.org/
- Exim邮件列表:http://www.exim.org/maillist.html
- ChinaUnix邮件论坛:http://www.chinaunix.net/forum/viewforum.php?f=14
- Unofficial Exim MTA Info Forums:http://exim.tnet.com/forums/
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30787.html