一、說明
mail和mailx就像我們windows上的foxmail,是個客戶端工具,在Linux運維環境中可能會用到一些報警之類的功能,可通過系統mail命令直接發送電子郵件到指定的郵箱用來實現告警,本文就mail客戶端配置和常見使用格式做下學習。
二、不加密發送郵件
1、安裝mail,使用yum install mailx即可直接安裝。
2、編輯mail配置文件,對發件人身份、服務器、端口等進行基本配置,/etc/mail.rc
###vim /etc/mail.rc
## smtp服務器發信的用戶名和昵稱 set from=test@tompig.cn(nickname)
## smtp服務器的地址 set smtp=smtp://smtp.mxhichina.com
## 郵件認證的方式 set smtp-auth=login
## smtp服務器認證的用戶名 set smtp-auth-user=test@tompig.cn
## smtp服務器認證的用戶密碼(授權碼) set smtp-auth-password=password
至此,配置文件配置完成,可使用下面的命令進行發信測試
echo "mail warning test,this is a test email" | mail -s "mail report" 150xxxxxxxx@139.com
注意:1)smtp發信需要郵件系統管理員配置該認證賬戶的發信權限,允許使用smtp協議發信,認證密碼根據實際情況填寫,有的雲郵箱可能是個動態授權碼。
2)有些雲郵箱本身自帶反垃圾功能,如果由於郵件內容寫的比較簡單或其他原因導致被識別為垃圾郵件,可能會出現報錯“Unexpected EOF on SMTP connection”,也可能本地沒有報錯,但是登陸到郵箱網頁會收到退信,此退信並不是最終的收件人郵箱服務器產生的退信,而是發信服務器在發信之前就判斷成了垃圾郵件,產生退信。可以適當修改郵件內容、主題等信息,避免因為內容被識別成垃圾郵件。加密傳輸也可能出現"Unexpected EOF on SMTP connection",基本上是由於端口只支持SMTPS導致,將協議改成smtps://,參考下文配置。
三、加密發送郵件
上述情況在使用smtp發信時用的是25端口,而有些郵件服務器端是不允許開啟25端口的,可能會使用smtps(465)、starttls(587)等加密端口發信,這里以465端口舉例。
修改配置文件(/etc/mail.rc)如下:
## smtp服務器發信的用戶名 set from=test@tompig.cn
## smtp服務器的地址,注意"smtps"協議名和后面的端口號 set smtp=smtps://smtp.mxhichina.com:465
## 郵件認證的方式 set smtp-auth=login
## smtp服務器認證的用戶名 set smtp-auth-user=test@tompig.cn
## smtp服務器認證的用戶密碼(授權碼) set smtp-auth-password=password
## 忽略驗證錯誤 set ssl-verify=ignore
##指定證書文件存放目錄,自定義 set nss-config-dir=/root/.cert/
這里在配置文件中多加入驗證配置和證書文件存放目錄配置2行,需要手動導入認證郵件服務器的證書,添加信任。
執行步驟如下:
##創建自定義目錄 mkdir /root/.certs
##進入證書目錄 cd /root/.certs ##獲取郵件服務器證書秘鑰(465端口) echo -n "" | openssl s_client -connect smtp.mxhichina.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > aliyun_smtps.crt
##附:獲取郵件服務器證書秘鑰(587端口) #echo -n | openssl s_client -starttls smtp -connect smtp.mxhichina.com:587 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > aliyun_starttls.crt
##將證書添加到受信任列表 certutil -A -n 'aliyun' -t "P,P,P" -d . -i ./aliyun_smtps.crt
上述certutil命令中-A表示添加,-n是nickname(昵稱),可以隨意取,例如126或qq;-t表示受信任的標簽,可取值是t/c/p三種或者其組合;-d表示證書所在目錄,-i指示證書文件的位置。
至此,配置完成,可使用mail命令直接發信,這里簡單說明一下:
1)如果是465端口,需要加上smtps://協議;如果是587端口,不需要加smtps://或者寫smtp://;
2)如果使用587端口通訊,應當顯示設置smtp-use-starttls;
3)郵件的來源應當與郵箱相同,或者將發信人姓名寫在郵箱后的括號中。例如:set from=user@xxxx.com或set from=user@xxx.com(nickname);如果郵箱與認證的不一致,將出現“smtp-server: 553 Mail from must equal authorized user”的錯誤;
4)有些郵件服務器的587端口不是使用STARTTLS而是SMTPS,此時仍需加上smtps://協議,例如126郵箱
四、mail常用命令簡介
1、在標准輸入中輸入郵件內容:
~]# mail -s 'mail test' xxx@139.com this is a test email
輸入完成后成按Ctrl+D結束並發送郵件。連按兩次Ctrl+C鍵則中斷工作,不送此信件。
2、通過管道傳送郵件正文
~]# echo 'test mail' | mail -s 'mail test' xxx@139.com
其中echo值為郵件內容,-s參數指定郵件主題,最后面跟收件人郵箱地址
3、使用輸入重定向,從文件中獲取郵件內容
mail -s 'mail test' xxx@139.com < file.txt
4、如果需要發送給多個收件人,收件人之間用逗號隔開即可。如下:
mail -s 'mail test' xxx@139.com,xxx@126.com < file.txt
5、其他參數補充
-b<地址>:指定密件副本的收信人地址; -c<地址>:指定副本的收信人地址; -f<郵件文件>:讀取指定郵件文件中的郵件; -i:不顯示終端發出的信息; -I:使用互動模式; -n:程序使用時,不使用mail.rc文件中的設置; -N:閱讀郵件時,不顯示郵件的標題; -s<郵件主題>:指定郵件的主題; -u<用戶帳號>:讀取指定用戶的郵件; -v:執行時,顯示詳細的信息。
參考資料:
https://tlanyan.me/config-mail-use-smtp/