Debian邮件系统提供了用户和服务器之间通信的基础,现代的邮件服务限制了用户可以发送和接收的信息量,同时也对服务器的性能提出了更高的要求。常用的邮件传输代理有exim4和postfix。本篇教程主要介绍消费者级互联网连接的典型的移动工作站。
一、电子邮件基础
电子邮件由三个部分组成,消息的信封,邮件头及邮件正文。
- SMTP 用电子邮件信封上的 “To” 和 “From” 信息来投递邮件;(信封上的 “From” 信息也被叫做退回地址, 例如 From_ 等等)
- 电子邮件头的”To” 和 “From” 信息,显示在 电子邮件客户端上;(在大部分情况下,这些信息是跟电子邮件信封一致,但并不全是这样。)
- 覆盖邮件头和正文数据的电子邮件消息格式被 多用途互联网邮件扩展 (MIME) 扩展,从纯文本的 ASCII 到其它字符编码,包括作为附件的音频、视频、图像和应用程序。
功能全面的基于 电子邮件客户端的 GUI 程序使用基于 GUI 的直观的配置,提供下列所有功能。
- 为了处理正文数据类型及其编码,它创建和使用多用途互联网邮件扩展 (MIME)来解释邮件标头和邮件正文;
- 它使用旧的 基础访问认证 或现代的 OAuth 2.0向 ISP(互联网服务提供商)的 SMTP 和 IMAP 服务器认证它自己; (对于 OAuth 2.0,通过桌面环境设置来设置它,例如,”Settings” -> “Online Accounts”.)
- 它发送消息到 ISP 的智能主机的 SMTP 服务监听的消息递交端口(587);
- 从 TLS/IMAP4 端口(993)接收存储在 ISP 的服务器上的消息;
- 它能够通过他们的属性过滤邮件;
- 它能够提供额外的功能:联系人、日历、任务、备忘录。
邮件用户代理列表 (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 下的字符终端程序 |
二、现代邮件服务限制
现代邮件服务器有一些限制来最小化暴露滥用(不希望和未被要求的电子邮件)问题。
1、在消费者级的网络上运行 SMTP 服务器来直接可靠的发送邮件到远端主机是不现实的;
2、一个邮件能够被任何主机静悄悄的拒绝,即使路由到了目的地,除非它尽可能看起来是经过认证的;
3、期望单个智能主机可靠的发送不相关的源邮件地址到远程主机,这是不现实的。
这是因为:
- 从消费者级网络提供的主机连接到互联网的 SMTP 端口(25)已经被封锁了;
- 从互联网的 SMTP 端口(25)连接到消费者级网络提供的主机已经被封锁了;
- 从消费者级网络提供的主机发出到互联网的消息,只能够通过消息递交端口(587)发送;
- 像域名密钥识别邮件 (DKIM)、发信者策略框架 (SPF) 和 基于域名的消息认证、报告和反应(DMARC) 这样的反垃圾邮件技术广泛用于电子邮件过滤;
- 域名密钥识别邮件服务可能会用于通过 smarthost 的电子邮件发送;
- 智能主机可以在邮件头重写源电子邮件地址为邮件账户,来阻止电子邮件欺诈。
三、历史邮件服务端
一些在 Debian 上的程序,它们默认期望访问 /usr/sbin/sendmail 命令来发送邮件,或者从一个个性化设置的 UNIX 系统邮件服务器来发送邮件,实现历史的功能:
- 邮件是由纯文本文件创建;
- 邮件是由 /usr/sbin/sendmail 命令处理;
- 对于目的地址为同一主机,/usr/sbin/sendmail 命令进行邮件的本地分发,将邮件附在 /var/mail/$username 文件后;期望这个特征的命令: apt-listchanges, cron, at, …
- 对于目的地址在远程主机,/usr/sbin/sendmail 命令远程传输邮件到目的主机,使用 SMTP 发现 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 来发送互联网邮件,多个源电子邮件地址使用多个相应的智能主机,这是不寻常的。如果一些程序需要这样的能力,使用 msmtp 来设置他们,它比较容易来设置多个源电子邮件地址。然后给主 MTA 仅仅保留单个电子邮件地址。
基础的邮件传输代理相关的软件包列表:
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
exim4-daemon-light |
V:222, I:234 | 1574 | Exim4 邮件传输代理 (MTA : Debian 默认的) |
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 实现 (实现 postfix SMTP 认证) |
cyrus-sasl2-doc |
I:1 | 2154 | Cyrus SASL – 文档 |
msmtp |
V:6, I:11 | 667 | 轻量 MTA |
msmtp-mta |
V:5, I:6 | 125 | 轻量 MTA (sendmail 兼容扩展到msmtp ) |
esmtp |
V:0, I:0 | 129 | 轻量 MTA |
esmtp-run |
V:0, I:0 | 32 | 轻量 MTA(sendmail 兼容扩展到esmtp ) |
nullmailer |
V:8, I:9 | 474 | 部分功能 MTA,没有本地邮件 |
ssmtp |
V:5, I:8 | 2 | 部分功能 MTA,没有本地邮件 |
sendmail-bin |
V:13, I:14 | 1877 | 全功能 MTA(如果你已经对它熟悉) |
courier-mta |
V:0, I:0 | 2408 | 全功能 MTA(web 接口等.) |
1、exim4的配置
对于那些通过 smarthost 的网络邮件,应该按如下所示的 (重新) 配置 exim4-* 软件包。
$ sudo systemctl stop exim4 $ sudo dpkg-reconfigure exim4-config
- 配置 “General type of mail configuration” 时,选择 “mail sent by smarthost; received via SMTP or fetchmail”;
- 设置 “System mail name:” 为默认的 FQDN;
- 设置 “IP-addresses to listen on for incoming SMTP connections:” 为默认的 “127.0.0.1; ::1″;
- “Other destinations for which mail is accepted:” 选项留空;
- “Machines to relay mail for:” 选项留空;
- 设置 “IP address or host name of the outgoing smarthost:” 为 “smtp.hostname.dom:587″;
- 设置 “Hide local mail name in outgoing mail?” 选项为 “NO”。
选择如下所示的其中一个来回答 “Keep number of DNS-queries minimal (Dial-on-Demand)?”。
- “No” 如果启动的时候,系统就连上了互联网;
- “Yes” 如果启动的时候,系统没有连上互联网。
设置 “Delivery method for local mail:” 选项为 “mbox format in /var/mail/”。”Split configuration into small files?:” 选项设为 “Yes”。
通过修改 “/etc/exim4/passwd.client” 文件,来创建用于 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'” 等等,来最小化系统资源使用。
通过如下所示的启动 exim4。
$ sudo systemctl start exim4
“/etc/exim4/passwd.client” 文件中的主机名不应该是别名,应该按如下所示的检查真正的主机名。
$ 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” 文件中使用正则表达式来绕过别名问题。即使 ISP 更改了别名所指向的主机名,SMTP AUTH 还是可能工作的。能够通过如下所示的手动更新 exim4 配置:
更新 “/etc/exim4/” 目录下的 exim4 配置文件:
- 创建 “/etc/exim4/exim4.conf.localmacros” 来设置宏命令和修改 “/etc/exim4/exim4.conf.template” 文件;
- 在 ”/etc/exim4/exim4.conf.d” 子目录中创建新文件或编辑已存在的文件。(分割的配置)
运行 “systemctl reload exim4″:
如果 debconf 询问 “Keep number of DNS-queries minimal (Dial-on-Demand)?” 这个问题时,选择 了 “No” (默认值),那么启动 exim4 会花很长时间并且系统在启动的时候不会连接到互联网。
注意:从所有的实践考虑,使用带 STARTTLS 的 SMTP 端口 587,或者 SMTPS (SSL 之上的 SMTP ) 端口 465, 代替纯 SMTP 端口 25。
2、带有 SASL 的 postfix 配置
重要的 postfix 手册页列表:
命令 | 功能 |
---|---|
postfix (1) |
Postfix 控制程序 |
postconf (1) |
Postfix 配置工具 |
postconf (5) |
Postfix 配置参数 |
postmap (1) |
Postfix 查找表维护 |
postalias (1) |
Postfix 别名数据库维护 |
应该按如下所示的 (重新) 配置 postfix 和 sasl2-bin 软件包。
$ sudo systemctl stop postfix $ sudo dpkg-reconfigure postfix
选择 “Internet with smarthost”。
设置 “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 创建密码条目。
$ cat /etc/postfix/sasl_passwd [smtp.hostname.dom]:587 username:password $ sudo postmap hush:/etc/postfix/sasl_passwd
通过如下所示的启动 postfix。
$ sudo systemctl start postfix
3、邮件地址配置
这里有一些用于邮件传输、投递和用户代理的邮件地址配置文件。
与邮件地址相关的配置文件列表:
文件 | 功能 | 应用 |
---|---|---|
/etc/mailname |
用于 (外发) 邮件的默认主机名 | Debian 专用的,mailname (5) |
/etc/email-addresses |
用于外发邮件的主机名伪装 | exim (8) 专用的,exim4-config_files (5) |
/etc/postfix/generic |
用于外发邮件的主机名伪装 | postfix (1) 专用的,postmap (1) 命令执行后激活。 |
/etc/aliases |
用于接收邮件的账户别名 | 通用的,newaliases (1) 命令执行后激活。 |
“/etc/mailname” 文件中的 mailname 通常是全称域名 (FQDN),这个全程域名将会被解析成主机的 IP 地址。对于没有可解析成 IP 地址的主机名的移动工作站,设置 mailname 为 “hostname -f” 的值。(这对于 exim4-* 和 postfix 都是安全有效的选择。)
“/etc/mailname” 中的内容被许多非 MTA 程序用作它们的默认行为。对于 mutt, 在~/muttrc 文件中设置 “hostname” 和 “from” 变量来覆盖 mailname 值。对于 devscripts 软件包的程序,例如 bts(1) 和 dch(1),导出环境变量 “$DEBFULLNAME” 和 “$DEBEMAIL” 的值来覆盖它。
popularity-contest 软件包一般以 FQDN 形式的 root 账户发送邮件。需要像 /usr/share/popularity-contest/default.conf 文件中描述的那样去设置 /etc/popularity-contest.conf 文件中的 MAILFROM 值。否则,邮件会被 smarthost SMTP 服务器拒绝。尽管这些过程很乏味,这种方法比为所有通过 MTA 并且是以 root 用户发送的邮件重写源地址更安全。这也可以被其他守护进程或者是 cron 脚本使用。
当设置 mailname 为 “hostname -f” 的值时,通过 MTA 的源邮件地址的伪装可以通过如下所示的来实现。
对于 postfix,接下来的额外步骤需要执行:
# 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、基础 MTA 操作
这里有一些基础的 MTA 操作,其中可能会通过 sendmail(1) 的兼容性接口来实现。
基础 MTA 操作列表:
exim 命令 | postfix 命令 | 说明 |
---|---|---|
sendmail |
sendmail |
从标准输入读取邮件并且安排投递 (-bm ) |
mailq |
mailq |
列出带有状态和队列 ID 的邮件队列 (-bq ) |
newaliases |
newaliases |
初始化别名数据库 (-I ) |
exim4 -q |
postqueue -f |
刷新等待邮件 (-q ) |
exim4 -qf |
postsuper -r ALL deferred; postqueue -f |
刷新所有邮件 |
exim4 -qff |
postsuper -r ALL; postqueue -f |
刷新甚至已经冻结的邮件 |
exim4 -Mg queue_id |
postsuper -h queue_id |
通过邮件的队列 ID 来冻结它 |
exim4 -Mrm queue_id |
postsuper -d queue_id |
通过邮件的队列 ID 来移除它 |
N/A | postsuper -d ALL |
移除所有邮件 |