linux 發送外部郵件
原始鏈接
http://www.51xpage.com/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AE%A1%E7%90%86/2015/12/10/dao-ting-tu-shuo-linux-xi-lie-9-fa-song-wai-bu-you-jian
1、問題提出
希望通過腳本發送郵件,起因是zabbix裏面有個地方需要發郵件。而它在Web上提供的方式比較簡單,smtp服務器和helo啥啥啥的,在現在安全連接的時代,顯然是不夠的,可配置的項很少。好在它提供了另外一種方式,即采用腳本發送的方式。
2、嘗試過程
根據以往Domino的經驗,通常是一來就把sendmail幹掉了,發送郵件不能隨便一個服務器,馬上就被當垃圾郵件被拒信了,而且就算弄個MX記錄也麻煩,整個黑名單啥的。所以比較靠譜的方式,還是利用現有的服務器來發,註冊一個免費郵箱。
2.1、停止 sendmail 和postfix
service sendmail stop
chkconfig sendmail off
service postfix stop
chkconfig postfix off
2.2、使用mail/mailx發送郵件
通過
rpm -qa|grep mailx
命令可以看到系統是否安裝了mail。不過發現mail和mailx在centos 7下面是一樣的
見識了一下 echo命令,這大概就是Linux系列的強大之處吧,用echo就發郵件了。
echo -e "Email content" | mailx -v -s "Email subject" -S smtp-auth=login -S smtp=smtp.163.com -S from="[email protected](John Doe)" -S smtp-auth-user=test@163.com -S smtp-auth-password=passw0rd recipient@some.com
2.3、使用mail.rc
用上面的命令行確實可行,但是配置有點亂,所以還有個解決方案是把配置放到 mail.rc裏面去
# vim /etc/mail.rc
set from=test@163.com
set smtp=smtp.163.com
set smtp-auth-user=test
set smtp-auth-password=password
set smtp-auth=login
發送郵件的時候,使用
echo "內容" | mail -s " 標題" sendto@163.com
如果碰到需要多個smtp賬號就無法處理了,其實它還有另外一種做法。
accout 163 {
set from=test@163.com
set smtp=smtp.163.com
set smtp-auth-user=test
set smtp-auth-password=password
set smtp-auth=login
}
相應的,發送命令也需要做調整,如下
echo "內容" | mail -A 163 -s " 標題" sendto@163.com
即,這裏多了一個 -A 參數
2.4、發送smtps郵件
用上面的方法無法實現發送帶安全驗證的郵件。找到參考資料的裏面的老外的做法。
account exmail {
set ssl-verify=ignore
set nss-config-dir=~/.cert
set from=jenkins@yaomaitong.cn
set smtp=smtps://smtp.exmail.qq.com:465
set smtp-auth-user=username@qymail.com
set smtp-auth-password=s0m3p@zzW0rD
set smtp-auth=login
}
類似這樣的,但是會報錯,
#echo "內容" | mail -A exmail -v -s " 標題" [email protected]
Resolving host smtp.exmail.qq.com . . . done.
Connecting to 163.177.72.143:465 . . . connected.
Error initializing NSS: Unknown error -8015.
"/root/dead.letter" 11/300
. . . message not sent.
可以理解成是沒有證書文件,老外的做法是獲取生成證書文件。
- 生成證書
mkdir ~/.certs && certutil -N -d ~/.certs
1
|
這個時候會發現,下面生成了幾個key和cert文件
|
- 獲取qq郵箱證書
echo -n | openssl s_client -connect smtp.exmail.qq.com:465 | sed -ne ‘/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p‘ > ~/.certs/exmail.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/exmail.crt
這裏的 GeoTrust SSL CA,是打開 https://exmail.qq.com,然後點開看, exmail.qq.com 上一級證書的名字,實際測試發現,其實根本也沒關系
- 發送測試
#echo "內容" | mail -A exmail -v -s " 標題" [email protected]
Resolving host smtp.exmail.qq.com . . . done.
Connecting to 163.177.72.143:465 . . . connected.
Error in certificate: Peer‘s certificate issuer is not recognized.
Comparing DNS name: "mx3.qq.com"
Comparing DNS name: "mx2.qq.com"
Comparing DNS name: "mx1.qq.com"
Comparing DNS name: "mxbiz1.qq.com"
Comparing DNS name: "mxbiz2.qq.com"
Comparing DNS name: "imap.qq.com"
Comparing DNS name: "smtp.qq.com"
Comparing DNS name: "pop.exmail.qq.com"
Comparing DNS name: "imap.exmail.qq.com"
Comparing DNS name: "smtp.exmail.qq.com"
SSL parameters: cipher=RC4, keysize=128, secretkeysize=128,
issuer=CN=GeoTrust SSL CA - G2,O=GeoTrust Inc.,C=US
subject=CN=pop.qq.com,OU=R&D,O=Shenzhen Tencent Computer Systems Company Limited,L=Shenzhen,ST=Guangdong,C=CN
220 smtp.qq.com Esmtp QQ Mail Server
>>> EHLO iZ23458bi3lZ
250-smtp.qq.com
250-PIPELINING
250-SIZE 73400320
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
>>> AUTH LOGIN
334 xxxxxxx
>>> xxxxxxx
334 xxxxxxx
>>> xxxxxxx==
235 Authentication successful
>>> MAIL FROM:<[email protected]>
250 Ok
>>> RCPT TO:<[email protected]>
250 Ok
>>> DATA
354 End data with <CR><LF>.<CR><LF>
>>> .
250 Ok: queued as
>>> QUIT
221 Bye
3、最終方案
其實應該來講,用上面的方法就可以了。但是當時沒有配置成功,所以采用了另外的辦法。 找到一個裝了 firefox的電腦,把~/.mozilla/firefox/xxxxxxxx.default/ 的 cert.db 與 key.db 拷貝到 ~/.certs文件夾下。效果居然是一樣的。
4、幾個問題
因為是給zabbix用的,是一個單獨的nologin賬戶,但是測試的時候,是在root用戶下做的,通了,但是zabbix無法發郵件,後來發現問題出在 certs路徑上,它指向的是當前用戶的 .certs文件夾。 然後拷貝過來,發現另外一個問題,權限不對,zabbix沒有 r權限,都是root用戶的
Error in certificate: Peer’s certificate issuer is not recognized.
不加v參數會有這個問題
Error in certificate: Peer’s certificate issuer is not recognized.
5、參考資料
- 采用sendmail,基本不考慮 http://yyzll.blog.51cto.com/4283444/1541890
- 外國人的 https://coderwall.com/p/ez1x2w/send-mail-like-a-boss
- 發非smtps喲就http://coolnull.com/2614.html
- http://blog.sina.com.cn/s/blog_56ae1d5801019hlr.html
參數說明
-r 指定發件人
-c 指定抄送人
-b 指定密送人
-s 郵件主題
-V 顯示版本
-v 發送過程
多個收件人之間用逗號分隔
linux 發送外部郵件