linux系统定时发送邮件

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

 

简介shell

本章分为五部分。数据库

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

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

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

第四部分是注意事项bash

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

 

1、虚拟机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

 

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

阿里云封闭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/

 

3、群发邮件测试

1、准备两个文件mail.shtask.txt

 

二、shell脚本mail.sh的内容

 

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

 

四、编辑crontab定时任务内容

[root@localhost home]# crontab -e

 

4、注意事项

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

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

 

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

一、在编辑/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://便可

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

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

三、基于第二点详解

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

 

也能够直接在浏览器上打开网页版,保存证书为PEMbase64格式)格式而后

上传到服务器

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

certutil -A -n 'xxxx' -t "P,P,P" -d . -i ./xxx.crt

上述命令中

-A表示添加

-nnickname,能够随意取,例如126qq

-t表示受信任的标签,可取值是t/c/p三种或者其组合;

-d表示证书所在目录

-i指示证书文件的位置。

 

在配置文件中更改证书目录:

指向证书文件目录

set nss-config-dir=/path/to/cert-dir

网上许多教程的-t标签都是"C,,",实践中发现使用该标签仍会报错(gmail的证书

google本身签发的,用C标签没问题,许多博主估计没试就直接抄来)。经过查

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

相关文章
相关标签/搜索