分享
 
 
 

Exim简介

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

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的投递过程。

[myimg]upload/routing.png[/myimg]

Exim的Router有:

1. accept: 通常用来处理系统用户和自动回复等

2. dnslookup:根据收件人地址中域名的DNS记录(MX),决定邮件如何路由。

3. ipliteral:对域名是纯IP地址的邮件地址(如my@192.168.0.1)进行路由

4. iplookup:剑桥大学专用的

5. manualroute:这是Exim中最强大的Router。管理人员可以根据若干种不同的条件决定如何路由邮件。

6. queryprogram:顾名思义,这是根据某一程序运行的结果来决定如何路由邮件。

7. redirect:邮件重定向,比如根据.alias文件。

Exim的Transport有:

1. appendfile:这是一个本地Transport,将邮件添加到本地的一个文件或目录中。Exim支持至少三种格式的邮箱:maildir、mbx和mailstore。

2. autoreply:自动回复

3. pipe:由程序来处理邮件的投递。

4. smtp:这是远程Transport,通过SMTP协议与远程主机通讯,来完成邮件的投递。

5. lmtp:使用LMTP协议完成邮件的投递。

为了更好地说明,这里列出作者所在公司使用的Exim的配置文件片断。

Router配置

#系统用户

#先处理操作系统的系统用户,比如mail,root等。

#Check_local_user指令让Exim去检测是否为系统用户,如果是,

#则将邮件交给名为local_transport的Transport投递

localuser:

driver = accept

check_local_user

transport = local_delivery

#自动回复

#前置条件是:发件人不是形如-request@, owner-且收件人属性中定义了mailReplyText

gen_auto_reply:

driver = accept

transport = auto_reply

senders = !^.*-request@.* : !^owner-.*@.* : !^postmaster@.* : ! ^listmaster@.* : !^mailer-daemon@.*

condition = ${if eq {${extract {mailReplyText}{RCPT_USER_DATA} }} {} {no}{yes}}

unseen

#本机邮件

#作者所在的单位采用了单域多机的模式,即用分散的机器存储同一个域名下的用户的邮件。

#前置条件是:收件人属性中定义的mailHost值与当前机器的名字相同

in_this_host:

driver = accept

transport = save_this_host_maildir

condition = ${if eq {TBOX} {${extract {mailHost} {RCPT_USER_DATA}}} {yes}{no}}

#同域,非本机邮件

#前置机件是:域名在local_domains列表中。Local_domains是一个域名列表,在配置文件前面定义的。

#

not_in_this_host_but_in_this_domain:

driver = manualroute

domains = +local_domains

route_data = ${extract {mailHost} {RCPT_USER_DATA}}

transport = redirect_to_real_server

#邮件监控

#前置条件:发件人的域名在monitored_domains列表中。

#

save_a_copy_of_outgoing_mail:

driver = accept

domains = +monitored_domains

transport = copy_outgoing

unseen

#外域邮件

#前置条件:收件人的域名不在local_domains域名列表中

#

not_in_this_host_and_not_in_this_domain:

driver = manualroute

domains = !+local_domains

transport = redirect_to_hq_mailserver

route_data = mailhub.mycorp.com

Transport配置

#产生自动回复,但不影响原始邮件

auto_reply:

driver = autoreply

from = $local_part@mycorp.com

to = $sender_address

subject = "AR: $h_subject"

text = ${extract {mailReplyText}{RCPT_USER_DATA}}

#本机邮件

#用appendfile Transport

#采用maildir格式,支持空间配额,自动建立目录

#

save_this_host_maildir:

driver = appendfile

create_directory = true

mode = 0700

maildir_format = true

directory = /maildata/${extract {mailMessageStore} {RCPT_USER_DATA}}/Maildir

quota = ${extract {mailQuotaSize}{RCPT_USER_DATA} {$value} {QUOTA_SIZE}}

quota_filecount = ${extract {mailQuotaCount}{RCPT_USER_DATA} {$value} {QUOTA_FILE_COUNT}

}

quota_warn_threshold = 75%

#非本机邮件

#用smtp Transport

#目的地SMTP服务器的地址在前面Router中的route_data中指定

redirect_to_real_server:

driver = smtp

#非本域邮件

#用smtp Transport

#

redirect_to_hq_mailserver:

driver = smtp

#系统用户邮件

#也用appendfile Transport

local_delivery:

driver = appendfile

file = /var/mail/$local_part

delivery_date_add

envelope_to_add

return_path_add

#邮件监控

#根据发件人的地址进行归类

#

copy_outgoing:

driver = appendfile

create_directory

mode = 0700

maildir_format

directory = /var/mail/archive/${sender_address_local_part}/sent

二、Exim支持的数据库

Exim在处理邮件时,可能配置成从文件或数据库中提取信息。Exim支持两种类型的语法:单键类型和查询类型。

Exim支持如下数据检索:

* 单键类型

1. cdb:Constant DataBase数据文件

2. dbm:Unix DBM 数据文件

3. dbmnz:类似于DBM

4. dsearch:目录检索

5. lsearch:文本文件

6. nis:NIS

7. wildsearch:类似于lsearch,但允许通配符

* 查询类型

1. dnsdb:用DNS数据库作为存储器的记录

2. ldap:轻量目录访问协议。这个可能是使用得最多的一种查询了。

3. mysql:MySQL

4. nisplus

5. oracle:

6. passwd

7. pgsql:PostgreSQL

8. whoson:(http://whoson.sf.net)一种新的协议,用来确认一个分配的IP地址是否为可信的。

数据查询实例

########################

# Recipients data

########################

#定义了常量,在后面的lookup中引用

#LDAP_BASEDN是前面定义的另一个常量

RCPT_LOOKUP_URL = LDAP_BASEDN??sub? (&(| (mail=$local_part@$domain) (mailAlternateAddress=$local_part@$domain) ) (accountStatus=active))

RCPT_USER_DATA = ${lookup ldap{RCPT_LOOKUP_URL}}

三、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的不同阶段进行设置的,包括:

1. acl_smtp_auth

2. acl_smtp_connect

3. acl_smtp_data

4. acl_smtp_etrn

5. acl_smtp_expn

6. acl_smtp_helo

7. acl_smtp_mail

8. acl_smtp_rcpt

9. acl_smtp_starttls

10. 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/

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有