实现这个协议的软件太多,有sendmail,postfix等。不像snmp,基本上是net-snmp一统天下,
yum install nc nc用来取代telnet
这里我们希望让大家知道网络协议中的一个经验:参数越多,死得越快;参数越少,越能持久。参数太多了,根本不利于使用,无法推广,早晚会被别的协议取代。这也符合科学的基础原理,简单。
postfix
[root@84-monitor private]# ps -ef|grep 1251 root 1251 1 0 Jan22 ? 00:01:15 /usr/libexec/postfix/master postfix 1260 1251 0 Jan22 ? 00:00:30 qmgr -l -t fifo -u postfix 14995 1251 0 09:20 ? 00:00:00 pickup -l -t fifo -u postfix 28229 1251 0 09:55 ? 00:00:00 cleanup -z -t unix -u postfix 28231 1251 0 09:55 ? 00:00:00 local -t unix [root@84-monitor postfix]# pwd /var/spool/postfix [root@84-monitor postfix]# ls -R .: active bounce corrupt defer deferred flush hold incoming maildrop pid private public saved trace ./active: ./bounce: ./corrupt: ./defer: ./deferred: ./flush: ./hold: ./incoming: ./maildrop: 742462B31 DC2AE2B50 E63DD2B51 ECF2F2B52 ./pid: master.pid unix.bounce unix.cleanup unix.local ./private: anvil bounce defer discard error lmtp local proxymap proxywrite relay retry rewrite scache smtp tlsmgr trace verify virtual ./public: cleanup flush pickup qmgr showq ./saved: ./trace: [root@84-monitor postfix]# vi /etc/postfix/master.cf smtp inet n - n - - smtpd #submission inet n - n - - smtpd # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING #smtps inet n - n - - smtpd # -o smtpd_tls_wrappermode=yes # -o smtpd_sasl_auth_enable=yes # -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING #628 inet n - n - - qmqpd pickup fifo n - n 60 1 pickup cleanup unix n - n - 0 cleanup qmgr fifo n - n 300 1 qmgr #qmgr fifo n - n 300 1 oqmgr tlsmgr unix - - n 1000? 1 tlsmgr rewrite unix - - n - - trivial-rewrite bounce unix - - n - 0 bounce defer unix - - n - 0 bounce trace unix - - n - 0 bounce verify unix - - n - 1 verify flush unix n - n 1000? 0 flush proxymap unix - - n - - proxymap proxywrite unix - - n - 1 proxymap smtp unix - - n - - smtp # When relaying mail as backup MX, disable fallback_relay to avoid MX loops relay unix - - n - - smtp -o smtp_fallback_relay= # -o smtp_helo_timeout=5 -o smtp_connect_timeout=5 showq unix n - n - - showq error unix - - n - - error retry unix - - n - - error
mail客户端
Saved 1 message in mbox 在这里会发现,刚才读的邮件保存到~/mbox内了
Held 2 messages in /var/spool/mail/root 而用户root的邮箱内只有2封邮件了
smtp协议
SMTP也是个请求/响应协议,命令和响应都是基于ASCⅡ文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码。SMTP在TCP协议25号端口监听连续请求。
由于这个协议开始是基于纯ASCⅡ文本的,在二进制文件上处理得并不好。后来开发了用来编码二进制文件的标准,如MIME,以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。
垃 圾邮件仍然是个重要的问题。原始的SMTP协议的局限之一在于它没有为发送方进行认证的功能。因此定义了SMTP-AUTH 扩展。由于SMTP 巨大安装基础的网络效应,广阔地修改SMTP或者完全替代它被认为是不现实的。Internet Mail 2000 就是这样一个为替换而做的建议。IRTF 的反垃圾邮件研究小组正在研究一些提供简单、灵活、轻量级的、可升级的源端认证的建议。最有可能被接受的建议是Sender Policy Framework 协议。
SMTP协议的邮件路由过程
SMTP服务器基于域名服务DNS中计 划收件人的域名来路由电子邮件。SMTP服务器基于DNS中的MX记录来路由电子邮件,MX记录注册了域名和相关的SMTP中继主机,属于该域的电子邮件 都应向该主机发送。若SMTP服务器 mail.abc.com收到一封信要发到[email protected],则执行以下过程:
(1)Sendmail 请求DNS给出主机sh.abc.com的CNAME 记录,如有,假若CNAME(别名记录)到shmail.abc.com,则再次请求shmail.abc.com的CNAME记录,直到没有为止。
(2)假定被CNAME到shmail.abc.com,然后sendmail请求@abc.com域的DNS给出shmail.abc.com的MX记录(邮件路由及记录),shmail MX 5 shmail.abc.com10 shmail2.abc.com。
(3)Sendmail组合请求DNS给出shmail.abc.com的A记录(主机名(或域名)对应的IP地址记录),即IP地址,若返回值为1.2.3.4(假设值)。
(4)Sendmail与1.2.3.4连接,传送这封给[email protected]的信到1.2.3.4 这台服务器的SMTP后台程序。
SMTP命令是发送于SMTP主机之间的ASCⅡ信息,可能使用到的命令如下表所示。
命令
|
描述
|
DATA
|
开始信息写作
|
EXPN |
验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
|
HELO |
向服务器标识用户身份,返回邮件服务器身份
|
HELP |
查询服务器支持什么命令,返回命令中的信息
|
MAIL FROM |
在主机上初始化一个邮件会话
|
NOOP
|
无操作,服务器应响应OK
|
QUIT
|
终止邮件会话
|
RCPT TO |
标识单个的邮件接收人;常在MAIL命令后面可有多个rcpt to:
|
RSET
|
重置会话,当前传输被取消
|
SAML FROM |
发送邮件到用户终端和邮箱
|
SEND FROM |
发送邮件到用户终端
|
SOML FROM |
发送邮件到用户终端或邮箱
|
TURN
|
接收端和发送端交换角色
|
VRFY |
用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
|
ehlo是对helo的扩展,即extend helo,可以支持认证,即用户认证。
HELO是普通SMTP,不带身份验证也可以继续MAIL FROM下去,直到成功发送邮件,也就是可以伪造邮件啦!
EHLO是ESMTP,带有身份验证,所以没法伪造。
从远程发送到另一个远程也是可以的
[root@109-com1 log]# nc mail.sohu.com 25
220 zw_71_21 ESMTP ready
ehlo mail.sohu.com 表明自己需要身份验证
250-zw_71_21
250-AUTH PLAIN LOGIN
250 STARTTLS
auth login 表明身份验证开始
334 VXNlcm5hbWU6 经过base64编码过的Username:
Y3JlYXRleXVhbg== 经过base64编码过的用户名
334 UGFzc3dvcmQ6 经过base64编码过的Password:
MmQ0NTY3ODkt 经过base64编码过的密码
235 2.0.0 OK
mail from:[email protected] 声明邮件发送人
250 2.1.0 Ok
rcpt to:[email protected] 声明邮件接收人
250 2.1.5 Ok
data 邮件开始
354 End data with
subject:test mailfj 主题
from:[email protected] 在邮件头中声明邮件来源,仅在outlook与foxmail中显示,与投递无关
to:[email protected] 这两个from与to无所谓,可以随便写
wo shi he da 空一行,标识邮件头与内容
sfj
please delete it.
. 以点结束
250 2.0.0 Ok: queued as 256062628456
quit
221 2.0.0 Bye
[root@109-com1 log]#
从本地发送邮件到指定邮箱是可以的
[root@109-com1 log]# nc localhost 25
220 109-com1.localdomain ESMTP Postfix
helo localhost
250 109-com1.localdomain
ehlo localhost
250-109-com1.localdomain
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:[email protected]
250 2.1.0 Ok
rcpt to:[email protected]
250 2.1.5 Ok
data
354 End data with
wwwwwwww
wweeeeeeeee
rrrrrrrrrrr
.
250 2.0.0 Ok: queued as 14C5A80612
quit
221 2.0.0 Bye
[root@109-com1 log]#
linux下发邮件
自架邮件服务器麻烦还容易被拦截,可以使用Linux下mail命令连接到第三方邮件服务器商的smtp服务器发送邮件。事先把发信人地址写入到/etc/mail.rc中才可以用mail去发邮件
#/bin/bash
[email protected] 发件人地址
smtpserver=smtp.126.com
user=createyuan1
passwd=*******
cat <
set from=$mailaddr
set smtp=$smtpserver
set smtp-auth=login
set smtp-auth-user=$user
set smtp-auth-password=$passwd
EOF
发送邮件:3种方式
mail -v -s "主题" [email protected] #Enter键后输入正文 收件人地址
mail -v -s "主题" [email protected] < file #file内容为正文
echo "正文"|mail -v -s "主题" [email protected] #以重定向输入为正文