CentOS7 配置Mailx使用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-user=user@xxx.com     # 這里輸入郵箱賬號
set smtp-auth-password=password     # 這里填入密碼
set ssl-verify=ignore               # 忽略證書警告
set nss-config-dir=/etc/pki/nssdb   # 證書所在目錄
set from=user@xxx.com               # 設置發信人郵箱和昵稱
#set smtp-use-starttls=yes          # STARTTLS時使用
注意事項:      
       如果是465端口,需要加上smtps://協議;如果是587端口,不需要加smtps://或者寫smtp://;
如果使用587端口通訊,應當顯示設置smtp-use-starttls;
       郵件的來源應當與郵箱相同,或者將發信人姓名寫在郵箱后的括號中。例如:set from=user@xxxx.com或set from=user@xxx.com;如果郵箱與認證的不一致,將出現“smtp-server: 553 Mail from must equal authorized user”的錯誤;
  有些郵件服務器的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-user=user@126.com
set smtp-auth-password=password
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb
set from=password@126.com
}
# QQ郵箱支持STARTTLS,使用587端口
account qq {
set smtp=smtp://smtp.qq.com:587
set smtp-auth=login
set smtp-auth-user=user@qq.com
set smtp-auth-password=password
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb
set from="user@qq.com"
set smtp-use-starttls=yes
}

配置文件中定義了兩個賬戶,發送郵件時可用-A參數指定發信賬戶:

echo 'mail test for 126' | mail -A 126 -s 'mail test' user@xxx.com
echo 'mail test for qq' | mail -A qq -s 'mail test' user@xxx.com

除了配置文件,也可以在命令行中用-S參數進行設置。例如:

echo 'mail test for command line option' | mail -s 'mail test' -S smtp=smtp://smtp.qq.com:587 -S smtp-auth=login -S smtp-auth-user=user@qq.com -S smtp-auth-password=password -S ssl-verify=ignore -S nss-config-dir=/etc/pki/nssdb -S from="user@qq.com(nickname)" -S smtp-use-starttls=yes user@xxx.com

這種方法比較繁瑣,就是將配置文件的每一行都作為選項寫在命令中。在程序中調用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,,",實踐中發現使用該標簽仍會報錯。

使用"P"標簽完美解決,再發郵件就沒有報錯了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM