处理电子邮件,第一部分

作者:Marco Fioretti

每个月,越来越多的小型企业和家庭依靠电子邮件来维持业务或与远方的亲戚保持快速且廉价的联系。 这两个群体通常需要执行通用规则,例如家长控制或可接受的使用政策。 本文是完全致力于使用自由软件构建此类电子邮件系统的系列文章中的第一篇,它分为三个部分。 第一部分总结了当今小型群体如何使用电子邮件以及为什么它通常不是最佳解决方案。 第二部分描述了总体架构。 最后一部分介绍了系统的核心组件,即 SMTP 服务器的主要特性。

当今易于获得的产品的局限性

集中配置和日志记录、自动阻止垃圾邮件和病毒、从任何电子邮件客户端或 Web 访问相同的邮箱——这些只是小型企业主和负责任的父母希望完全控制的少数服务。 同样重要的是拥有恒定的电子邮件地址,完全独立于当前的互联网接入提供商。 安全且可用的 Webmail 界面,以及将以前 ISP 或大学时代的旧帐户整合到一个邮箱中,也是必不可少的。

大多数群体以两种方式之一管理电子邮件。 第一种方法是让每个群组成员选择任何大型“大众免费电子邮件”提供商(例如 Gmail、Yahoo 等),并凑合使用这些提供商提供的服务。 这条路线是最容易的,但有时它唯一的真正好处可能是恒定的,如果是一般的地址。 使用此类提供商,几乎没有什么可以集中监控、配置或控制的,除非常驻技术人员手动设置并始终保持所有计算机同步——包括每次用户更换计算机或电子邮件客户端。 除了这些实际问题外,全世界都使用两三个电子邮件提供商的可靠性和隐私问题也同样显而易见。

第二种选择是从专业的专用电子邮件托管提供商处购买专业的专用电子邮件托管服务。 请注意,我说的是“专用电子邮件托管”,而不是“通用 Web 托管公司的普通电子邮件服务”。 通用 Web 主机最多只能提供次优的垃圾邮件过滤。 专用电子邮件托管通常提供一流的垃圾邮件过滤、可靠的电子邮件转发等等,因为它是一项独立的业务,需要与 Web 托管不同的专业知识和配置。 所有此类提供商都可以处理任何域的电子邮件,因此它们足够灵活,可以满足许多用户的需求。

如果专用电子邮件主机提供如此好的服务,为什么还要考虑其他选择呢? 许多小型企业和家庭希望完全控制其电子邮件功能。 其他决定性因素可能是带宽或磁盘空间不足、垃圾邮件过滤不够复杂以及隐私问题。 请注意,这里的隐私不仅仅意味着“值得信赖的提供商永远不会阅读您的邮件”。 为了以尽可能小的努力锁定垃圾邮件发送者,一些提供商(包括“专用”类别中的一些提供商)不会阅读您的邮件,但会将您发送电子邮件的计算机的 IP 地址添加到您发送的每封电子邮件中。 这使得从家里发送“我不能连续第 30 天来办公室了;我飞到斐济了”之类的消息变得不可能,因为任何能够阅读和理解电子邮件标头的人都会立即看到该消息来自您的家庭互联网连接。 对于某些用户来说,仅此原因就足以排除某些提供商。

尺寸合适的完整自定义服务器

以您想要的方式为您的小型社区设置电子邮件并以尽可能小的努力保持其运行的唯一方法是仅使用自由软件配置您自己的最先进的电子邮件服务器。 这就是本系列文章的全部内容。

不幸的是,大多数关于此主题的在线教程都属于以下两类:终极单用户电子邮件服务器或面向财富 500 强企业的完美 Linux/BSD 电子邮件平台。 尽管第一类甚至对于小型群体来说都太少了,但第二类教程通常暗示您会很乐意学习、部署和维护一堆其他服务器和数据库,仅仅是为了向五到十个用户提供 Webmail、身份验证等服务。

对于只有少数用户的情况,坚持使用配置文件更有效,尽可能限制第三方组件的数量。 在可能的情况下,本系列文章都遵循这种方法。

您将从本系列文章中学到什么

第一篇文章仅描述了系统的一般架构以及将成为整个环境基础的 SMTP 服务器的基本功能。 在接下来的文章中,我将介绍如何接收多个域的电子邮件、如何为授权用户中继消息以及如何在服务器级别过滤垃圾邮件和病毒。 之后,我将讨论如何在服务器上尽可能多地进行高级电子邮件排序和处理。 接下来,我将展示如何通过 Web 界面或桌面电子邮件客户端向用户提供收到的消息。 在此过程中,您还将学习何时以及如何使用备份 MX 服务器、如何备份邮箱、如何使用自动报告工具控制一切以及其他一些很酷的技巧。

一般注意事项和警告

