Linux 使用 SSMTP 與 GMail 以指令或程式自動寄信教學

這裡以樹莓派的 Linux 環境為例,介紹如何使用 SSMTP 與 GMail 配合指令或程式自動寄信。

SSMTP 是一個專門用於送信的系統小工具,它的角色類似 sendmail,可透過標準輸入接收郵件資料,並且同步將郵件傳送至指定 MTA,進行電子郵件的遞送動作,而在結合 GMail 這類正式的 MTA 之後,就可以輕鬆讓 mail 這類 Linux 標準的 MUA 具備發信的能力。


對於樹莓派的物聯網應用來說,通常會需要透過電子郵件發送資料,但是鮮少有收信的需求,所以使用 SSMTP 這樣輕量級的發信系統配合外部的 MTA 會是一得很好的選擇,以下是在樹莓派上設定 SSMTP 與 GMail MTA 的步驟教學。

安裝與設定 SSMTP

使用 apt 安裝 ssmtpmailutils 套件:

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 登入和安全性的網頁中,選擇「應用程式密碼」。

Google 登入和安全性

Step 2
產生一個新的應用程式密碼,至於應用程式的名稱可以自己隨便取,例如「Raspberry Pi 的 SSMTP」。

Google 應用程式密碼

Step 3
複製新的應用程式密碼,總共 16 碼。

Google 應用程式密碼

把 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 Wikiubuntu documentationStackOverflowIQ JAR

Linux, 樹莓派

6 留言

  1. 黃聖軒

    請問ssmtp中的
    AuthUser是要自己加上去嗎?

    • G. T. Wang

      沒有的話,就自己加。

  2. wei

    他出現Process exited with a non-zero status這行是甚麼意思呢?~

  3. 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)
    但一路都發不出郵件,是什麼問題呢?真的想請教一下,謝謝。

  4. Gary

    我也出現同樣問題,可指點一下嗎? 我在用pi zero w. 謝謝

  5. TIM

    我都有安裝完了但是
    echo “This is a test” | ssmtp recipient@your.domain.com
    打這個指令的時候發生了這個請問是甚麼問題
    ssmtp: Cannot open mailhub:25

Comments are Closed