当前位置:首页 > 站长知识 > 正文内容

Debian邮件系统详解

2024-08-27站长知识20

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):

软件包流行度大小类型
evolutionV:30, I:236484X GUI 程序 (GNOME3, groupware 套件)
thunderbirdV:52, I:121224527X GUI 程序 (GTK, Mozilla Thunderbird)
kmailV:37, I:9523871X GUI 程序 (KDE)
muttV:17, I:1577104很有可能与 vim 一起使用的字符终端程序
mewV:0, I:02319(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-lightV:222, I:2341574Exim4 邮件传输代理 (MTA : Debian 默认的)
exim4-daemon-heavyV:6, I:61742Exim4 邮件传输代理 (MTA : 灵活的替代品)
exim4-baseV:228, I:2421701Exim4 文档 (文本) 和通用文件
exim4-doc-htmlI:13746Exim4 文档 (html)
exim4-doc-infoI:0637Exim4 文档 (info)
postfixV:128, I:1364031Postfix 邮件传输代理 (MTA : 安全的替代品)
postfix-docI:74634Postfix 文档 (html+text)
sasl2-binV:5, I:14371Cyrus SASL API 实现 (实现 postfix SMTP 认证)
cyrus-sasl2-docI:12154Cyrus SASL – 文档
msmtpV:6, I:11667轻量 MTA
msmtp-mtaV:5, I:6125轻量 MTA (sendmail 兼容扩展到msmtp)
esmtpV:0, I:0129轻量 MTA
esmtp-runV:0, I:032轻量 MTA(sendmail 兼容扩展到esmtp)
nullmailerV:8, I:9474部分功能 MTA,没有本地邮件
ssmtpV:5, I:82部分功能 MTA,没有本地邮件
sendmail-binV:13, I:141877全功能 MTA(如果你已经对它熟悉)
courier-mtaV:0, I:02408全功能 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 命令说明
sendmailsendmail从标准输入读取邮件并且安排投递 (-bm)
mailqmailq列出带有状态和队列 ID 的邮件队列 (-bq)
newaliasesnewaliases初始化别名数据库 (-I)
exim4 -qpostqueue -f刷新等待邮件 (-q)
exim4 -qfpostsuper -r ALL deferred; postqueue -f刷新所有邮件
exim4 -qffpostsuper -r ALL; postqueue -f刷新甚至已经冻结的邮件
exim4 -Mg queue_idpostsuper -h queue_id通过邮件的队列 ID 来冻结它
exim4 -Mrm queue_idpostsuper -d queue_id通过邮件的队列 ID 来移除它
N/Apostsuper -d ALL移除所有邮件