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.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標簽順利解決問題。
