zoukankan      html  css  js  c++  java
  • CentOS7 配置Mailx使用SMTP发送邮件

    mail、mailx和sendmail介绍:
      mail是mailx的别名,最初叫nail(与arch linux目前用的S-nail基因相同);mail是Heirloom的一个子项目。sendmail是Eric Allman的作品,都是开源项目;mail是用户代理(客户端),sendmail是邮件传输代理(服务器);mail默认使用sendmail对外发送邮件。
      总结:mail和mailx是同一个东西,大约类似于发信用的foxmail、outlook等工具,sendmail大约相当于163/qq邮箱的服务器软件。
     
    SSL、TLS和STARTTLS介绍:
      我们知道云服务器基本上不允许25端口对外通信,要对外发邮件只能考虑465和587端口。那么465和587端口有什么区别?这要先从SSL、TLS和STARTTLS的区别开始说。
      SSL(Secure Socket Layer)是加密传输层,TLS(Transport Layer Security)是SSL的继承者和升级版,提供更好的安全性和性能。SSL有SSL v2、SSL v3两个版本,目前都不建议使用。TLS有TSL v1.0-v1.3,建议至少使用TLS v1.2。
      TLS和STARTTLS两者关系不大,但更让人容易产生误解,原因是名字中都带有TLS。STARTTLS是升级非安全连接为安全连接的协议,并没有强制使用加密。当服务端支持时,客户端和服务端才协商将已经建立的连接升级到SSL或者TLS加密。
      接着看465端口和587端口。我们知道25端口刚被设计出来时是用于转发邮件的,没有考虑认证、加密等问题。随着垃圾邮件泛滥、网络安全问题严重,MSA、ESMTP/SMTPS等概念和协议被设计出来。1997年465端口被注册用于加密方式(SMTPS)提交邮件,那时还没有STARTTLS。1998年STARTLS标准出炉,规定用587端口以STARTTLS方式提交邮件,465端口被吊销。然而许多客户端不支持STARTTLS,加上非常多邮件服务提供商都在使用465端口作为加密提交端口,于是465就一直这么被用到今天。
      简单来说,465端口只支持加密传输,不符合互联网号码分配结构(The Internet Assigned Numbers Authority,IANA)的标准,但一直被使用和支持;587端口专门被设计用来提交邮件,传输可以加密也可以不加密。
     
    配置mail:
      明白了基本概念,接下来配置mail使用SMTP对外发送邮件。mail命令的系统级配置文件是/etc/mail.rc,用户级别的默认配置文件是~/.mailrc,也可以通过MAILRC环境变量设置配置文件路径。作为普通用户,我们在本地的~/.mailrc文件进行配置,SMTP的主要配置如下:
    set smtp=smtps://smtp.xxx.com:465   # 这里填入smtp地址
    set smtp-auth=login                 # 认证方式
    set smtp-auth-user=user@xxx.com     # 这里输入邮箱账号
    set smtp-auth-password=password     # 这里填入密码
    set ssl-verify=ignore               # 忽略证书警告
    set nss-config-dir=/etc/pki/nssdb   # 证书所在目录
    set from=user@xxx.com               # 设置发信人邮箱和昵称
    #set smtp-use-starttls=yes          # STARTTLS时使用
    注意事项:      
           如果是465端口,需要加上smtps://协议;如果是587端口,不需要加smtps://或者写smtp://;
    如果使用587端口通讯,应当显示设置smtp-use-starttls;
           邮件的来源应当与邮箱相同,或者将发信人姓名写在邮箱后的括号中。例如:set from=user@xxxx.com或set from=user@xxx.com;如果邮箱与认证的不一致,将出现“smtp-server: 553 Mail from must equal authorized user”的错误;
      有些邮件服务器的587端口不是使用STARTTLS而是SMTPS,此时仍需加上smtps://协议,例如126邮箱。
    测试:
      配置好后,使用mail命令发送邮件:
      echo '邮件内容' | mail -s '邮件标题' 收件人邮箱
      #或者:
      cat 邮件内容.txt | mail -s '邮件标题' 收件人邮箱
      #或者
      mail -s '邮件标题' 收件人邮箱 < 邮件内容.txt
      mail命令的选项非常丰富,具体可查看其文档或这篇文章
    多账户:
      配置文件的account指令或在命令行中指定配置。先看配置文件中指定,在~/.mailrc中将配置改成如下:
    # 126不支持STARTTLS,使用465端口
    account 126 {
    set smtp=smtps://smtp.126.com:465
    set smtp-auth=login
    set smtp-auth-user=user@126.com
    set smtp-auth-password=password
    set ssl-verify=ignore
    set nss-config-dir=/etc/pki/nssdb
    set from=password@126.com
    }
    # QQ邮箱支持STARTTLS,使用587端口
    account qq {
    set smtp=smtp://smtp.qq.com:587
    set smtp-auth=login
    set smtp-auth-user=user@qq.com
    set smtp-auth-password=password
    set ssl-verify=ignore
    set nss-config-dir=/etc/pki/nssdb
    set from="user@qq.com"
    set smtp-use-starttls=yes
    }

    配置文件中定义了两个账户,发送邮件时可用-A参数指定发信账户:

    echo 'mail test for 126' | mail -A 126 -s 'mail test' user@xxx.com
    echo 'mail test for qq' | mail -A qq -s 'mail test' user@xxx.com

    除了配置文件,也可以在命令行中用-S参数进行设置。例如:

    echo 'mail test for command line option' | mail -s 'mail test' -S smtp=smtp://smtp.qq.com:587 -S smtp-auth=login -S smtp-auth-user=user@qq.com -S smtp-auth-password=password -S ssl-verify=ignore -S nss-config-dir=/etc/pki/nssdb -S from="user@qq.com(nickname)" -S smtp-use-starttls=yes user@xxx.com

    这种方法比较繁琐,就是将配置文件的每一行都作为选项写在命令中。在程序中调用mail命令发送邮件时可以采取这种方法。

     
    解决警告:
      虽然邮件能顺利发送,但每次运行都会出现一行警告:“Error in certificate: Peer's certificate issuer is not recognized.”。这是由于使用加密通信,但客户端不能确认证书是否真实。如果我们将配置中的set ssl-verify=ignore改成set ssl-verify=strict,连接将直接中断而不会继续发邮件。
      
    获取邮件服务器证书:
    要解决这个警告,需要将邮件服务器的证书加入到信任列表。操作步骤如下:
      # 465端口
      echo -n "" | openssl s_client -connect smtp.xxx.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > xxx.crt
      # 587端口
      echo -n | openssl s_client -starttls smtp -connect smtp.xxx.com:587 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > xxx.crt
      # 也可以直接在浏览器上打开网页版,保存证书为PEM(base64格式)格式然后上传到服务器

    将证书添加到受信任列表:

    certutil -A -n 'xxxx' -t "P,P,P" -d . -i ./xxx.crt
      上述命令中-A表示添加,-n是nickname,可以随意取,例如126或qq;-t表示受信任的标签,可取值是t/c/p三种或者其组合;-d表示证书所在目录,-i指示证书文件的位置。
      在配置文件中更改证书目录:
      # 指向证书文件目录
      set nss-config-dir=/path/to/cert-dir

    许多-t标签都是"C,,",实践中发现使用该标签仍会报错。

    使用"P"标签完美解决,再发邮件就没有报错了。

  • 相关阅读:
    线段树专辑—— pku 1436 Horizontally Visible Segments
    线段树专辑——pku 3667 Hotel
    线段树专辑——hdu 1540 Tunnel Warfare
    线段树专辑—— hdu 1828 Picture
    线段树专辑—— hdu 1542 Atlantis
    线段树专辑 —— pku 2482 Stars in Your Window
    线段树专辑 —— pku 3225 Help with Intervals
    线段树专辑—— hdu 1255 覆盖的面积
    线段树专辑—— hdu 3016 Man Down
    Ajax跨域访问
  • 原文地址:https://www.cnblogs.com/bigdevilking/p/10668827.html
Copyright © 2011-2022 走看看