這裡以樹莓派的 Linux 環境為例,介紹如何使用 SSMTP 與 GMail 配合指令或程式自動寄信。
SSMTP 是一個專門用於送信的系統小工具,它的角色類似 sendmail
,可透過標準輸入接收郵件資料,並且同步將郵件傳送至指定 MTA,進行電子郵件的遞送動作,而在結合 GMail 這類正式的 MTA 之後,就可以輕鬆讓 mail
這類 Linux 標準的 MUA 具備發信的能力。
對於樹莓派的物聯網應用來說,通常會需要透過電子郵件發送資料,但是鮮少有收信的需求,所以使用 SSMTP 這樣輕量級的發信系統配合外部的 MTA 會是一得很好的選擇,以下是在樹莓派上設定 SSMTP 與 GMail MTA 的步驟教學。
安裝與設定 SSMTP
使用 apt 安裝 ssmtp
與 mailutils
套件:
sudo apt-get install ssmtp mailutils
接著要設定 SSMTP 的設定檔,更改之前先將預設的 SSMTP 設定檔備份起來:
sudo cp /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf.default
編輯 SSMTP 設定檔 /etc/ssmtp/ssmtp.conf
:
# 接收系統郵件的 Email root=guozhao.wang@gmail.com # 使用 GMail 的 MTA 送信 mailhub=smtp.gmail.com:587 # 設定 hostname hostname=raspberrypi # 允許使用者設定 Email 的 From 欄位 FromLineOverride=YES # Google 帳號與密碼 AuthUser=guozhao.wang@gmail.com AuthPass=YOUR_PASSWORD # 啟用安全加密連線 UseSTARTTLS=YES UseTLS=YES # 輸出除錯資訊 Debug=YES
設定完成後,就可以立即使用了,下面這行指令是使用 ssmtp
送信的範例:
echo "This is a test" | ssmtp recipient@your.domain.com
Google 兩步驟驗證
如果您的 Google 帳戶有啟用兩步驟驗證登入,那麼在使用一般的 Google 帳號與密碼送信時,可能就會產生類似這樣的錯誤訊息:
ssmtp: Authorization failed (534 5.7.9 https://support.google.com/mail/?p=InvalidSecondFactor n17sm64719796pfg.80 - gsmtp)
造成這個問題的原因是 SSMTP 沒有支援兩步驟驗證,解決的方式是改用 Google 應用程式專用的密碼來登入,以下是處理的步驟。
Step 1
在 Google 登入和安全性的網頁中,選擇「應用程式密碼」。
Step 2
產生一個新的應用程式密碼,至於應用程式的名稱可以自己隨便取,例如「Raspberry Pi 的 SSMTP」。
Step 3
複製新的應用程式密碼,總共 16 碼。
把 SSMTP 設定檔 /etc/ssmtp/ssmtp.conf
中的 Google 密碼替換成這組應用程式密碼,其餘設定不變:
# Google 帳號與應用程式密碼
AuthUser=guozhao.wang@gmail.com
AuthPass=oigoaujaketickhu
這樣一來在以 Google 帳號登入認證時,就可以不需要兩步驟驗證的程序了。
加強 SSMTP 設定檔安全性
由於在 SSMTP 的設定檔中有自己的 Google 帳號與密碼,而這個設定檔的檔案權限是容許所有人觀看的,在安全性上會有比較大的問題,我們可以將這個設定檔設定為只有 ssmtp
送信程式可以讀取,這樣可以保護 Google 的帳號與密碼不會外洩。
首先新增 ssmtp
群組:
sudo groupadd ssmtp
將 SSMTP 的設定檔以及 /usr/sbin/ssmtp
這個執行檔的群組改為 ssmtp
群組:
sudo chown :ssmtp /etc/ssmtp/ssmtp.conf sudo chown :ssmtp /usr/sbin/ssmtp
將 SSMTP 的設定檔權限設定為只有群組以上可以讀取,一般使用者無法讀取:
sudo chmod 640 /etc/ssmtp/ssmtp.conf
最後設定讓 /usr/sbin/ssmtp
這個執行檔有 SGID 權限,讓它在執行時可以取的 ssmtp
的權限,以讀取 /etc/ssmtp/ssmtp.conf
的檔案內容:
sudo chmod g+s /usr/sbin/ssmtp
各種寄信指令
這裡補充幾種在 Linux 命令列中送信的指令範例。
在 Linux 中最常見的送信方式就是使用 mail
指令寄送電子郵件:
echo "這是信件內容。" | mail -s "測試信件" recipient@your.domain.com
ssmtp
指令的用法也跟 mail
類似:
echo "這是信件內容。" | ssmtp recipient@your.domain.com
我們也可以將郵件的內容儲存在檔案中,再用 ssmtp
寄送。假設 mail.txt
的內容:
To: recipient@your.domain.com From: your_account@gmail.com Subject: 測試信件 這是信件內容。 G. T. Wang
以 ssmtp
寄送 Email:
ssmtp recipient@your.domain.com < mail.txt
若要寄送檔案,可以使用 mpack
:
sudo apt-get install mpack mpack -s "Test File" file.txt recipient@your.domain.com
參考資料:Arch Linux Wiki、ubuntu documentation、StackOverflow、IQ JAR
黃聖軒
請問ssmtp中的
AuthUser是要自己加上去嗎?
G. T. Wang
沒有的話,就自己加。
wei
他出現Process exited with a non-zero status這行是甚麼意思呢?~
Man
請問使用 echo “這是信件內容。” | mail -s “測試信件” recipient@your.domain.com 時出現 mail: cannot send message: Process exited with a non-zero status
還有使用echo “這是信件內容。” | ssmtp recipient@your.domain.com 時只出現ssmtp: (raspberrypi)
但一路都發不出郵件,是什麼問題呢?真的想請教一下,謝謝。
Gary
我也出現同樣問題,可指點一下嗎? 我在用pi zero w. 謝謝
TIM
我都有安裝完了但是
echo “This is a test” | ssmtp recipient@your.domain.com
打這個指令的時候發生了這個請問是甚麼問題
ssmtp: Cannot open mailhub:25