10.4. Exim4邮件服务器

来源:互联网 发布:拓尔思 知乎 编辑:程序博客网 时间:2024/04/30 04:18

10.4. Exim4邮件服务器

10.4.1. 邮件系统基础知识

在实现安装邮件服务器之前,让我们先来学习一些邮件系统的基础知识。

一个完整的邮件系统应该包含三部份内容:邮件用户代理(MUA,Mail User Agent),邮件传送代理(MTA,Mail Transport Agent)和邮件分发代理(MDA,Mail Deliver Agent)。

  • MUA是mail、pine、mutt等程序,负责查看邮件、编写邮件和向MTA发送邮件。

  • MTA是sendmail,postfix,qmail和Exim等服务器,负责邮件在Internet中的传递,从一个MTA服务器发送到另一个MTA服务器。当一个MTA收到一封从另一个MTA传递过来的邮件时,如果邮件中的域名地址和本机域名地址一样,则MTA会把邮件收下来,保存在MTA的接收邮件队列中。如果邮件的域名地址与本机的不一样,则会根据域名进行转发,这个过程在mail系统中叫做relay。

  • MDA是procmail等程序,负责从MTA中收取邮件,并根据用户名保存到用户邮箱。

smtp和pop3是邮件系统中重要的一对协议,smtp用于发送邮件,pop3用于接收邮件。下面分别介绍它们的命令。

POP3 命令包括:USER username 认证用户名PASS password 认证密码认证,认证通过则状态转换APOP name,digest 认可一种安全传输口令的办法,执行成功导致状态转换,请参见 RFC 1321 。STAT 处理请求 server 回送邮箱统计资料,如邮件数、 邮件总字节数UIDL n 处理 server 返回用于该指定邮件的唯一标识, 如果没有指定,返回所有的。LIST n 处理 server 返回指定邮件的大小等RETR n 处理 server 返回邮件的全部文本DELE n 处理 server 标记删除,QUIT 命令执行时才真正删除RSET 处理撤消所有的 DELE 命令TOP n,m 处理 返回 n 号邮件的前 m 行内容,m 必须是自然数NOOP 处理 server 返回一个肯定的响应QUIT 希望结束会话。如果 server 处于"处理" 状态,则现在进入"更新"状态,删除那些标记成删除的邮件。如果 server 处于"认可"状态,则结束会话时 server 不进入"更新"状态 。SMTP 命令包括:HELO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。EHLO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。MAIL FROM 命令中指定的地址是发件人地址RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用HELP 查询服务器支持什么命令NOOP 无操作,服务器应响应 OKRSET 重置会话,当前传输被取消QUIT 结束会话 


10.4.2. Exim4邮件服务器的工作原理

Exim4被设计成能高效地、不间断地在Internet上运行,而且能处理各种混合邮件。Exim4是如何投递邮件和接收邮件的呢?有何安全机制能确保邮件的安全呢?这节将简单介绍Exim4的工作原理。

Exim4处理的每封邮件都以一个16位字符的名称标识,该标识由三部份组成,以"-"号分隔,如:1GS3YU-0000zG-Nd。这些字符是经过base编码的,第一部份的原始信息是接收邮件的时间,第二部份的原始信息是接收邮件的进程id,第三部份的信息与配置文件中localhost_number的设置相关。标识名与时间和进程相关,有效保证了标识名的唯一性。

Exim4通过基于TCP/IP的SMTP协议从其它主机收取邮件。Exim4接收邮件后,会把邮件分成两个文件保存在spool目录,在我的机器上就是/var/spool/exim4/input/目录。这两个文件的命名规则是邮件标识后加-D和-H。以-D结尾的文件保存着邮件正文的信息,以-H结尾的文件保存邮件的头信息。在一些操作系统上,同一目录下包含太多的文件会造成性能问题,所以Exim4也可通过设置split_spool_directory选项,在input目录下再创建62个子目录来保存邮件信息。这62个子目录以单个字母和数字命名(26个小写字母+26个大写字母+10个数字共62个数字和字母)。这样的设置,使邮件的排队只在子目录下进行,而不是一个目录所有邮件。所以即使在邮件量不大的情况下也能效提升邮件系统的性能。

