linux系統定時發送郵件


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=xxxxxxxxxxxxx     #發件郵箱隨機密碼(設置-微信綁定-安全登錄-客戶端專用密碼

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.shtask.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

 

也可以直接在瀏覽器上打開網頁版,保存證書為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標簽順利解決問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM