在Ubuntu 18.04、16.04、20.04上為多個域設置Postfix僅發送SMTP服務器

在本文中,我將向您展示如何在Ubuntu 20.04、18.04、16.04上將Postfix設置為僅發送SMTP服務器。 我將首先向您展示如何針對單個域執行此操作,然後根據需要將步驟應用於多個域。

用例

您有一個網站/ Web應用程序,需要將交易電子郵件發送給用戶(例如密碼重置電子郵件)。 最有可能的是,用戶無需回復這些電子郵件,或者如果他們回復了,則回複電子郵件將發送到您的專用郵件服務器。 在這種情況下,您可以使用流行的SMTP服務器軟件Postfix在Web服務器上設置僅發送SMTP服務器。

先決條件

為了從您的服務器發送電子郵件,必須打開端口25(出站)。 許多ISP和託管公司(例如DigitalOcean)阻止端口25來控制垃圾郵件。 我建議使用Hostwinds,因為它不會阻塞端口25(出站)。 擁有Hostwinds服務器後,在其上安裝Ubuntu並按照以下說明進行操作。

實際上,為多個域設置Postfix僅發送SMTP服務器並不困難。 首先,我們需要為一個域配置它,然後為多個域設置它。

步驟1:設置主機名和PTR記錄

默認情況下,Postfix在與其他SMTP服務器通信時使用服務器的主機名來標識自己。 如果您的主機名無效,某些SMTP服務器將拒絕您的電子郵件。 您應按如下所示設置標準域名(FQDN)。

sudo hostnamectl set-hostname www.linuxbabe.com

要檢查服務器的主機名,請運行

hostname -f

您需要註銷並重新登錄,以在命令提示符下查看主機名更改。 該主機名應具有指向服務器IP地址的DNS A記錄。

另外,您需要設置一個PTR記錄(又名指針記錄),該記錄將IP地址映射到FQDN。 它是A記錄的對應項。 如果您服務器的IP地址沒有PTR記錄,許多SMTP服務器將拒絕您的電子郵件。

因為您是從託管服務提供商或ISP獲取IP地址,而不是從域名註冊商獲取IP地址,所以必須在託管服務提供商的控制面板中為IP設置PTR記錄,或者詢問您的ISP。 例如,在Hostwinds中,您可以通過點擊 Domains 標籤,然後點擊 Manage rDNS 鏈接。 儘管可以將PTR記錄設置為任何主機名,但為了最佳實踐,您應該使用剛剛設置的FQDN。

要查看您的PTR記錄是否設置正確,請運行以下命令。 用您自己的IP地址替換12.34.56.78。

host 12.34.56.78

請注意,如果您的服務器使用IPv6地址,則最好為FQDN添加AAAA記錄,並為IPv6地址設置PTR記錄。

步驟2:在Ubuntu上安裝Postfix

運行以下命令從默認的Ubuntu存儲庫安裝Postfix。

sudo apt-get update

sudo apt-get install postfix -y

系統將要求您選擇郵件服務器配置類型。 按Tab鍵,然後按Enter。

在下一個屏幕中,按Enter鍵選擇默認選項: Internet Site

postfix僅發送ubuntu

接下來,輸入系統郵件名稱的域名,即@符號後的域名。

後綴僅發送多個域

步驟3:在Postfix中禁用接收電子郵件

默認情況下,Postfix SMTP服務器在計算機上的所有活動接口上進行偵聽。 由於Postfix SMTP服務器僅用於向用戶發送事務性電子郵件,因此我們可以使它僅在本地主機上偵聽,因此不良行為者無法向其發送垃圾郵件。

編輯Postfix主配置文件。

sudo nano /etc/postfix/main.cf

找到以下行。

inet_interfaces = all

更改為:

inet_interfaces = loopback-only

保存並關閉文件。 重新啟動Postfix,以使更改生效。

sudo systemctl restart postfix

步驟4:安裝和配置OpenDKIM

