Linux上的許多程式都會有寄信的功能,像是用來撰寫網站後端程式的PHP程式語言,它的mail函數背後就是透過Linux的sendmail指令來實現的。有些腳本也會提供寄信通知管理員的功能,同樣會使用到sendmail指令。但是在預設的情況下,Linux發行版的sendmail指令是不能正常使用的,並不能成功將信件寄出,還得在本地端架設郵件伺服器才行。不過要自己架設一個完整的郵件伺服器不是一件簡單的事情,除了自己的電腦IP必須要對外開放之外,還需要擁有一個網域名稱。還好我們的需求只是要寄信而已,可以直接將要寄出的信件轉交給第三方的電子郵件服務(例如Gmail、Outlook)來幫我們寄出即可,這個第三方的電子郵件服務所提供的功能就是中繼(relay)。



架設 MTA (Mail Transfer Agent) 伺服器──Postfix

sendmail指令來源於Sendmail這個古早的郵件伺服器軟體,之後出現的常見的郵件伺服器軟體都有支援同樣的sendmail指令,以相容於原本就支援使用sendmail指令來發送信件的程式。在本篇文章中選用Postfix作為MTA,基於Debian的Linux發行版可以使用以下指令來安裝Postfix和寄信的相關指令工具:

sudo apt install postfix mailutils

若想知道更多有關於架設Postfix郵件伺服器的說明可以參考以下這篇文章:

設定 Postfix

Postfix的主設定檔為/etc/postfix/main.cf,我們要修改這個檔案裡的一些設定欄位,如下:

smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous, noplaintext
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協定)用來傳送電子郵件,SASL(Simple Authentication and Security Layer,簡單驗證與安全層)是SMTP用來進行身份驗證的機制。

smtp_sasl_auth_enable設為yes表示當Postfix作為SMTP的客戶端時,要啟用SASL,預設是no

smtp_sasl_security_options是設定當Postfix作為SMTP的客戶端時,如果沒有透過TLS(Transport Layer Security,傳輸層安全協議)連線到SMTP伺服器要使用的驗證機制。noanonymous就是使用非匿名驗證,驗證的帳密會寫在smtp_sasl_password_maps設定欄位所指定的檔案內。noplaintext是不要用明碼來傳送密碼。

smtp_sasl_tls_security_options是設定當Postfix作為SMTP的客戶端時,如果有透用TLS連線到SMTP伺服器要使用的驗證機制。

smtp_sasl_password_maps欄位設定為hash:/etc/postfix/sasl_passwd,表示要使用/etc/postfix/sasl_passwd.db檔案作為登入到其它SMTP伺服器時要使用的帳密資料庫。檔案路徑不必加上.db,它會自動加,不能自己加上。

再來還要設定relayhost欄位,填入您要使用的第三方電子郵件服務的SMTP位址和連接埠。像是Gmail,就要填入[smtp.gmail.com]:587

linux-sendmail

用以下指令來建立登入到其它SMTP伺服器時要使用的帳密清單檔案,路徑可以放在/etc/postfix/sasl_passwd

sudo touch /etc/postfix/sasl_passwd && sudo chmod 600 /etc/postfix/sasl_passwd

linux-sendmail

因為/etc/postfix/sasl_passwd會包含密碼,所以只讓root帳號有權限讀寫。

/etc/postfix/sasl_passwd的內容格式如下:

SMTP伺服器1 電子郵件地址:密碼
SMTP伺服器2 電子郵件地址:密碼

以Gmail為例的話就是:

[smtp.gmail.com]:587 USER@gmail.com:PASSWORD

linux-sendmail

許多第三方電子郵件服務會提供兩步驟驗證機制,如果有開啟兩步驟驗證的話,Postfix就不能使用原本的電子郵件信箱密碼進行登入。以Gmail來說,它有提供應用程式密碼,可以針對某個應用程式來產生獨立的密碼,應利用這個功能替Postfix產生一組登入密碼來用。

製作好/etc/postfix/sasl_passwd檔案後,接著用以下指令來產生資料庫:

sudo postmap /etc/postfix/sasl_passwd && sudo chmod 600 /etc/postfix/sasl_passwd.db

linux-sendmail

產生出來的資料庫檔案權限當然也是只讓root帳號有權限讀寫。

使用以下指令重啟Postfix來套用設定:

sudo postfix reload

linux-sendmail

測試寄信

使用mail來測試看看信件能否寄出吧!指令用法如下:

mail 電子郵件地址

在輸入完郵件內容之後,按下Ctrl + d來送出。如果送不出去,可以先用Enter跳下一行,再按Ctrl + d

linux-sendmail

如果收不到信,就要去查看Postfix的日誌(Log)。預設的Postfix的Log檔為/var/log/mail.log/var/log/mail.err