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 {
set smtp=smtps://smtp.126.com:465
set smtp-auth=login
set smtp-auth-user=user@.com
set smtp-auth-password=password
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb
set from=password@.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  -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: | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > xxx.crt
  # 587端口
  echo -n | openssl s_client -starttls smtp -connect smtp.xxx.com: | 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"标签完美解决,再发邮件就没有报错了。

CentOS7 配置Mailx使用SMTP发送邮件的更多相关文章

  1. CentOS7配置mailx使用外部smtp服务器发送邮件

    转自huskiesir的博客: 发送邮件的两种方式: 1.连接现成的smtp服务器去发送(此方法比较简单,直接利用现有的smtp服务器比如qq.新浪.网易等邮箱,只需要直接配置mail.rc文件即可实 ...

  2. centos7 配置mailx使用外部smtp发送外网邮件

    1- 安装 1.1- 安装mailx yum install mailx -y 2- 配置 2.1- 配置外部发件邮箱 vim /etc/mail.rc 在最后加上: //如果不存在,则编辑/etc/ ...

  3. ubuntu使用mailx利用SMTP发送邮件

    转载:http://www.blogjava.net/jasmine214--love/archive/2010/10/09/334102.htmlLinux下mail利用外部邮箱发送邮件的方法: 1 ...

  4. 配置gitlab通过smtp发送邮件

    1. 编辑/etc/gitlab/gitlab.rb文件(加到文件最后面就好了,或者通过搜索找到,新版已有这些配置,只不过都是被注释掉了).以QQ企业邮箱为例: gitlab_rails['smtp_ ...

  5. linux配置使用外部smtp发送邮件

    mail命令需要设定mail.rc(或nail.rc)文件, set from=user@domain.comset smtp=smtp.domain.comset smtp-auth-user=us ...

  6. centos7 利用mailx发送邮件

    当需要服务器定时发送邮件到自己邮箱时,一个邮件服务就很重要了,以下主要是mailx的实现,主要是利用 1.安装mailx 1 yum  install  mailx -y 2.使用到的配置文件只有一个 ...

  7. Centos 配置mailx使用外部smtp发送邮件

    安装mailx yum install mailx 配置mailx 笔者推荐163邮箱,当然,QQ邮箱也是可以的,PS:记得要进邮箱打开SMTP vi /etc/mail.rc //如果不存在,则编辑 ...

  8. Linux下配置mail使用外部SMTP发送邮件

    修改/etc/mail.rc,增加两行:指定外部的smtp服务器地址.帐号密码等. # vi /etc/mail.rc set from=demo@qq.com smtp=smtp.qq.com se ...

  9. CentOs7.6配置邮件服务并发送邮件

    1.使用Yum 来安装依赖包 yum -y install sendmail yum -y install mailx 2.获取授权码 下面以腾讯为例 https://service.mail.qq. ...

随机推荐

  1. selenium之使用chrome浏览器测试(附chromedriver与chrome的对应关系表)

    https://www.cnblogs.com/JHblogs/p/7699951.html

  2. coolSQL安装与使用

    由于笔者最近支援其他项目,所使用的数据库为informix 所以安装一个coolSQL客户端方便些,当然命令行方式也可以,但是感觉不太友好,下面把安装与简单使用过程分享给大家. 一.下载coolSQL ...

  3. GridView 事件出发后 内容滚动条 实时定位

            var hh;         var hh1;         var h2; ///获取初始位置      触发事件  function Scroll() {            ...

  4. python学习:输出九九乘法表

    输出九九乘法表 代码: num1 = 1while num1 <= 9: num2 = 1 while num2 <= num1: print(str(num2)+"*" ...

  5. mysql学习1

    1.什么是数据库? 数据的仓库,如在ATM的示例中创建了一个db目录,称其为数据库 2.安装 下载 http://dev.mysql.com/downloads/mysql/ 安装 windows: ...

  6. Codechef July Challenge 2018 : Subway Ride

    传送门 首先(想了很久之后)注意到一个性质:同一条边有多种颜色的话保留3种就可以了,这是因为假如最优解要求当前位置与相邻两条边都不相同,那么只要有3条边,就肯定可以满足这一点. 完事就做一个nlogn ...

  7. __x__(27)0907第四天__ float 浮动

     float 浮动 块元素脱离文档流,水平排列. 浮动元素 会尽量往左上(left),或者右上(right)浮动,直到遇到 块元素 或者 其他浮动元素. 可选值: none;   默认值,不脱离文档流 ...

  8. opencv 常用头文件介绍

    1.OpenCV包含的模块 cv – 核心函数库 cvaux – 辅助函数库 cxcore – 数据结构与线性代数库 highgui – GUI函数库 ml – 机器学习函数库 2.常用头文件: #i ...

  9. Jmeter .jmx 改为.jtl

    1.cd $jmeter\bin 2. jmeter -n -t $jmeter\extras\**.jmx -l $jmeter\extras\**.jtl 3.cd $jmeter\extras ...

  10. C++中继承与抽象类

    继承语法格式如下: class 子类名称 : 继承方式(public private protected 三种) 父类名称 纯虚函数格式: virtual 返回值类型 函数名(参数列表)= 0:含有纯 ...