DKIM代表DomainKeys Identified Mail。 您可以在服務器上安裝OpenDKIM,並使用它使用私鑰將簽名添加到從您的域發送的電子郵件中。 接收SMTP服務器使用您在DNS中發布的相應公鑰來驗證簽名。 如果您希望電子郵件進入收件人的收件箱,則必須添加DKIM簽名。

首先從默認的Ubuntu存儲庫安裝OpenDKIM。

sudo apt-get install opendkim opendkim-tools

然後加 postfix 用戶 opendkim 組。

sudo adduser postfix opendkim

編輯OpenDKIM主配置文件。

sudo nano /etc/opendkim.conf

找到以下幾行。

#Canonicalization     simple
#Mode                 sv
#SubDomains           no

取消注釋並更換 simplerelaxed/simple。 從改變模式 svs,因為沒有入站電子郵件來驗證簽名。

Canonicalization     relaxed/simple
Mode                 s
SubDomains           no

在此文件的末尾添加以下行。 (在Ubuntu 18.04上,用戶ID已設置為 opendkim

#OpenDKIM user
# Remember to add user postfix to group opendkim
UserID             opendkim

# Map domains in From addresses to keys used to sign messages
KeyTable           refile:/etc/opendkim/key.table
SigningTable       refile:/etc/opendkim/signing.table

# A set of internal hosts whose mail should be signed
InternalHosts       /etc/opendkim/trusted.hosts

保存並關閉文件。

創建簽名表,密鑰表和可信主機文件

為OpenDKIM創建目錄結構。

sudo mkdir /etc/opendkim

sudo mkdir /etc/opendkim/keys

更改所有者 rootopendkim 並確保只 opendkim 用戶可以讀寫密鑰目錄。

sudo chown -R opendkim:opendkim /etc/opendkim

sudo chmod go-rw /etc/opendkim/keys

創建簽名表。

sudo nano /etc/opendkim/signing.table

將以下行添加到文件中。 這意味着,如果 From: 電子郵件中的標題包含 example.com,然後使用 sendonly DKIM選擇器。 你可以改變 sendonly 首選DKIM選擇器名稱,並且在DNS中應該是唯一的。

*@example.com     sendonly._domainkey.example.com

保存並關閉文件。 然後創建密鑰表。

sudo nano /etc/opendkim/key.table

添加以下行。 這意味着對於sendonly DKIM選擇器,請使用保存在 /etc/opendkim/keys/example.com/sendonly.private 簽署電子郵件。

sendonly._domainkey.example.com    example.com:sendonly:/etc/opendkim/keys/example.com/sendonly.private

保存並關閉文件。 接下來,創建受信任的主機文件。

sudo nano /etc/opendkim/trusted.hosts

將以下行添加到新創建的文件中。

127.0.0.1
localhost

*.example.com

以上意味着來自上述IP地址和域的消息將被信任和簽名。

生成私鑰/公鑰對

我們需要生成一個私鑰來簽署外發電子郵件,並生成一個公鑰來接收SMTP服務器以驗證DKIM簽名。 公鑰將在DNS中發布。

為域創建一個單獨的文件夾。

sudo mkdir /etc/opendkim/keys/example.com

使用生成密鑰 opendkim-genkey 工具。

sudo opendkim-genkey -b 2048 -d example.com -D /etc/opendkim/keys/example.com -s sendonly -v

上面的命令將創建2048位密鑰。 -d (domain) 指定域。 -D (directory) 指定將存儲密鑰的目錄,我們使用 sendonly 作為 selector (-s)。 執行命令後,私鑰將保存在 sendonly.privatesendonly.txt 將是包含公鑰的TXT記錄。

使 opendkim 作為私鑰的所有者。

sudo chown opendkim:opendkim /etc/opendkim/keys/example.com/sendonly.private

在DNS記錄中添加公鑰

顯示公鑰

sudo cat /etc/opendkim/keys/example.com/sendonly.txt

後面的字符串 p 參數是公鑰。 在您的DNS管理器中,為第二個域創建TXT記錄。 輸入 sendonly._domainkey 在名稱字段中。 複製括號中的所有內容並將其粘貼到value字段中。 刪除所有雙引號。 (您可以先將其粘貼到文本編輯器中,刪除所有雙引號,然後將其複製到DNS管理器中。DNS管理器可能會要求您刪除其他無效字符,例如回車。)

後綴僅發送DKIM

DNS記錄發布後,在Ubuntu服務器上輸入以下命令以測試密鑰。

sudo opendkim-testkey -d example.com -s sendonly -vvv

如果一切正常,您會看到

key OK

如果你看到 key not secure 消息,不要驚慌。 這是因為未在您的域名上啟用DNSSEC。

步驟5:將Postfix與OpenDKIM連接

Postfix可以通過Unix套接字文件與OpenDKIM對話。 OpenDKIM使用的默認套接字文件是 /var/run/opendkim/opendkim.sock,如圖所示 /etc/opendkim.conf 文件。 但是Ubuntu隨附的postfix SMTP守護程序在chroot監獄中運行,這意味着SMTP守護程序解析相對於Postfix隊列目錄的所有文件名(/var/spool/postfix)。 因此,我們需要更改套接字文件。

編輯OpenDKIM主配置文件。

sudo nano /etc/opendkim.conf

找到以下行:

Socket local:/var/run/opendkim/opendkim.sock

將其替換為以下行。 (如果找不到上面的行,請添加下面的行。)

Socket local:/var/spool/postfix/opendkim/opendkim.sock

創建一個目錄來保存OpenDKIM套接字文件,並僅允許opendkim用戶和postfix組訪問它。

sudo mkdir /var/spool/postfix/opendkim

sudo chown opendkim:postfix /var/spool/postfix/opendkim

如果可以在下面找到以下行 /etc/default/opendkim 文件。

SOCKET="local:/var/run/opendkim/opendkim.sock"

要麼

SOCKET=local:$RUNDIR/opendkim.sock

更改為

SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"

之後,我們需要編輯Postfix主要配置文件。

sudo nano /etc/postfix/main.cf

在此文件的末尾添加以下行以將Postfix與OpenDKIM連接。

# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

保存並關閉文件。 重新啟動OpenDKIM和Postfix。

sudo systemctl restart opendkim postfix

如果重新啟動失敗,OpenDKIM將不會產生任何消息。 運行以下命令以檢查其狀態。 確保它正在運行。

systemctl status opendkim

步驟6:創建SPF DNS記錄

防晒指數 (發件人策略框架)記錄指定允許哪些主機或IP地址代表域發送電子郵件。 在您的DNS管理界面中,創建一個新的TXT記錄,如下所示。 使用您自己的服務器的IPv4地址和IPv6地址。

TXT  @   v=spf1 mx ip4:12.34.56.78 ip6:2600:3c01::f03c:93d8:f2c6:78ad ~all

步驟7:設置發件人地址,發件人姓名和返迴路徑

您可以在網站/ Web應用程序中設置自定義發件人地址,發件人名稱和返迴路徑。 讓我們以WordPress為例。 您可以在WordPress主題的 functions.php 文件以覆蓋默認的發件人地址,發件人名稱和返迴路徑。 根據需要替換紅色文本。

// Function to change From email address
function wpb_sender_email( $original_email_address ) {
    return '[email protected]';
}

// Function to change sender name
function wpb_sender_name( $original_email_from ) {
    return 'LinuxBabe';
}

// Set return-path the same as From address
function fix_my_email_return_path( $phpmailer ) {
    $phpmailer->Sender = $phpmailer->From;
}

// Hooking up our functions to WordPress filters
add_filter( 'wp_mail_from', 'wpb_sender_email' );
add_filter( 'wp_mail_from_name', 'wpb_sender_name' );
add_action( 'phpmailer_init', 'fix_my_email_return_path' );

保存文件,您就完成了。

步驟8:為外發電子郵件啟用TLS加密

默認情況下,Postfix在發送外發電子郵件時不使用TLS加密。 要啟用TLS加密,請打開 /etc/postfix/main.cf 文件,並在此文件末尾添加以下兩行。

smtp_tls_security_level = may
smtp_tls_loglevel = 1

第一行為Postfix SMTP客戶端啟用TLS加密。 第二行將TLS連接記錄在 /var/log/mail.log 文件,以便您可以檢查TLS加密是否正常工作。 保存並關閉文件。 重新啟動Postfix,以使更改生效。

sudo systemctl restart postfix

由於Postfix不接收傳入的電子郵件,因此無需為Postfix SMTP守護程序配置有效的TLS證書。

步驟9:測試寄件者分數

現在去 https://www.mail-tester.com。 您將看到一個唯一的電子郵件地址。 從您的Postfix SMTP服務器上的網站向該地址發送電子郵件,然後檢查您的分數。 如您所見,我得到了滿分。 在測試結果中,您應該檢查您的PTR記錄,SPF和DKIM記錄是否有效。

電子郵件服務器信譽不佳dkim

您也可以打開 /var/log/mail.log 文件以檢查是否使用TLS加密。 例如,以下行顯示到mail-tester.com的連接已加密。

Anonymous TLS connection established to mail-tester.com[94.23.206.89]:25: TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)

