1. 程式人生 > >linux 發送外部郵件

linux 發送外部郵件

AD 郵箱 時代 OS ignore AI queue cti 理解

原始鏈接

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
這個時候會發現,下面生成了幾個keycert文件
  • 獲取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 發送外部郵件