我希望用内部安装来替换我们当前使用的外部 smtp 提供商。它应该处理以下情况:
某些地址应该转发到 gmail 地址;我们希望继续使用 gmail 作为我们的主要电子邮件界面。
其他地址应可用作 pop/imap 邮箱。
其他地址将以编程方式处理:它们将启动各种任务、记录下来等。这些地址要么启动一个进程来处理电子邮件地址,要么以易于处理的格式存储。
它还应该可以通过域密钥、spf 以及实现电子邮件传递所需的任何其他功能轻松进行配置。
我以前用过 sendmail。现在看来 postfix 和 exim 是推荐的选项。我的主要问题是:将地址转发到 gmail 以及进行编程访问的最佳选择和设置是什么?procmail 仍然是最佳选择吗?还是现在有更好的选择?
我们正在使用 linux/ubuntu 服务器。
答案1
Postfix 很稳定,支持良好,配置简单。您描述的所有内容都很常规。
- 转发:使用 virtual_alias 映射
- POP/IMAP 邮箱:本地投递,使用 Dovecot 之类的工具作为 POP/IMAP 服务器
- 程序化的东西:如果您的意思是将邮件提供给脚本,那么这是通过 /etc/aliases 完成的。对于“易于处理”,您有 mbox 和 Maildir 格式,它们都是标准的东西。
- 域密钥/SPF:SPF 在 DNS 中完成。域密钥很容易设置为邮件过滤或 SMTP 代理。
答案2
对于程序化的东西,您必须知道程序/脚本将以什么 UID 运行。
例如,对于 postfix,从 /etc/aliases(或任何其他 root 拥有的别名文件)运行的脚本将以“nobody”用户身份运行。
postfix 可以拥有多个别名文件,并且(这是好的部分)从别名文件运行的程序将以拥有该文件的用户身份运行(root 除外 - 如前所述,root 拥有的别名文件以 nobody 身份运行)。
如果您需要以 root 身份从邮件运行脚本,那么最简单的方法(如果您安装了 sudo)是配置 sudo 以允许“nobody”以无需密码的 root 身份运行它,并从使用 sudo 运行它的包装脚本运行它。
注意:无论何时从邮件触发脚本,您都必须记住数据(即邮件)来自不受信任的来源(互联网)……因此,将正文或标题中的数据用作脚本执行的命令的参数是极其不安全的。这基本上与在 CGI 脚本中信任用户提供的数据是同一个问题 - 不要这样做。例如,考虑一下如果用户提供的数据是“... innocuousdatahere ...; rm -rf /”之类的东西,编写糟糕的脚本会做什么。您可能认为检查分号等显而易见的东西并将其删除很容易,但您还需要检查很多不明显的东西,而且您只会让自己陷入失败,因为您不太可能想到或抓住它们。通过永远不信任用户提供的数据来完全消除安全风险要安全得多。
无论脚本以什么 UID 运行时,这一点都很重要,但当以 root 身份运行时尤其重要。
最后,回答您的一个直接问题,procmail 仍然是您想要做的有用的工具。maildrop 和其他类似程序也是如此。将 procmail 等视为用于解析主体和标题以决定要做什么的专用工具,因此您不必在脚本中包含所有解析代码。编写脚本以完成其工作,并使用 procmail 决定何时运行脚本。例如,您可以创建一个名为“mailjobs”的新用户,它有自己的主目录和 .procmailrc 文件。然后创建将邮件转发给该用户的别名。mailjobs 的 .procmailrc 将检查 X-Original-To 标头以决定运行哪个脚本。
答案3
exim 和 postfix 都能够满足您的需要,最好的建议是选择最容易使用和/或最熟悉的一个。
至于处理转发到 Gmail 和脚本,最好的方法是使用全局别名文件(通常保存在 /etc/aliases 或 /etc/mail/aliases 中)。