iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 30
0
自我挑戰組

資訊技術解戈迪安繩結系列 第 29

IT|軟體|應用|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=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 登入和安全性的網頁中,選擇「應用程式密碼」。
https://ithelp.ithome.com.tw/upload/images/20180106/20107621SzjTAsvHb7.png
STEP 2
產生一個新的應用程式密碼,至於應用程式的名稱可以自己隨便取,例如「MyPi4 的 SSMTP」。
https://ithelp.ithome.com.tw/upload/images/20180106/20107621FdBiHY93KS.png
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

上一篇
IT|軟體|開發|Android Studio
系列文
資訊技術解戈迪安繩結29

1 則留言

0
shnovaj30101
iT邦新手 5 級 ‧ 2018-12-07 16:52:03

你好
我想要問一個關於ssmtp的問題
我想要可以在我的script可以下類似echo "This is a test" | ssmtp recipient@your.domain.com來寄信
但我不想把所有script系統的通知全部都寄到gmail

我發現我設定完ssmtp.conf之後可以用指令寄信
但我發現所有系統的通知原本會寄到/var/mail/[我的帳號],現在全部都灌到我的gmail裏面?

我要留言

立即登入留言