集中式电子邮件环境的优点在于,可以通过图形界面完成的事情很少,最终用户也很少会搞砸。 经历这种麻烦的全部意义在于使电子邮件始终按照您的偏好进行配置和工作——无论您或其他群组成员多久更改、测试或混合不同的客户端、操作系统和位置(家庭、办公室、网吧等)。 然而,实现此目的的正确方法是在一台服务器上完成尽可能多的工作,使用通常只能通过文本配置文件控制的工具。 只要一个人愿意花一些时间调整配置文件并阅读正确的文档,这项任务绝对可以完成,而无需编程。

硬件可以是存放在壁橱中的旧计算机,也可以是数据中心的虚拟专用服务器 (VPS)。 第一种解决方案既省钱又环保(硬件会造成污染!)。 第二种解决方案更可靠,因为停电或硬件损坏造成的停机时间几乎消失了。 由于本系列中描述的配置和技巧在两种情况下都是相同的,因此在处理设置时我只是忽略了这个问题。

为了使事情更容易,仅考虑可用于您选择的发行版的二进制包的配置。 您可能无法获得所有内容的最新版本,但是不编译任何东西并进行自动更新的便利性太大了,不容拒绝,除非您是全职付费管理员。 因此,我假设您已经拥有一个 Linux box 并且知道如何在上面安装二进制包。

需求:仅限专用电子邮件托管的 VPS 包

市场上大多数 VPS 产品都配置用于具有大量流量的中型到大型网站,对于像我在这里讨论的小型电子邮件系统来说有点过头了。 如果有这样的产品,让您只为电子邮件所需的磁盘空间和带宽付费,但为您提供一个 VPS,其中包含此处描述的所有且仅有的软件包,并且都以正确的方式预配置,会怎么样? 也许您的需求包括特定服务,例如自动检查您是否在垃圾邮件发送者黑名单上、面向电子邮件的灾难恢复以及如果事情在您离开去落基山脉进行为期两周的徒步旅行后十分钟后变得糟糕,则进行备份 MX 托管? 我相信此类产品有很大的市场。 已经有提供商提供它们了吗? 请告诉我们。

架构

系统需要图 1 中所示的组件。 只有桌面电子邮件客户端在电子邮件服务器以外的计算机上运行。

Work the E-mail, Part I

图 1. 系统需求

SMTP 服务器是使用简单邮件传输协议来接受来自外部世界的合法电子邮件或将来自授权用户的所有消息(无论它们是如何发送的)发送到其最终目的地的组件。 该服务器由几个守护程序协助,这些守护程序有助于阻止垃圾邮件、病毒或其他不需要的连接。 来自外部客户端的传出消息只有在身份验证过程之后才被接受和中继。

在 SMTP 服务器接受消息后,它会将其交给本地传递代理 (LDA),该代理根据预定义的过滤标准将其放入一个或多个邮箱中。 然后,单个消息通过 IMAP(Internet 邮件访问协议)服务器传递到 Webmail 或桌面客户端。 我专注于 IMAP,因为它对于两类客户端的工作方式相同,并且也可以使用 POP3 协议将消息从服务器移动到您的个人计算机。 大多数 IMAP 服务器也支持 POP3。 请注意,任何 Webmail 软件都需要 Web 服务器(通常是 Apache)和 PHP 才能运行。

我们的示例邮箱将为两个不同域中的大约十个用户提供服务:myfamily.net 和 mybusiness.com。 本系列中使用的实际应用程序是 Postfix (SMTP)、Dovecot (IMAP/POP3)、Squirrelmail (Webmail) 和 procmail (LDA)。 当然,它们不是唯一适合此任务的 FOSS 产品,但我发现它们在功能、文档、出色的在线支持以及易于安装和配置方面都是一个极好的组合。 然而,大多数概念和技巧都可以轻松移植到其他产品。

基本 Postfix 概念:进程、变量和映射

让我们开始了解我们选择的 SMTP 服务器 Postfix 的内部结构。 Postfix 的结构已经在另一篇 Linux Journal 文章(请参阅资源)中描述过,因此我在这里仅总结要点。 Postfix 实际上是许多程序的套件,有些程序与用户进程交互,有些程序作为守护程序运行,所有程序都由主守护程序控制。 所有守护程序的使用都在一个名为 master.cf 的文件中指定,每个守护程序一行逻辑行。 逻辑行可以在文件的更多行上扩展。 例如,本地电子邮件传递可以由 Postfix 守护程序处理,该守护程序可以直接写入 mbox 和 Maildir 邮箱,或者由外部本地传递代理(例如 procmail)处理。 列表 1 显示了典型 master.cf 文件的片段。

列表 1. 典型 master.cf 文件的片段

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd -v
  
procmail  unix  -       n       n       -       -       pipe flags=R 
     ↪user=procmail_user  
     ↪argv=/usr/bin/procmail -t -m USER=${user} 
     ↪EXTENSION=${extension} /etc/procmailrc

