簡介
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=ntausr4@gmail.com
# 使用 GMail 的 MTA 送信
mailhub=smtp.gmail.com:587
# 設定 hostname
hostname=raspberrypi
# 允許使用者設定 Email 的 From 欄位
FromLineOverride=YES
# Google 帳號與密碼
AuthUser=YOUR_GOOGLE_ACCOUNT
AuthPass=YOUR_PASSWORD
# 啟用安全加密連線
UseSTARTTLS=YES
UseTLS=YES
# 輸出除錯資訊
Debug=YES
設定完成後,就可以立即使用了,下面這行指令是使用 ssmtp 送信的範例:echo "This is a test" | ssmtp recipient@your.domain.com
Google 兩步驟驗證
如果您的 Google 帳戶有啟用兩步驟驗證登入,那麼在使用一般的 Google 帳號與密碼送信時,可能就會產生類似這樣的錯誤訊息:
pi@MyPi4:/var/lib/motion $ echo "This is a test" | ssmtp ntausr4@gmail.com
ssmtp: Authorization failed (534 5.7.14 https://support.google.com/mail/answer/78754 d8sm2094871pfh.159 - gsmtp)
造成這個問題的原因是 SSMTP 沒有支援兩步驟驗證,解決的方式是改用 Google 應用程式專用的密碼來登入,以下是處理的步驟。
STEP 1
在 Google 登入和安全性的網頁中,選擇「應用程式密碼」。
STEP 2
產生一個新的應用程式密碼,至於應用程式的名稱可以自己隨便取,例如「MyPi4 的 SSMTP」。
STEP 3
複製新的應用程式密碼,總共 16 碼。
把 SSMTP 設定檔 /etc/ssmtp/ssmtp.conf中的 Google 密碼替換成這組應用程式密碼,其餘設定不變:
# Google 帳號與應用程式密碼
AuthUser=帳號
AuthPass=密碼
加強 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 中最常見的送信方式就是使用 mail 指令寄送電子郵件
smtp 指令的用法也跟 mail 類似:echo "這是信件內容。" | ssmtp recipient@your.domain.com
我們也可以將郵件的內容儲存在檔案中,再用 ssmtp 寄送。假設 mail.txt 的內容:
To: recipient@your.domain.com
From: your_account@gmail.com
Subject: 測試信件
這是信件內容。
K. L. Chu
以 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
你好
我想要問一個關於ssmtp的問題
我想要可以在我的script可以下類似echo "This is a test" | ssmtp recipient@your.domain.com來寄信
但我不想把所有script系統的通知全部都寄到gmail
我發現我設定完ssmtp.conf之後可以用指令寄信
但我發現所有系統的通知原本會寄到/var/mail/[我的帳號],現在全部都灌到我的gmail裏面?