免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1037 | 回复: 0
打印 上一主题 下一主题

Exim的 简述 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-18 22:47 |只看该作者 |倒序浏览
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的配置文件片断。
    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支持如下数据检索:

    • 单键类型
    • 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地址是否为可信的。

    数据查询实例
    ################################################################################
    # 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的不同阶段进行设置的,包括:
  • 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有所了解。
    八、资源



    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/36243/showart_384852.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP