一. Sendmail及相关概念简介
在Linux下有许多软件可以实现标准的邮件服务。UNIX/Linux 的电子邮件系统模型基本可分为邮件传递代理MTA,邮件投递代理MDA,邮件获取及存储代理MSA,以及邮件客户代理MUA几大模块。
一个邮件传输代理的主要工作是监视用户代理的请求,根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之间传输并且将接收到的邮件缓冲或者 提交给最终投递程序。sendmail是Linux平台上的著名邮件传递代理,它几乎在任何 UNIX 平台上都有相应的版本。它是一个免费软件,可以支持数千甚至更多的用户,而且占用的系统资源相当少。
一封电子邮件的传递过程在致是这样的:当用户编辑完成并试图发送一封电子邮件的时候,用户代理(MTA)则去寻找一个信件传输代理(MTA),并把邮件提交给它。传输代理得到了邮件后,首先将它保存在自身的缓冲队列中,而后,邮件传输代理程序查找确定此目标地址对应的邮件传输代理服务器,如果是自己负责的域,则根据自身的规则决定接收或者拒绝此邮件;否则,则通过网络将邮件传送给此目标域的SMTP服务器。目标服务器接收到邮件之后,将其缓冲存储在本地,目标收信人便可以通过信箱帐号查收此邮件了。 显然,邮件传输是从MTA到MTA的,而且每个用户必须拥有服务器上存储信息的空间(称为信箱)才能接受邮件(发送邮件不受这个限制)。
mail IN A 192.168.1.6
二. SMTP命令简介
SMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码。SMTP 在 TCP 协议 25 端口监听连接请求。
ESMTP (Extended SMTP),顾名思义,扩展 SMTP 就是对标准 SMTP 协议进行的扩展。它与 SMTP 服务的区别仅仅是,使用 SMTP 发信不需要验证用户帐户,而用 ESMTP 发信时,服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与 SMTP 方式没有两样。
SMTP 命令包括:
HELO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
EHLO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL FROM 命令中指定的地址是发件人地址
RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。
DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器应响应 OK
RSET 重置会话,当前传输被取消
QUIT 结束会话
|OUTLOOK|-------------------->|MTA1|---------------->|MTA2|
DNS服务器,域:mydomain.org
IN MX 10 mydomain.org.
mydomain.org. IN A 192.168.1.6
nameserver 127.0.0.1
nameserver 192.168.1.66
#指向MTA2
DNS服务器,域:benet.org
IN MX 10 benet.org.
benet.org. IN A 192.168.1.66
nameserver 127.0.0.1
nameserver 192.168.1.6
#指向MTA1
#rpm -e sendmail
添加:
APPENDDEF(`confENVDEF',`-DSASL=2')
APPENDDEF(`conf_sendmail_LIBS',`-lsasl2')
#sh Build install
#cp -a cf /usr/share/sendmail
#cp generic-linux.mc sendmail.mc
#make install-cf
#cp sendmail.mc /etc/mail
#touch aliases access
#echo "mydomain.org">local-host-names
#echo "mail.mydomain.org">>local-host-names
#makemap hash access.db < access
-b:指定Sendmail在后台运行,并且监听端口25的请求。
-d:指定Sendmail以Daemon方式运行(守护进程)。
-q:当Sendmail无法将邮件成功地发送到目的地时,它会将邮件保存在队列里。该参数指定邮件在队列里保存的时间。例子里的30m表示保留30分钟。
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 4636/
#passwd test
#newaliases
#telnet localhost 25
mail from:root@mydomain.org
rcpt to:test@mydomain.org
data
THis is a test!!
.
quit
通过发信日志查看邮件发送状态
#tail -20 /var/log/maillog
include(`/usr/share/sendmail/cf/m4/cf.m4')dnl
FEATURE(`access_db')dnl
#m4 sendmail.mc> semdmail.cf
192.168.1
benet.org
192.168.1 RELAY
#makemap hash access.db < access
Compiled with: DNSMAP LOG MATCHGECOS MILTER MIME7TO8 MIME8TO7
NAMED_BIND NETINET NETUNIX NEWDB PIPELINING SASLv2 SCANF USERDB
XDEBUG
TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5')dnl
define(`confAUTH_MECHANISMS',`LOGIN PLAIN DIGEST-MD5')dnl
FEATURE(`no_default_msa')dnl
DAEMON_OPTIONS(`Port=25,Name=MTA,M=Ea')dnl
mech_list:login plain
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 localhost.localdomain ESMTP Sendmail 8.13.8/8.13.8; Sat, 24 Mar 2007 22:37:15 +0800
ehlo localhost <--此句为输入的命令
250-localhost.localdomain Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-AUTH LOGIN PLAIN DIGEST-MD5
250-DELIVERBY
250 HELP