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和寄信的相關指令工具:
若想知道更多有關於架設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
。
用以下指令來建立登入到其它SMTP伺服器時要使用的帳密清單檔案,路徑可以放在/etc/postfix/sasl_passwd
。
因為/etc/postfix/sasl_passwd
會包含密碼,所以只讓root
帳號有權限讀寫。
/etc/postfix/sasl_passwd
的內容格式如下:
SMTP伺服器1 電子郵件地址:密碼 SMTP伺服器2 電子郵件地址:密碼
以Gmail為例的話就是:
[smtp.gmail.com]:587 USER@gmail.com:PASSWORD
許多第三方電子郵件服務會提供兩步驟驗證機制,如果有開啟兩步驟驗證的話,Postfix就不能使用原本的電子郵件信箱密碼進行登入。以Gmail來說,它有提供應用程式密碼,可以針對某個應用程式來產生獨立的密碼,應利用這個功能替Postfix產生一組登入密碼來用。
製作好/etc/postfix/sasl_passwd
檔案後,接著用以下指令來產生資料庫:
產生出來的資料庫檔案權限當然也是只讓root
帳號有權限讀寫。
使用以下指令重啟Postfix來套用設定:
測試寄信
使用mail
來測試看看信件能否寄出吧!指令用法如下:
在輸入完郵件內容之後,按下Ctrl + d來送出。如果送不出去,可以先用Enter跳下一行,再按Ctrl + d。
如果收不到信,就要去查看Postfix的日誌(Log)。預設的Postfix的Log檔為/var/log/mail.log
和/var/log/mail.err
。