我是一家律师事务所的 IT 人员。最近有人要求我制作一个系统,其中所有从我们的服务器发送给客户的电子邮件将首先被搁置,等待批准后再发送给客户。
我们的邮件服务器使用 Exim(cPanel 中是这么写的)。我计划创建过滤器,将外发电子邮件转发到编辑器帐户。然后,编辑器将查看和编辑电子邮件的内容。当编辑器已经批准电子邮件时,编辑器将将其发送给客户,但“发件人:”和“回复:”字段中仍使用原始发件人。
我从这个网站找到了一些指点 =>http://www.devco.net/archives/2006/03/24/saving_copies_of_all_email_using_exim.php。
一旦过滤器到位,我想为编辑器创建一个简单的 PHP 界面,以便检查转发的电子邮件并在必要时进行编辑。然后,编辑器可以单击“批准”按钮,最终将使用原始发件人发送邮件。
我也在想也许一个没有 PHP 的系统就足够了。编辑者可以从他自己的电子邮件客户端接收电子邮件,编辑它们,然后简单地发送电子邮件,就好像他是原始发件人一样。
- 我的计划可行吗?
- 是否存在我忽略的问题?
- 由于我弄乱了邮件头,这是否有被其他邮件服务器视为垃圾邮件的危险?
更新:(2012 年 4 月 6 日)上述问题可能比较模糊,因此这里有一个更具体的问题:1. 我是否可以将发往我们域外的所有外发邮件转发到另一个地址而不是实际收件人?
答案1
我的计划可行吗?
不,不是这样的。问题是(几乎)电子邮件和电子邮件标题中的任何内容都可以更改和伪造。此外,贵公司的任何人都可以通过他们喜欢的任何其他服务器发送电子邮件(除非您阻止他们所有的互联网访问,哦,等等,你不能,他们仍然有智能手机等),看似来自您的公司。如果您公司的员工想避免 PHB 的审查,他们只需使用外部电子邮件服务器 (MTA)。
您甚至不必担心可传递性,例如如果 rDNS 或 EHLO 问候与返回路径不匹配。只需使返回路径的域与传出 MTA 相同,但将发件人:地址更改为来自您的公司,几乎每个人都会认为它是来自贵公司。
是否存在我忽略的问题?
是的,总是这样。这是毫无意义的练习,而且很容易规避。为了避免自己和同事的麻烦,你需要向你的 PHB 解释这一点,并说服他或她这是错误的做法。有更好的方法来解决这个问题。但这些方法更多地在于公司政策、教育和雇用合适的员工以及具体规定,而不是限制个人自由的极端(且易于避免)措施。这些严厉的措施从长远来看几乎毫无例外地会对你不利。
由于我弄乱了邮件头,这是否有被其他邮件服务器视为垃圾邮件的危险?
不太可能。标头中的任何内容都可能被伪造和更改(见上文)。这几乎是标准做法,MTA 一直在添加和更改标头中的内容。无论您是人工操作,还是创建脚本来更改内容,MTA 都不会真正在意。只要它经过 MTA 验证和接受,它就不太可能被标记为垃圾邮件(当然是在合理范围内)。
不管怎样,我不想再考虑这个真正可怕的想法。:-(
答案2
不幸的是,你的问题的答案是肯定的,可以实现这样的系统,但幸运的是并不容易。
由于您在一家律师事务所工作,我很惊讶没有人提出在建立这样一个可怕的系统时有关责任和真实性的问题。在处理任何形式的沟通时,设立一个非互动的中间人是一个糟糕的想法,其结果很快就会变得与和客户打断电话一样糟糕。
按照您的规范设置系统的最快方法是运行 2 个 Exim 实例;一个实例用于处理传入消息并将其假脱机到磁盘,另一个实例用于处理假脱机消息的传递。这种情况的基本工作流程如下:
- Exim 实例 1 处理新消息并将其写入假脱机目录,例如
/var/spool/exim-in/
- 自定义编写的应用程序将读取消息
/var/spool/exim-in/input/
并允许编辑器进行必要的更改或从假脱机中删除该消息。然后,该应用程序将消息移动到新的假脱机目录中,例如/var/spool/exim-out/
- Exim 实例 2 现在负责处理位于假脱机目录中的消息的传递
/var/spool/exim-out/
配置 Exim 来做到这一点并不是很困难,可以通过查看典型的邮件扫描器设置,还将 Exim 分为两个队列,邮件只能通过 MailScanner 从一个队列移动到另一个队列。参见这一页快速概览如何使用 Exim 配置 MailScanner。
不那么简单的是编写一个应用程序,提供一个界面来处理您所需的编辑和批准流程。如果您尝试编写这样的应用程序,您将面临无数的障碍,例如正确的标头解析和处理复杂的 MIME 类型消息。您本质上是在重写一个典型的 MUA,例如 Outlook 或 Thunderbird;当然,除非您的编辑人员不介意查看原始 SMTP 数据和 HTML,在这种情况下您可以简单地将其显示为纯文本。
简而言之,不要这么做。这不仅是一个糟糕的想法,而且你肯定会遇到许多实施障碍,这使得这项努力对于个人开发人员来说完全不可行。