Linux Centos7系统下利用自带的mail发送邮件服务

简介

本章分为五部分。

第一部分是基于虚拟机下的CentOS 7环境定时发送邮件;

第二部分是基于在阿里云购买的CentOS 7服务器环境定时发送邮件;

第三部分是群发邮件的测试。

第四部分是注意事项

第五部分是配置mail定时发送邮件碰到的问题以及解决方案

一、虚拟机CentOS 7环境

若在自己的linux系统中或者虚拟机环境下,发送邮件的非加密端口25是开放的,可以直接发送,下方利用CentOS 7自带邮件系统完成每隔一分钟执行一次发邮件服务。配置如下:

①写一个shell脚本[root@localhost ~]#vi mail.sh

#!/bin/sh

echo '你好'|mail -s '主题' xxxxxxx@qq.com

②设置发件人信息

[root@localhost ~]# vi /etc/mail.rc

#末尾加入以下参数

set bsdcompat

set from=xxxxxxxx@163.com               #发送邮件后显示的邮件发送方

set smtp=smtp.163.com                      #网易邮箱smtp邮件服务器地址

set smtp-auth-user=xxxxxxxx@163.com       #发件人邮箱

set smtp-auth-password=*********            #发件人邮箱密码

set smtp-auth=login                         #动作为登录

③设置定时任务

[root@localhost ~]# crontab -e

#编辑内容为:

*/1 * * * * bash /root/mail.sh

二、在阿里云服务器的环境下

阿里云封闭25端口,所以不能通过默认的端口(25)发送邮箱,需要通过邮箱服务器的加密端口(465)来完成发送邮件的服务。配置流程如下:

①[root@localhost ~]# vi /etc/mail.rc

#【利用腾讯的企业邮箱发送,最后一句是证书存放位置,届时发送邮件的时候,会通过此证书,来对加密端口进行解密,此处加密端口是465】

#在末尾加入以下内容

set bsdcompat

set from=xxxxxxxx@nascent.cn                  #发送邮件后显示的邮件发送方

set smtp=smtps://smtp.exmail.qq.com:465          #腾讯企业邮箱smtp邮件服务器地址

set smtp-auth-user=xxxxxxxx@nascent.cn          #发件人邮箱

set smtp-auth-password=NxybYwMkBMy4zp4n     #发件邮箱随机密码(设置-微信绑定-安全登录-客户端专用密码)

set smtp-auth=login                            #动作为登录

set ssl-verify=ignore                           #忽略SSL验证

set nss-config-dir=/home/zs/.certs                #证书所在目录

②然后是对.certs文件进行创建,执行如下命令行

#创建证书目录

[root@localhost ~]# mkdir -p /home/zs/.certs/

#获取邮件服务器证书内容(可分开执行查看过程)

[root@localhost ~]# echo -n | openssl s_client -connect smtp.exmail.qq.com:465| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /home/zs/.certs/qq.crt

#添加证书到数据库

[root@localhost ~]# certutil -A -n "GeoTrust SSL CA"-t "C,,"-d /home/zs/.certs -i /home/zs/.certs/qq.crt

[root@localhost ~]# certutil -A -n "GeoTrust Global CA"-t "C,,"-d /home/zs/.certs -i /home/zs/.certs/qq.crt

#指明受信任证书(因为上面两个-t后的C标签是会报错的,Pu可以防止报错)

[root@localhost ~]# certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu"  -d ./ -i qq.crt

Notice: Trust flag u is set automatically if the private key is present.

(注意:如果私钥存在,则会自动设置信任标志u。)

#列出指定目录下的证书

[root@localhost ~]# certutil -L -d /home/zs/.certs/

三、群发邮件测试

1、准备两个文件mail.sh和task.txt

2、shell脚本mail.sh的内容

3、Task.txt存储的是群发人的邮箱

4、编辑crontab定时任务内容

[root@localhost home]# crontab -e

四、注意事项

Windows下编辑的文件上传到linux系统中,会出现编码等问题,可以在notepad++中设定如下:

编辑-文档格式转换-转换为UNIX格式

五、配置mail定时发送邮件碰到的问题以及解决方案

1、在编辑/etc/mail.rc配置文件时,将set smtp=smtps://smtp.exmail.qq.com:465

写成set smtp=smtp://smtp.exmail.qq.com:465

导致在测试发送邮件时报Unexpected EOF on SMTP connection这个错。

是由于端口只支持SMTPS导致,将协议改成smtps://即可。

2、在进行添加证书到数据库是报错以下错误

certutil -A: trust is required for this command (-t).

(certutil -A:此命令(-t)需要信任)

提示我们执行这个命令需要在-t后面添加受信任证书标签,一开始以为这个警告可

以忽略,于是以为设置好了,可以进行测试了:

[root@localhost ~]# echo '你好'|mail -s '主题' xxxxxxxx@qq.com

结果又报错了:Error initializing NSS: Unknown error -8015.

此报错是邮件发送异常时返回的错误,这类错误可以理解成是没有证书或创建的证

书未生效。通过网上找了很多方法都不行,后面看到这篇文章

https://www.unixhot.com/article/303

执行了下面这句话

certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu"  -d ./ -i qq.crt

结果收到了邮件,一切ok。

3、基于第二点详解

https://segmentfault.com/a/1190000015143877这篇文章使我明白为何会报以下错误:

Error initializing NSS: Unknown error -8015