接收的邮件会停留在spool目录直到邮件被传递到接收者或被管理员删除。如果邮件不能被传递,则邮件会被打上"frozen"标记,并且不会再尝试投递该邮件。但管理员可以设置ignore_bounce_errors_after和timeout_frozen_after选项,指定一定时间后解除邮件的"frozen"状态。

当Exim4处理邮件时会把处理过程的日志信息保存在/var/log/exim4目录下。其中mainlog日志记录了大量的信息,从中我们可以跟踪Exim4处理邮件的过程。在一个大负载的服务器上,生成大量的日志信息会影响服务器的性能,所以我们也可以用no_message_logs参数禁止日志功能。

router和transport是Exim4传递邮件过程中两个重要的环节,router负责处理邮件地址,并把邮件传递给不同的transport作进一步处理,transport负责把spool中的邮件传递到目的地,完成投递过程。有两种的transport,一种是本地transport,它的目的地是文件或者本机管道(pipe);另一种transport是远程transport,它的目的地是远程主机。如果一封邮件有多个接收者,则它可能会通过多个transport进行投递。

router和transport都有不同的driver,实现不同的功能。

router drivers:

  • accept,

  • dnslookup,

  • ipliteral,

  • iplookup,

  • manualroute,

  • queryprogram,

  • redirect,

transport drivers:

  • appendfile,

  • autoreply,

  • lmtp,

  • pipe

  • smtp

10.4.3. 安装与配置

用以下命令安装exim4邮件系统:

debian:#~ apt-get install exim4 exim4-config exim4-daemon-light

下载完成后会自动运行配置向导,我们也可运行dpkg-reconfigure exim4-confg命令配置Exim4服务器。exim4的配置文件位于/etc/exim4目录下,update-exim4.conf.conf文件的配置内容由上面的命令产生,经常改变的命令都集中在这里,而exim4.conf.template文件是Exim4的主配置文件,里面通过DEBCONFsomethingDEBCONF的方式引用update-exim4.conf.conf文档的something内容。

exim4.conf.template是Exim4的配置文件,它以分段的格式组织各配置参数。一般的配置参数放在配置文件的最开头,其它所有的可选配置参数都以"beging+段名"的形式作为段的开始标识。下面是一些可选段:

  • ACL,设置SMTP邮件的ACL(访问控制列表)。

  • authenticators,设置验证模式。

  • routers,设置不同的router,处理不同类型的邮件地址,并确定如何发送邮件。

  • transports,设置不同的transport,把信息传递到不同的目的地。

  • retry,设置重试的规则,当邮件不能马上投递时,我们可设置一些重试规则进行再次投递。

  • rewrite,定义邮件地址的重写规则。

  • local_scan,使用local_scan()函数的功能。要用LOCAL_SCAN_HAS_OPTIONS=yes选项开启。

exim4的配置文件有两种方式,一种是集中式的,所有的配置都集中在exim4.conf.template文件中,一种是分散式的,配置文件按功能不同分散成很多个文件存放在conf.d目录下。一般建议新手使用集中式。

下面是一个update-exim4.conf.conf的示例,它可通过debconf程序自动生成,生成后我们可用文本编辑器来修改它。这个示例把exim4配置成通过网上的smarthost来发送Internet邮件。