如果您的電子郵件仍然被標記為垃圾郵件怎麼辦?

在本文中,我為您提供了有關電子郵件可傳遞性的更多提示:如何停止將電子郵件標記為垃圾郵件。 儘管這將花費一些時間和精力,但在應用了這些提示後,您的電子郵件最終將被放置在收件箱中。

如何為多個域配置Postfix僅發送SMTP服務器

默認情況下,Postfix允許您使用From頭中的任何域名並返迴路徑地址來發送外發電子郵件。 如果您的服務器託管多個網站,則只需為其他域創建SPF DNS記錄(這很容易做到),然後為其他域配置OpenDKIM。

要為其他域配置OpenDKIM,您需要在簽名表,密鑰表和可信主機文件中添加其他域,如下所示。

簽名表:

*@example.com       sendonly._domainkey.example.com
*@example.net       sendonly._domainkey.example.net

密鑰表:

sendonly._domainkey.example.com     example.com:sendonly:/etc/opendkim/keys/example.com/sendonly.private
sendonly._domainkey.example.net     example.net:sendonly:/etc/opendkim/keys/example.net/sendonly.private

受信任的主機:

127.0.0.1
localhost

*.example.com
*.example.net

然後,按照與上述其他域相同的步驟生成DKIM專用/公用密鑰對,並在DNS中添加DKIM公用密鑰。 重新啟動OpenDKIM,您就完成了。 不要忘記測試您的發件人分數。

