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.sh和task.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
# 也能夠直接在瀏覽器上打開網頁版,保存證書爲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標籤順利解決問題。