[教學] Mail Server 架設與設定指南-Postfix

開發功能有時會需要使用到寄信功能,如果非使用第三方個郵件伺服器 (例如 gmail),就會需要自己架設電子郵件 MTA 伺服器 (Mail Transfer Agent),古老的 MTA 有 Sendmail,但是 Sendmail 操作起來比較複雜一點,後來有了 Postfix 能夠更簡單的設定與使用,本篇文章將教學如何在 ubuntu 安裝與使用 postfix。

安裝 postfix

輸入指令安裝 postfix

sudo apt update
sudo DEBIAN_PRIORITY=low apt install postfix

安裝過程 (以下的設定都可以在 /etc/postfix/main.cf 中再做修改):

  • General type of mail configuration?: Internet Site

選擇 mail server 的基本設定,直接選擇 Internet Site

  • System mail name: mail.xenby.com

設定信箱伺服器名稱

  • Root and postmaster mail recipient: xenby

設定接收到 root@ 以及 postmaster@ 的信會轉給哪個 linux account,可以選一個自己主要的帳號

  • Other destinations to accept mail for: $myhostname, mail-demo.xenby.com, ubuntu-s-1vcpu-1gb-sgp1-01, localhost.localdomain, localhost

設定此伺服器會接收哪些 domain 的信並轉給 user

  • Force synchronous updates on mail queue?:No

這邊直接選擇 No

  • Local networks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

用於設定會處理哪些 IP 過來要幫忙遞送信的請求,如果有其他伺服器想要透過此 mail server 來寄信,可以一併加入

  • Mailbox size limit: 0

信箱空間上限 (0表示無上限)

  • Local address extension character: +

直接使用預設的 +

  • Internet protocols to use: all

要使用 ipv4 還是使用 ipv6,這邊可選擇 all 兩個都使用

設定 DNS 紀錄

安裝完了 postfix,還需要設定 DNS 紀錄,共有三個紀錄要設定,分別為 A、MS 以及 TXT (SPF) 紀錄

※ A 與 MS 是收信功能需要新增,TXT (SPF) 紀錄是寄信的功能需要新增

  • A 紀錄:用於設定 mail server 的IP,要指向 postfix server 的 IP

  • MX 紀錄:用於設定哪些網域的信要丟給哪個 mail server 處理,例如如果要將 mail.xenby.com 的信交由 mailer.xenby.com 處理,則設定 mail.xenby.com 指向 mailer.xenby.com 的紀錄

  • TXT (SPF) 紀錄:假如 postfix 有需要寄信的功能,需要設定此紀錄用來證明這個 IP 送出該 domain 的信是不是仿冒的,否則 gmail 或其他信箱伺服器可能會拒收該 IP 寄出的信

例如: mail server 159.65.129.16 會寄出 domain 為 mail.xenby.com 的信,那就需要設定一個 mail.xenby.com 的 TXT 紀錄,內容為 v=spf1 ip4:159.65.129.16 -all

postfix 一些檔案位置

主要設定檔位置:

/etc/postfix/main.cf

log 檔案位置:

/var/log/mail.err
/var/log/mail.log

修改使用的 port

postfix 預設使用的 port 是 25,而如果要更換成其他 port 可以在以下的設定檔中修改

/etc/postfix/master.cf

會看到一行如下的設定

smtp      inet  n       -       y       -       -       smtpd

假設要改成 8225 port 則將第一個 smtp 改成 8225

8225      inet  n       -       y       -       -       smtpd

這樣重新啟動 postfix 後就會變成使用 8225 port 了

設定 mailbox 儲存資料夾

預設收到的信件內容會放在 /var/mail/ 資料夾下面

而假如要換信件存放位置可以輸入以下指令

sudo postconf -e 'home_mailbox= Maildir/'

這樣信就會存到使用者家目錄的 Maildir 資料夾中了

設定收件者別名

sudo postconf -e 'virtual_alias_maps= hash:/etc/postfix/virtual'

可以設定哪些收信者的信會丟給哪個使用者,修改 /etc/postfix/virtual

sudo vim /etc/postfix/virtual

內容如下,表示 contact@mail.xenby.comadmin@mail.xenby.comcontact@localhostadmin@localhost 收信者的信會丟給使用者 xenby

contact@mail.xenby.com xenby
admin@mail.xenby.com xenby
contact@localhost xenby
admin@localhost xenby

重新讀取更新 postmap

sudo postmap /etc/postfix/virtual

重啟 postfix

sudo systemctl restart postfix

測試寄送郵件

使用 telnet 指令 與 TCP 的 port 25 進行 TCP 連線

telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mailer.xenby.com ESMTP Postfix (Ubuntu)

在 telnet 中輸入以下指令,來設定寄件者與收件者信箱:

mail from: 寄件者信箱
rcpt to: 收件者信箱

範例:

mail from: user1@demo-mail.xenby.com
rcpt to: xenby29512-demo@gmail.com

接著輸入 data 指令,開始寫信件內容,訊息結束時要使用獨立一行的 . 符號表示,最後輸入 quit 結束 telnet:

mail from: user1@demo-mail.xenby.com
250 2.1.0 Ok
rcpt to: xenby29512-demo@gmail.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
From: "user1" <user1@demo-mail.xenby.com>
To: "xenby29512 Demo" <xenby29512-demo@gmail.com>
Subject: Test sent mail from telnet
Hello, Xenby Server.
.
250 2.0.0 Ok: queued as 7DD773F27E
quit
221 2.0.0 Bye
Connection closed by foreign host.

然後就能去信箱看有沒有成功收到信件了

※ 如果送給 gamil 的 data 中沒有 From 的資料可能會收到類似如下的錯誤訊息

Our system has detected that this message is 550-5.7.1 not RFC 5322 compliant: 550-5.7.1 'From' header is missing. 550-5.7.1 To reduce the amount of spam sent to Gmail, this message has been 550-5.7.1 blocked. Please visit 550-5.7.1  https://support.google.com/mail/?p=RfcMessageNonCompliant 550 5.7.1 and review RFC 5322 specifications for more information.

查看 queue

輸入指令可以查看 queue 中未執行的信

postqueue -p

刪除 queue 中指定的信

postsuper -d mail_queue_id

清除 queue 中所有信

postsuper -d ALL