zoukankan      html  css  js  c++  java
  • linux服务之smtp

    实现这个协议的软件太多,有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收到一封信要发到shuer@sh.abc.com,则执行以下过程:
    (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连接,传送这封给shuser@sh.abc.com的信到1.2.3.4 这台服务器的SMTP后台程序。

    SMTP命令是发送于SMTP主机之间的ASCⅡ信息,可能使用到的命令如下表所示。

    SMTP协议命令
    命令
    描述
    DATA
    开始信息写作
    EXPN<string>
    验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
    HELO<domain>
    向服务器标识用户身份,返回邮件服务器身份
    HELP<command>
    查询服务器支持什么命令,返回命令中的信息
    MAIL FROM<host>
    在主机上初始化一个邮件会话
    NOOP
    无操作,服务器应响应OK
    QUIT
    终止邮件会话
    RCPT TO<user>
    标识单个的邮件接收人;常在MAIL命令后面可有多个rcpt to:
    RSET
    重置会话,当前传输被取消
    SAML FROM<host>
    发送邮件到用户终端和邮箱
    SEND FROM<host>
    发送邮件到用户终端
    SOML FROM<host>
    发送邮件到用户终端或邮箱
    TURN
    接收端和发送端交换角色
    VRFY<user>
    用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令

    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:createyuan@sohu.com        声明邮件发送人
    250 2.1.0 Ok
    rcpt to:createyuan1@163.com        声明邮件接收人
    250 2.1.5 Ok
    data                            邮件开始
    354 End data with <CR><LF>.<CR><LF>    下面是邮件头标识,与投递无关,服务器表明以点结束  在SMTP转发的邮件中包括信封和内容这两种东西。
    subject:test mailfj                主题
    from:createyuan@sohu.com        在邮件头中声明邮件来源,仅在outlook与foxmail中显示,与投递无关
    to:createyuan1@163.com            这两个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:root@109-com1.localdomain
    250 2.1.0 Ok
    rcpt to:createyuan1@163.com
    250 2.1.5 Ok
    data
    354 End data with <CR><LF>.<CR><LF>
    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
    mailaddr=createyuan1@126.com  发件人地址
    smtpserver=smtp.126.com
    user=createyuan1
    passwd=*******
    cat <<EOF >/etc/mail.rc
    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 "主题" createyuan@sohu.com #Enter键后输入正文  收件人地址
        mail -v -s "主题" createyuan@sohu.com < file #file内容为正文  
        echo "正文"|mail -v -s "主题" createyuan@sohu.com #以重定向输入为正文

  • 相关阅读:
    你不得不知道的Visual Studio 2012(2) 全新调试功能
    我看TechEd 2012之App时代降临
    Asp.Net MVC4入门指南(1): 入门介绍
    前端代码标准最佳实践:CSS篇
    Asp.Net MVC4入门指南(2):添加一个控制器
    你不得不知道的Visual Studio 2012(1) 每日必用功能
    Asp.Net MVC4入门指南(4):添加一个模型
    光棍节程序员闯关秀过关全攻略(附带小工具)
    C#性能优化实践
    Asp.Net MVC4入门指南(3):添加一个视图
  • 原文地址:https://www.cnblogs.com/createyuan/p/3969731.html
Copyright © 2011-2022 走看看