今天分享在
Linux上使用mail命令通過SMTP對外發郵件。
mail、mailx和sendmail
先看一下三者的關係:mail是mailx的別名,最初叫nail(與arch linux目前用的S nail基因相同);mail是Heirloom的一個子項目,sendmail是Eric Allman的作品,都是開源項目;mail是用戶代理(客戶端),sendmail是郵件傳輸代理(服務器);mail默認使用sendmail對外發送郵件。
總結:mail和mailx是同一個東西,大約類似於發信用的foxmail、outlook等工具,sendmail大約相當於163/qq郵箱的服務器軟件。
SSL、TLS和STARTTLS
由前文我們知道雲服務器基本上不允許25端口對外通信,要對外發郵件只能考慮465和587端口。那麼465和587端口有什麼區別?這要先從SSL、TLS和STARTTLS的區別開始說。
SSL(Secure Socket Layer)是加密傳輸層,TLS(Transport Layer Security)是SSL的繼承者和升級版,提供更好的安全性和性能。SSL有SSL v2、SSL v3兩個版本,目前都不建議使用。TLS有TSL v1.0-v1.3,建議至少使用TLS v1.2。
TLS和STARTTLS兩者關係不大,但更讓人容易產生誤解,原因是名字中都帶有TLS。STARTTLS是升級非安全連接爲安全連接的協議,並沒有強制使用加密。當服務端支持時,客戶端和服務端才協商將已經建立的連接升級到SSL或者TLS加密。
接着看465端口和587端口。我們知道25端口剛被設計出來時是用於轉發郵件的,沒有考慮認證、加密等問題。隨着垃圾郵件氾濫、
網絡安全問題嚴重,MSA、ESMTP/SMTPS等概念和協議被設計出來。1997年465端口被註冊用於加密方式(SMTPS)提交郵件,那時STARTTLS還沒有搗騰出來。1998年STARTLS標準出爐,規定用587端口以STARTTLS方式提交郵件,465端口被吊銷。然而許多客戶端不支持STARTTLS,加上非常多郵件服務提供商都在使用465端口作爲加密提交端口,於是465就一直這麼被用到今天。
簡單來說,465端口只支持加密傳輸,不符合
互聯網號碼分配結構(The Internet Assigned Numbers Authority,IANA)的標準,但一直被使用和支持;587端口專門被設計用來提交郵件,傳輸可以加密也可以不加密。
配置mail
明白了基本概念,接下來配置mail使用SMTP對外發送郵件。mail命令的系統級配置文件是/etc/mail.rc,用戶級別的默認配置文件是~/.mailrc,也可以通過MAILRC環境變量設置配置文件路徑。作爲普通用戶,我們在本地的~/.mailrc文件進行配置,SMTP的主要配置如下:
set smtp=smtps://smtp.xxx.com:465 # 這裏填入smtp地址 set smtp-auth=login # 認證方式 set smtp-auth-password=password # 這裏填入密碼 set ssl-verify=ignore # 忽略證書警告 set nss-config-dir=/etc/pki/nssdb # 證書所在目錄 #set smtp-use-starttls=yes # STARTTLS時使用 |
幾個注意點:
如果是465端口,需要加上smtps://協議;如果是587端口,不需要加smtps://或者寫smtp://;
如果使用587端口通訊,應當顯示設置smtp-use-starttls;
有些郵件服務器的587端口不是使用STARTTLS而是SMTPS,此時仍需加上smtps://協議,例如126郵箱。
配置好後,使用mail命令發送郵件:
echo '郵件內容' | mail -s '郵件標題' 收件人郵箱
#或者:
cat 郵件內容.txt | mail -s '郵件標題' 收件人郵箱
#或者
mail -s '郵件標題' 收件人郵箱 < 郵件內容.txt
mail命令的選項非常豐富,具體可查看其文檔或這篇
文章。
多賬戶
如果想切換髮送郵箱怎麼辦?答案是利用配置文件的account指令或在命令行中指定配置。先看配置文件中指定,在~/.mailrc中將配置改成如下:
# 126不支持STARTTLS,使用465端口 account 126 { set smtp=smtps://smtp.126.com:465 set smtp-auth=login set smtp-auth-password=password set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb } # QQ郵箱支持STARTTLS,使用587端口 account qq { set smtp=smtp://smtp.qq.com:587 set smtp-auth=login set smtp-auth-password=password set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb set smtp-use-starttls=yes } |
配置文件中定義了兩個賬戶,發送郵件時可用-A參數指定發信賬戶:
除了配置文件,也可以在命令行中用-S參數進行設置。例如:
echo 'mail test for command line option' | mail -s 'mail test' -S smtp=smtp://smtp.qq.com:587 -S smtp-auth=login -S
[email protected] -S smtp-auth-password=password -S ssl-verify=ignore -S nss-config-dir=/etc/pki/nssdb -S from="
[email protected](nickname)" -S smtp-use-starttls=yes
[email protected] 這種方法比較繁瑣,就是將配置文件的每一行都作爲選項寫在命令中。在程序中調用mail命令發送郵件時可以採取這種方法。
解決警告
雖然郵件能順利發送,但每次運行都會出現一行警告:“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標籤順利解決問題。
配置完成後,再使用mail命令發送郵件,煩人的警告消失不見。
其他
"Unexpected EOF on SMTP connection",基本上是由於端口只支持SMTPS導致,將協議改成smtps://即可。
上文內容不用於商業目的,如涉及知識產權問題,請權利人聯繫博爲峯小編(021-64471599-8017),我們將立即處理。
轉自:http://www.51testing.com/html/53/n-3727153.html 侵刪
bash: mail: command not found的解決方法
yum -y install mailx
一、mail命令
1.配置
文件尾增加以下內容
from: 對方收到郵件時顯示的發件人
smtp: 指定第三方發送郵件的smtp服務器地址
smtp-auth: SMTP的認證方式。默認是LOGIN,也可改爲CRAM-MD5或PLAIN方式
smtp-auth-user: 第三方發郵件的用戶名
smtp-auth-password: 用戶名對應密碼
2.Mail命令
% mail --h
mail: illegal option -- -
Usage: mail -eiIUdEFntBDNHRV~ -T FILE -u USER -h hops -r address -s SUBJECT -a FILE -q FILE -f FILE -A ACCOUNT -b USERS -c USERS -S OPTION users
注:部分系統參數稍有差異,最好看幫助
1) 無郵件正文
% mail -s "測試" 1968089885@foxmail.com
2) 有郵件正文
- mail -s "主題" 收件地址< 文件(郵件正文.txt)
% mail -s "郵件主題" 1968089885@foxmail.com < /data/findyou.txt
- echo "郵件正文" | mail -s 郵件主題 收件地址
% echo "郵件正文內容" | mail -s "郵件主題" 1968089885@foxmail.com
- cat 郵件正文.txt | mail -s 郵件主題 收件地址
% cat /data/findyou.txt | mail -s "郵件主題" 1968089885@foxmail.com
3) 帶附件
- mail -s "主題" 收件地址 -a 附件 < 文件(郵件正文.txt)
% mail -s "郵件主題" 1968089885@foxmail.com -a /data/findyou.tar.gz < /data/findyou.txt
3.腳本
sendmail.sh
#!/bin/bash
#author:findyou
help(){
echo "eg: $0 [Subject] [address] [content_file] [file]"
echo ""
exit 1
}
if [ ! -n "$1" ] ; then
help
fi
cDate=`date +%Y%m%d`
if [ ! -n "$2" ] ; then
help
else
mail_to=$2
echo " Send Mail to ${mail_to}"
fi
if [ ! -n "$4" ] ; then
mail -s $1 ${mail_to}<$3
else
mail -s $1 -a $4 ${mail_to}<$3
fi
使用
[root@123]$ ./sendmail.sh test 1968089885@qq.com abc.txt
Send Mail to 1968089885@qq.com
[root@123]$
說明:建議直接使用命令 ,有腳本只是爲了在打印顯示相關信息,多此一舉。
轉自:https://www.cnblogs.com/findyou/p/5760970.html