故障排除

如果您的消息未簽名並且DKIM檢查失敗,則可能要檢查後綴日誌(/var/log/mail.log),看看您的配置有什麼問題。 如果您在郵件日誌中看到以下消息,

warning: connect to Milter service local:opendkim/opendkim.sock: No such file or directory

您可能要檢查 opendkim systemd服務實際上正在運行。

systemctl status opendkim

如果opendkim正在運行,並且仍然出現上述錯誤,則可能需要更改 smtpd_milters = local:opendkim/opendkim.socksmtpd_milters = local:/opendkim/opendkim.sock 在/etc/postfix/main.cf文件中。

發送批量或批量電子郵件

您可以使用此SMTP服務器發送批量或批量電子郵件嗎?

是的,但是您應該僅向合法訂閱者發送批量電子郵件,也就是說,收件人應該已經註冊了您的郵件列表。 絕對不要發送垃圾郵件(未經請求的批量電子郵件),否則SMTP服務器肯定會被列入黑名單。 在發送批量電子郵件之前,我強烈建議您遵循本文中的建議:如何停止將您的電子郵件標記為垃圾郵件。

結論

我希望本教程可以幫助您在Ubuntu上為多個域設置Postfix僅發送SMTP服務器。 與往常一樣,如果您發現這篇文章很有用,請訂閱我們的免費新聞通訊以獲取更多提示和技巧。 保重🙂

Sidebar