以下内容摘自上面链接文章的内容,稍作整理:

如果测试发送邮件出现一行警告:“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,,",实践中发现使用该标签仍会报错(gmail的证书

是google自己签发的,用C标签没问题,许多博主估计没试就直接抄来)。通过查

阅certutil的用法,使用P标签顺利解决问题。

linux系统定时发送邮件的更多相关文章

  1. linux系统定时重启tomcat

    #touch auto-start.sh [root@Linux opt]# echo $LANGen_US.UTF-8 #vim auto-start.sh #!/bin/sh export LAN ...

  2. linux系统如何发送邮件

    安装应用yum install mailx  sendmail -y接着修改/etc/mail.rc文件,添加一下参数#末尾添加 zabbix 发送告警信息邮箱(按照自己的情况修改)set from= ...

  3. linux下定时发送邮件

    at命令可以在某个时间运行某个程序,而mail可以以命令行的方式把存于一个文本中的邮件正文发送抄送出去. 具体用法:  1. 把email正文准备好,比如写在email.txt里  2. 然后写一个脚 ...

  4. Linux系统定时备份网站文件到七牛云存储脚本

    1.七牛云账号注册. 有些朋友可能会问为什么要备份到七牛云?很简单,七牛云免费注册就能获取1G的存储空间,只要简单几步操作完成实名认证即可获取10G的存储空间,对于一般个人站点来说已经足够备份使用了. ...

  5. linux系统时间同步

    1.linux系统时间同步[root@xuegod62 ~]# /usr/sbin/ntpdate ntp1.aliyun.com2.linux系统定时同步[root@xuegod62 ~]# ech ...

  6. linux系统下邮件的发送

    在linux系统下发送邮件一般都要要求本地的机器必须安装和启动Sendmail服务,配置非常麻烦,而且会带来不必要的资源占用. 其实我还可以安装mailx软件,通过修改配置文件可以使用外部SMTP服务 ...

  7. Linux学习之十-Linux系统时间

    Linux系统时间 1.date命令用于查看以及修改Linux系统的时间,关于date命令的详细帮助文档如下 [root@localhost ~]# date --help Usage: date [ ...

  8. Linux系统Shutdown命令定时关机详解

    转自:http://www.bootf.com/490.html Linux系统下的shutdown命令用于安全的关闭/重启计算机,它不仅可以方便的实现定时关机,还可以由用户决定关机时的相关参数.在执 ...

  9. python (18)在linux中如何实现定时发送邮件

    最近要用到,定时发送邮件功能: 如何定时,当然要用到linux中crontab了 如下的代码能够定时发送邮件 #!/usr/bin/env python # -*- coding=utf-8 -*- ...

随机推荐

  1. 新建项目中的fail和missing之类的问题

    首先必须要明白:每一个项目需要都要安装在本地仓库中去--->pom,war,jar无一例外 如果不安装会出现下面的错误: 解决的办法就是: 先clean后install项目,把他们安装到本地仓库 ...

  2. win10 解决端口被占用

    查看端口 netstat -aon|findstr "端口" 通过PID查找应用程序 tasklist|findstr "PID" 关闭进程 taskkill ...

  3. 使用vitamio长时间播放崩溃的另类处理

    最近公司一个项目在公交站旁边弄一个 广告牌,上面是广告视频,下面是广告图片,都是无限轮播的.要求从早上6点到晚上11点不间断播放.剩余时间为关机状态. 图片部分还好说,就是viewpager弄一个无限 ...

  4. 你以为反射真的无所不能?至少JDK8以后很强大

    目录 反射操作方法 Spring的方法的优点 反射如何实现Spring的方法 Java字节码 高级反射注意点 javac的彩蛋 续点 每日一笑 上期答案 # 加入战队 微信公众号 之前我们已经介绍了J ...

  5. 编写自动匹配的下拉框(已解决IE8兼容)

    如何制作一个带匹配功能的下拉框? 之前看见layui有相关组件,但是发现,如果输入的内容在下拉框中没有相应的匹配,就会清空当前值,搞得我很不满意.有些代码是从网上扒下来的,但是找不到原地址了,凑合看吧 ...

  6. charles 远程映射到URL地址

    本文参考:charles 映射到远程URL地址 远程映射/Map Remote Settings 功能:把你要请求的地址,映射到一个远程地址:相当于把你的请求地址修改了: 远程映射工具 远程映射工具根 ...

  7. Prometheus Operator 监控Kubernetes

    Prometheus Operator 监控Kubernetes 1. Prometheus的基本架构 ​ Prometheus是一个开源的完整监控解决方案,涵盖数据采集.查询.告警.展示整个监控流程 ...

  8. 零基础快速入门Java的秘诀

    刚开始学习Java时要端正自己的学习的目标和态度,明确学习Java基础重点要做什么. 首先第一点,Java基础的学习,基础很重要,基础好地基牢,才能爬的高! 大家要从以下4个方向努力: 代码能力:一定 ...

  9. 实现一个正则表达式引擎in Python(三)

    项目地址:Regex in Python 前两篇已经完成的写了一个基于NFA的正则表达式引擎了,下面要做的就是更近一步,把NFA转换为DFA,并对DFA最小化 DFA的定义 对于NFA转换为DFA的算 ...

  10. mybatis-generator生成数据对象

    mybatis-generator生成数据对象 步骤一:在pom文件中添加build的插件 <build> <finalName>doudou</finalName> ...