# /etc/exim4/update-exim4.conf.conf## Edit this file and /etc/mailname by hand and execute update-exim4.conf# yourself or use 'dpkg-reconfigure exim4-config'## Please note that this is _not_ a dpkg-conffile and that automatic changes# to this file might happen. The code handling this will honor your local# changes, so this is usually fine, but will break local schemes that mess# around with multiple versions of the file.## update-exim4.conf uses this file to determine variable values to replace# the DEBCONFsomethingDEBCONF strings in the configuration template files.## Most settings found in here do have corresponding questions in the# Debconf configuration, but not all of them.## This is a Debian specific filedc_eximconfig_configtype='smarthost'           #用smarthost发信;通过SMTP或fetchmail接收信件dc_other_hostnames=''dc_local_interfaces='127.0.0.1'                #只接收本机的SMTP请求,只在本机使用Exim4dc_readhost=''dc_relay_domains=''dc_minimaldns='false'dc_relay_nets=''dc_smarthost='smtp.21cn.com'                   #远程的SMTP主机,我们通过它来发送邮件CFILEMODE='644'dc_use_split_config='false'                    #不使用分散方式的配置文件dc_hide_mailname='false'dc_mailname_in_oh='true'


编辑/etc/mailname文档,该文档记录你所发邮件的域名后缀。我的mailname只有一条记录,内容如下:

debian

运行update-exim4.conf命令可以测试/etc/exim4下的配置文件有没有语法错误,如果正常则会生成一个有效简洁的配置文件备份,保存在/var/lib/exim4/config.autogenerated文件中,方便我们查看。

用以下命令还可测试Exim4的配置有否出错:

debian:#~ exim4 -bVExim version 4.63 #1 built 23-Aug-2006 17:21:47Copyright (c) University of Cambridge 2006Berkeley DB: Sleepycat Software: Berkeley DB 4.3.29: (September  6, 2005)Support for: crypteq iconv() IPv6 GnuTLS move_frozen_messagesLookups: lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dsearch nis nis0 passwdAuthenticators: cram_md5 plaintextRouters: accept dnslookup ipliteral manualroute queryprogram redirectTransports: appendfile/maildir/mailstore autoreply lmtp pipe smtpFixed never_users: 0Size of off_t: 8Configuration file is /var/lib/exim4/config.autogenerated

启动exim4

ebian:/etc/init.d# ./exim4 restartStopping MTA for restart: exim4_listener.Restarting MTA: exim4.


本地邮件发送测试:

debian:~# exim4 -bt faxR: system_aliases for fax@debianR: userforward for fax@debianR: procmail for fax@debianR: maildrop for fax@debianR: local_user for fax@debianfax@debian  router = local_user, transport = maildir_home


外部邮件发送测试:

debian:#~ exim4 -bt jims.yang@gmail.comR: smarthost for jims.yang@gmail.comjims.yang@gmail.com  router = smarthost, transport = remote_smtp_smarthost  host smtp.cdn.21cn.com [202.104.32.230]


测试通过后,我们就可正式发送邮件啦。为了清楚显示邮件的传送过程,我们使用了-v参数。fax是我系统上的一个用户,主机名为debian,所以fax用户的本机邮件地址就是fax@debian。

debian:~# exim4 -v fax@debianfrom:rootto:fax@debiansubject:local mail testtest will be ok..LOG: MAIN  <= yjnet@21cn.com U=root P=local S=318debian:~# delivering 1GQemL-0001eD-PqR: system_aliases for fax@debianR: userforward for fax@debianR: procmail for fax@debianR: maildrop for fax@debianR: local_user for fax@debianT: maildir_home for fax@debianLOG: MAIN  => fax <fax@debian> R=local_user T=maildir_homeLOG: MAIN  Completed


