Debian郵件系統(tǒng)提供了用戶和服務(wù)器之間通信的基礎(chǔ),現(xiàn)代的郵件服務(wù)限制了用戶可以發(fā)送和接收的信息量,同時也對服務(wù)器的性能提出了更高的要求。常用的郵件傳輸代理有exim4和postfix。本篇教程主要介紹消費者級互聯(lián)網(wǎng)連接的典型的移動工作站。
一、電子郵件基礎(chǔ)
電子郵件由三個部分組成,消息的信封,郵件頭及郵件正文。
- SMTP 用電子郵件信封上的 “To” 和 “From” 信息來投遞郵件;(信封上的 “From” 信息也被叫做退回地址, 例如 From_ 等等)
- 電子郵件頭的”To” 和 “From” 信息,顯示在 電子郵件客戶端上;(在大部分情況下,這些信息是跟電子郵件信封一致,但并不全是這樣。)
- 覆蓋郵件頭和正文數(shù)據(jù)的電子郵件消息格式被 多用途互聯(lián)網(wǎng)郵件擴(kuò)展 (MIME) 擴(kuò)展,從純文本的 ASCII 到其它字符編碼,包括作為附件的音頻、視頻、圖像和應(yīng)用程序。
功能全面的基于 電子郵件客戶端的 GUI 程序使用基于 GUI 的直觀的配置,提供下列所有功能。
- 為了處理正文數(shù)據(jù)類型及其編碼,它創(chuàng)建和使用多用途互聯(lián)網(wǎng)郵件擴(kuò)展 (MIME)來解釋郵件標(biāo)頭和郵件正文;
- 它使用舊的 基礎(chǔ)訪問認(rèn)證 或現(xiàn)代的 OAuth 2.0向 ISP(互聯(lián)網(wǎng)服務(wù)提供商)的 SMTP 和 IMAP 服務(wù)器認(rèn)證它自己; (對于 OAuth 2.0,通過桌面環(huán)境設(shè)置來設(shè)置它,例如,”Settings” -> “Online Accounts”.)
- 它發(fā)送消息到 ISP 的智能主機(jī)的 SMTP 服務(wù)監(jiān)聽的消息遞交端口(587);
- 從 TLS/IMAP4 端口(993)接收存儲在 ISP 的服務(wù)器上的消息;
- 它能夠通過他們的屬性過濾郵件;
- 它能夠提供額外的功能:聯(lián)系人、日歷、任務(wù)、備忘錄。
郵件用戶代理列表 (MUA):
軟件包 | 流行度 | 大小 | 類型 |
---|---|---|---|
evolution |
V:30, I:236 | 484 | X GUI 程序 (GNOME3, groupware 套件) |
thunderbird |
V:52, I:121 | 224527 | X GUI 程序 (GTK,?Mozilla Thunderbird) |
kmail |
V:37, I:95 | 23871 | X GUI 程序 (KDE) |
mutt |
V:17, I:157 | 7104 | 很有可能與?vim ?一起使用的字符終端程序 |
mew |
V:0, I:0 | 2319 | (x)emacs ?下的字符終端程序 |
二、現(xiàn)代郵件服務(wù)限制
現(xiàn)代郵件服務(wù)器有一些限制來最小化暴露濫用(不希望和未被要求的電子郵件)問題。
1、在消費者級的網(wǎng)絡(luò)上運(yùn)行 SMTP 服務(wù)器來直接可靠的發(fā)送郵件到遠(yuǎn)端主機(jī)是不現(xiàn)實的;
2、一個郵件能夠被任何主機(jī)靜悄悄的拒絕,即使路由到了目的地,除非它盡可能看起來是經(jīng)過認(rèn)證的;
3、期望單個智能主機(jī)可靠的發(fā)送不相關(guān)的源郵件地址到遠(yuǎn)程主機(jī),這是不現(xiàn)實的。
這是因為:
- 從消費者級網(wǎng)絡(luò)提供的主機(jī)連接到互聯(lián)網(wǎng)的 SMTP 端口(25)已經(jīng)被封鎖了;
- 從互聯(lián)網(wǎng)的 SMTP 端口(25)連接到消費者級網(wǎng)絡(luò)提供的主機(jī)已經(jīng)被封鎖了;
- 從消費者級網(wǎng)絡(luò)提供的主機(jī)發(fā)出到互聯(lián)網(wǎng)的消息,只能夠通過消息遞交端口(587)發(fā)送;
- 像域名密鑰識別郵件 (DKIM)、發(fā)信者策略框架 (SPF) 和 基于域名的消息認(rèn)證、報告和反應(yīng)(DMARC) 這樣的反垃圾郵件技術(shù)廣泛用于電子郵件過濾;
- 域名密鑰識別郵件服務(wù)可能會用于通過 smarthost 的電子郵件發(fā)送;
- 智能主機(jī)可以在郵件頭重寫源電子郵件地址為郵件賬戶,來阻止電子郵件欺詐。
三、歷史郵件服務(wù)端
一些在 Debian 上的程序,它們默認(rèn)期望訪問 /usr/sbin/sendmail 命令來發(fā)送郵件,或者從一個個性化設(shè)置的 UNIX 系統(tǒng)郵件服務(wù)器來發(fā)送郵件,實現(xiàn)歷史的功能:
- 郵件是由純文本文件創(chuàng)建;
- 郵件是由 /usr/sbin/sendmail 命令處理;
- 對于目的地址為同一主機(jī),/usr/sbin/sendmail 命令進(jìn)行郵件的本地分發(fā),將郵件附在 /var/mail/$username 文件后;期望這個特征的命令: apt-listchanges, cron, at, …
- 對于目的地址在遠(yuǎn)程主機(jī),/usr/sbin/sendmail 命令遠(yuǎn)程傳輸郵件到目的主機(jī),使用 SMTP 發(fā)現(xiàn) DNS MX 記錄。期望這個特征的命令:popcon, reportbug, bts, …
四、郵件傳輸代理 (MTA)
在 Debian 12 Bookworm 后,在沒有 mail transfer agent (MTA) 程序的情況下,Debian 移動工作站可以基于 電子郵件客戶端,配置為全功能的 GUI (圖像用戶界面)。
以往的 Debian 會安裝某個 MTA 程序來支持期望 /usr/sbin/sendmail 命令的程序。對于移動工作站,典型的 MTA 選擇是 exim4-daemon-light 或 postfix,并選擇類似這樣的安裝選項:“Mail sent by smarthost; received via SMTP or fetchmail”。這些是輕量 MTA 和 “/etc/aliases” 匹配。
配置 exim4 來發(fā)送互聯(lián)網(wǎng)郵件,多個源電子郵件地址使用多個相應(yīng)的智能主機(jī),這是不尋常的。如果一些程序需要這樣的能力,使用 msmtp 來設(shè)置他們,它比較容易來設(shè)置多個源電子郵件地址。然后給主 MTA 僅僅保留單個電子郵件地址。
基礎(chǔ)的郵件傳輸代理相關(guān)的軟件包列表:
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
exim4-daemon-light |
V:222, I:234 | 1574 | Exim4 郵件傳輸代理 (MTA : Debian 默認(rèn)的) |
exim4-daemon-heavy |
V:6, I:6 | 1742 | Exim4 郵件傳輸代理 (MTA : 靈活的替代品) |
exim4-base |
V:228, I:242 | 1701 | Exim4 文檔 (文本) 和通用文件 |
exim4-doc-html |
I:1 | 3746 | Exim4 文檔 (html) |
exim4-doc-info |
I:0 | 637 | Exim4 文檔 (info) |
postfix |
V:128, I:136 | 4031 | Postfix 郵件傳輸代理 (MTA : 安全的替代品) |
postfix-doc |
I:7 | 4634 | Postfix 文檔 (html+text) |
sasl2-bin |
V:5, I:14 | 371 | Cyrus SASL API 實現(xiàn) (實現(xiàn) postfix SMTP 認(rèn)證) |
cyrus-sasl2-doc |
I:1 | 2154 | Cyrus SASL – 文檔 |
msmtp |
V:6, I:11 | 667 | 輕量 MTA |
msmtp-mta |
V:5, I:6 | 125 | 輕量 MTA (sendmail 兼容擴(kuò)展到msmtp ) |
esmtp |
V:0, I:0 | 129 | 輕量 MTA |
esmtp-run |
V:0, I:0 | 32 | 輕量 MTA(sendmail 兼容擴(kuò)展到esmtp ) |
nullmailer |
V:8, I:9 | 474 | 部分功能 MTA,沒有本地郵件 |
ssmtp |
V:5, I:8 | 2 | 部分功能 MTA,沒有本地郵件 |
sendmail-bin |
V:13, I:14 | 1877 | 全功能 MTA(如果你已經(jīng)對它熟悉) |
courier-mta |
V:0, I:0 | 2408 | 全功能 MTA(web 接口等.) |
1、exim4的配置
對于那些通過 smarthost 的網(wǎng)絡(luò)郵件,應(yīng)該按如下所示的 (重新) 配置 exim4-* 軟件包。
$ sudo systemctl stop exim4 $ sudo dpkg-reconfigure exim4-config
- 配置 “General type of mail configuration” 時,選擇 “mail sent by smarthost; received via SMTP or fetchmail”;
- 設(shè)置 “System mail name:” 為默認(rèn)的 FQDN;
- 設(shè)置 “IP-addresses to listen on for incoming SMTP connections:” 為默認(rèn)的 “127.0.0.1; ::1″;
- “Other destinations for which mail is accepted:” 選項留空;
- “Machines to relay mail for:” 選項留空;
- 設(shè)置 “IP address or host name of the outgoing smarthost:” 為 “smtp.hostname.dom:587″;
- 設(shè)置 “Hide local mail name in outgoing mail?” 選項為 “NO”。
選擇如下所示的其中一個來回答 “Keep number of DNS-queries minimal (Dial-on-Demand)?”。
- “No” 如果啟動的時候,系統(tǒng)就連上了互聯(lián)網(wǎng);
- “Yes” 如果啟動的時候,系統(tǒng)沒有連上互聯(lián)網(wǎng)。
設(shè)置 “Delivery method for local mail:” 選項為 “mbox format in /var/mail/”。”Split configuration into small files?:” 選項設(shè)為 “Yes”。
通過修改 “/etc/exim4/passwd.client” 文件,來創(chuàng)建用于 smarthost 的密碼條目。
$ sudo vim /etc/exim4/passwd.client ... $ cat /etc/exim4/passwd.client ^smtp.*\.hostname\.dom:username@hostname.dom:password
配置 exim4(8),在 “/etc/default/exim4” 文件中寫入 “QUEUERUNNER=’queueonly'”,”QUEUERUNNER=’nodaemon'” 等等,來最小化系統(tǒng)資源使用。
通過如下所示的啟動 exim4。
$ sudo systemctl start exim4
“/etc/exim4/passwd.client” 文件中的主機(jī)名不應(yīng)該是別名,應(yīng)該按如下所示的檢查真正的主機(jī)名。
$ host smtp.hostname.dom smtp.hostname.dom is an alias for smtp99.hostname.dom. smtp99.hostname.dom has address 123.234.123.89
我在 “/etc/exim4/passwd.client” 文件中使用正則表達(dá)式來繞過別名問題。即使 ISP 更改了別名所指向的主機(jī)名,SMTP AUTH 還是可能工作的。能夠通過如下所示的手動更新 exim4 配置:
更新 “/etc/exim4/” 目錄下的 exim4 配置文件:
- 創(chuàng)建 “/etc/exim4/exim4.conf.localmacros” 來設(shè)置宏命令和修改 “/etc/exim4/exim4.conf.template” 文件;
- 在 ”/etc/exim4/exim4.conf.d” 子目錄中創(chuàng)建新文件或編輯已存在的文件。(分割的配置)
運(yùn)行 “systemctl reload exim4″:
如果 debconf 詢問 “Keep number of DNS-queries minimal (Dial-on-Demand)?” 這個問題時,選擇 了 “No” (默認(rèn)值),那么啟動 exim4 會花很長時間并且系統(tǒng)在啟動的時候不會連接到互聯(lián)網(wǎng)。
注意:從所有的實踐考慮,使用帶 STARTTLS 的 SMTP 端口 587,或者 SMTPS (SSL 之上的 SMTP ) 端口 465, 代替純 SMTP 端口 25。
2、帶有 SASL 的 postfix 配置
重要的 postfix 手冊頁列表:
命令 | 功能 |
---|---|
postfix (1) |
Postfix 控制程序 |
postconf (1) |
Postfix 配置工具 |
postconf (5) |
Postfix 配置參數(shù) |
postmap (1) |
Postfix 查找表維護(hù) |
postalias (1) |
Postfix 別名數(shù)據(jù)庫維護(hù) |
應(yīng)該按如下所示的 (重新) 配置 postfix 和 sasl2-bin 軟件包。
$ sudo systemctl stop postfix $ sudo dpkg-reconfigure postfix
選擇 “Internet with smarthost”。
設(shè)置 “SMTP relay host (blank for none):” 為 “[smtp.hostname.dom]:587” 并按如下所示配置。
$ sudo postconf -e 'smtp_sender_dependent_authentication = yes' $ sudo postconf -e 'smtp_sasl_auth_enable = yes' $ sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd' $ sudo postconf -e 'smtp_sasl_type = cyrus' $ sudo vim /etc/postfix/sasl_passwd
為 smarthost 創(chuàng)建密碼條目。
$ cat /etc/postfix/sasl_passwd [smtp.hostname.dom]:587 username:password $ sudo postmap hush:/etc/postfix/sasl_passwd
通過如下所示的啟動 postfix。
$ sudo systemctl start postfix
3、郵件地址配置
這里有一些用于郵件傳輸、投遞和用戶代理的郵件地址配置文件。
與郵件地址相關(guān)的配置文件列表:
文件 | 功能 | 應(yīng)用 |
---|---|---|
/etc/mailname |
用于 (外發(fā)) 郵件的默認(rèn)主機(jī)名 | Debian 專用的,mailname (5) |
/etc/email-addresses |
用于外發(fā)郵件的主機(jī)名偽裝 | exim (8) 專用的,exim4-config_files (5) |
/etc/postfix/generic |
用于外發(fā)郵件的主機(jī)名偽裝 | postfix (1) 專用的,postmap (1) 命令執(zhí)行后激活。 |
/etc/aliases |
用于接收郵件的賬戶別名 | 通用的,newaliases (1) 命令執(zhí)行后激活。 |
“/etc/mailname” 文件中的 mailname 通常是全稱域名 (FQDN),這個全程域名將會被解析成主機(jī)的 IP 地址。對于沒有可解析成 IP 地址的主機(jī)名的移動工作站,設(shè)置 mailname 為 “hostname -f” 的值。(這對于 exim4-* 和 postfix 都是安全有效的選擇。)
“/etc/mailname” 中的內(nèi)容被許多非 MTA 程序用作它們的默認(rèn)行為。對于 mutt, 在~/muttrc 文件中設(shè)置 “hostname” 和 “from” 變量來覆蓋 mailname 值。對于 devscripts 軟件包的程序,例如 bts(1) 和 dch(1),導(dǎo)出環(huán)境變量 “$DEBFULLNAME” 和 “$DEBEMAIL” 的值來覆蓋它。
popularity-contest 軟件包一般以 FQDN 形式的 root 賬戶發(fā)送郵件。需要像 /usr/share/popularity-contest/default.conf 文件中描述的那樣去設(shè)置 /etc/popularity-contest.conf 文件中的 MAILFROM 值。否則,郵件會被 smarthost SMTP 服務(wù)器拒絕。盡管這些過程很乏味,這種方法比為所有通過 MTA 并且是以 root 用戶發(fā)送的郵件重寫源地址更安全。這也可以被其他守護(hù)進(jìn)程或者是 cron 腳本使用。
當(dāng)設(shè)置 mailname 為 “hostname -f” 的值時,通過 MTA 的源郵件地址的偽裝可以通過如下所示的來實現(xiàn)。
對于 postfix,接下來的額外步驟需要執(zhí)行:
# postmap hash:/etc/postfix/generic # postconf -e 'smtp_generic_maps = hash:/etc/postfix/generic' # postfix reload
能夠通過如下所示的來測試郵件地址配置。
- exim(8) 用 -brw, -bf, -bF, -bV, … 選項
- postmap(1) 用 -q 選項。
4、基礎(chǔ) MTA 操作
這里有一些基礎(chǔ)的 MTA 操作,其中可能會通過 sendmail(1) 的兼容性接口來實現(xiàn)。
基礎(chǔ) MTA 操作列表:
exim 命令 | postfix 命令 | 說明 |
---|---|---|
sendmail |
sendmail |
從標(biāo)準(zhǔn)輸入讀取郵件并且安排投遞 (-bm ) |
mailq |
mailq |
列出帶有狀態(tài)和隊列 ID 的郵件隊列 (-bq ) |
newaliases |
newaliases |
初始化別名數(shù)據(jù)庫 (-I ) |
exim4 -q |
postqueue -f |
刷新等待郵件 (-q ) |
exim4 -qf |
postsuper -r ALL deferred; postqueue -f |
刷新所有郵件 |
exim4 -qff |
postsuper -r ALL; postqueue -f |
刷新甚至已經(jīng)凍結(jié)的郵件 |
exim4 -Mg queue_id |
postsuper -h queue_id |
通過郵件的隊列 ID 來凍結(jié)它 |
exim4 -Mrm queue_id |
postsuper -d queue_id |
通過郵件的隊列 ID 來移除它 |
N/A | postsuper -d ALL |
移除所有郵件 |