每行都以守护程序名称(服务)及其与 Postfix 通信的方式(Internet/UNIX 套接字或 FIFO)开头。 下一个参数显示它是否是邮件系统私有的,以及它是否在 chroot(即受限文件系统)中以特权或无特权运行。 Wakeup 和 maxproc 定义了唤醒间隔和可以同时执行此服务的最大进程数。 该行以调用守护程序的实际命令及其所有选项结尾。 我们将在接下来的文章中详细了解一些守护程序。 现在,知道一个或多个 -v 开关启用详细日志记录,并且 - 值表示对该字段使用默认值就足够了。

定义变量:main.cf

Postfix 有数百个配置变量,但不用担心。 要构建一个工作系统,您只需要设置大约 20 个变量。 要了解 Postfix 的功能及其工作方式,请参阅列表 2。 它是真实 main.cf 文件的摘录,绝非完整(或可工作)。 更具体地说,它仅显示必须设置为与默认值不同的主要选项,或者对于反垃圾邮件和不进行开放中继特别重要的选项。 我们将在本系列的后续文章中构建一个完整的 main.cf 文件。

列表 2. Postfix main.cf 文件的摘录

#Section 1: basic setup
myhostname         = the.full.name.of.your.server (eg mybox.home.network)
mydomain           = $myhostname
myorigin           = $mydomain
  
#Section 2: receiving mail
inet_interfaces = all
mydestination   = $myhostname, localhost
  
#Sections 3: define who can relay through this server
mynetworks = 127.0.0.0/8
relay_domains =
  
#Section 4: define virtual domains and virtual user maps
virtual_mailbox_domains = myfamily.net mybusiness.com
virtual_mailbox_base    = /var/mail/mail_storage
virtual_mailbox_maps    = hash:/etc/postfix/vmailbox
virtual_transport       = procmail
  
#Section 5: ignore spambots which don't respect the SMTP specs
#   from http://www.howtoforge.com/virtual_postfix_antispam
smtpd_helo_required          = yes
strict_rfc821_envelopes      = yes
disable_vrfy_command         = yes
  
#Section 6: ignore unknown senders or those which
#           don't show proper credentials
  
smtpd_helo_restrictions      =
  
smtpd_recipient_restrictions = 
                               reject_invalid_hostname,
                               reject_non_fqdn_hostname,
                               reject_non_fqdn_sender,
                               reject_non_fqdn_recipient,
                               permit_mynetworks,
                               reject_unauth_destination

第 1 节包含 VPS box 的完整名称。 第 2 节定义了我们从哪里接受邮件以及接受哪些目的地的邮件。 每个 SMTP 服务器的第一条规则是永远不要通过将来源不明的消息或无用的退回通知中继到互联网而成为垃圾邮件机器人。 这就是第 3 节的用途。 就像现在这样,它意味着只有源自服务器的消息才会发送到外部。 第 4 节说明我们接受针对 myfamily.net 和 mybusiness.com 这两个域的电子邮件,但仅接受针对 /etc/postfix/vmailbox 映射中的用户的电子邮件,并且我们使用 procmail 将传入消息存储到 /var/mail/mail_storage 文件夹中。

当正确的 SMTP 过滤规则可用时(如图 1 所示),SMTP 服务器可以在联系时立即识别并拒绝大量垃圾邮件,甚至无需下载整个消息。 这就是第 5 节和第 6 节的作用。 除了官方文档外,Postfix 反 UCE 作弊表(请参阅资源)中也详细描述了它们的内容。 请注意,服务器实际上只有在您正确设置 DNS 后才能工作,但这以及所有这些变量的确切含义是我将在以后的文章中讨论的内容。 现在,让我们最后介绍 Postfix 映射。

映射类型

Postfix 可以将字符串和过滤表达式存储在许多索引或线性映射中。 这些结构用于存储有关如何处理客户端、发送者和单个消息的信息。 索引映射是从常规文本文件构建的二进制数据库。 外部关系数据库也可以用作索引映射。 线性映射是从上到下读取的常规文本文件,直到找到匹配的记录,因此记录的顺序很重要。

结论

本文是本系列文章主题的介绍,而不是为了澄清一些一般概念而编写的实用教程。 但是,请不要担心; 我们将在下一篇文章中讨论实际问题。 与此同时,快速浏览一下资源中列出的文档,并在您阅读“处理邮件,第二部分”时将其放在手边。 您也可以直接写信给我,告诉我您希望在本系列中找到的任何特定电子邮件技巧。

资源

“Postfix 结构,第 5 章”:www.linuxjournal.com/article/9454

Postfix 基本配置:www.postfix.org/BASIC_CONFIGURATION_README.html

Postfix 反 UCE 作弊表:jimsun.linxnet.com/misc/postfix-anti-UCE.txt

什么是 IMAP?:www.imap.org/about/whatisIMAP.html

Marco Fioretti 是一名硬件系统工程师,对自由软件作为 EDA 平台以及作为 RULE 项目的当前负责人,作为高效桌面都感兴趣。 Marco 与家人住在意大利罗马。

加载 Disqus 评论