出现Completed说明邮件已发送成功,切换到fax用户我们就可以收到新的邮件啦。下面我们来试试发送Internet。在正式测试之前,我们还要做一些配置。因为通过smtp.21cn.com发送邮件是要经过用户验证的。

  • 把登录smtp.21cn.com的用户名和密码写入/etc/exim4/passwd.client文档。

  • # password file used when the local exim is authenticating to a remote# host as a client.## see passwd_client(5) for more documentation## Example:### target.mail.server.example:login:passwordsmtp.cdn.21cn.com:yjnet:1234

    smtp.cdn.21cn.com是真正的stmp服务器名,而smtp.21cn.com是别名。在这里一定要用真正的smtp服务器名,否则验证不通过。如何知道真正的smtp服务器名呢?很简单,用我们最常用的ping命令即可。

  • debian:~# ping smtp.21cn.comPING smtp.cdn.21cn.com (202.104.32.230): 56 data bytes

    yjnet是登录用户名,1234是登录密码。

  • 把系统用户对应的外部邮件地址写入/etc/exim4/email-addresses文件。

  • # This is /etc/email-addresses. It is part of the exim package## This file contains email addresses to use for outgoing mail. Any local# part not in here will be qualified by the system domain as normal.## It should contain lines of the form:##user: someone@isp.com#otheruser: someoneelse@anotherisp.comroot:yjnet@21cn.com

    这里的外网邮件用户名yjnet要与passwd.client中的登录用户名yjnet一致。如果不一致,会造成个别mail client不能正常发送邮件。

  • exim4默认是不使用明文的验证方式的,因为明文的密码很容易在网上被截取。但smtp.cdn.21cn.com是使用明文验证的,所以我们要打开exim4的明文验证模式。修改/etc/exim4/exim4.conf.template,加入AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS = 1配置参数。添加参数时要注意,一定要把该参数放到本配置小节的最开头,这样在后面才能有效引用该参数。

  • #######################################################################                   AUTHENTICATION CONFIGURATION                     #######################################################################begin authenticators....# Because AUTH PLAIN and AUTH LOGIN send the password in clear, we# only allow these mechanisms over encrypted connections by default.# You can set AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS to allow unencrypted# clear text password authentication on all connections.AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS = 1....


配置完成要重启exim4服务器使配置生效。下面我们就可测试用smtp.21cn.com服务器发邮件啦。

debian:~# exim4 -v jims.yang@gmail.comfrom:yjnet@21cn.comto:jims.yang@gmail.comsubject:test from exim4测试邮件正文。.LOG: MAIN  <= yjnet@21cn.com U=root P=local S=327debian:~# delivering 1GQfnH-0001hE-PYR: smarthost for jims.yang@gmail.comT: remote_smtp_smarthost for jims.yang@gmail.comConnecting to smtp.cdn.21cn.com [202.104.32.230]:25 ... connected  SMTP<< 220 21cn.com SMTP Server 5 of AIMC 2.9.5.2 (DELAYED).  SMTP>> EHLO debian  SMTP<< 250-21cn.com, helo (DELAYED)         250-EXPN         250-HELP         250-8BITMIME         250-AUTH=LOGIN PLAIN         250-AUTH LOGIN PLAIN         250 XTMD  SMTP>> AUTH PLAIN ****************  SMTP<< 504 Unknown authentication mechanismLOG: MAIN  plain authenticator failed H=smtp.cdn.21cn.com [202.104.32.230] 504 Unknown authentication mechanism  SMTP>> AUTH LOGIN  SMTP<< 334 VXNlcm5hbWU6  SMTP>> ********  SMTP<< 334 UGFzc3dvcmQ6  SMTP>> ********  SMTP<< 235 OK Authenticated  SMTP>> MAIL FROM:<yjnet@21cn.com> AUTH=root@debian  SMTP<< 250 Ok  SMTP>> RCPT TO:<jims.yang@gmail.com>  SMTP<< 250 User <jims.yang@gmail.com> is not local, will forward to <64.233.167.114:25>.  SMTP>> DATA  SMTP<< 354 Start mail input; end with <CRLF>.<CRLF>  SMTP>> writing message and terminating "."  SMTP<< 250 Requested mail action okay, completed.  Message-ID=<E1GQfnH-0001hE-PY@debian>  SMTP>> QUITLOG: MAIN  => jims.yang@gmail.com R=smarthost T=remote_smtp_smarthost H=smtp.cdn.21cn.com [202.104.32.230]LOG: MAIN  Completed


成功发送。

原创粉丝点击