【问题标题】:Implementing an intelligent relay with an SMTP server/client使用 SMTP 服务器/客户端实现智能中继
【发布时间】:2014-12-19 08:21:16
【问题描述】:

我需要实现一个智能邮件列表/中继(在 Linux 上)。这个想法是:

  1. 服务器接收到列表地址的电子邮件
  2. 它会解析邮件,并确认它来自受信任的来源
  3. 它在本地数据库中查找收件人列表
  4. 它对收到的邮件进行一些小处理,并将其发送到列表中
  5. 它将所有退回邮件返回给原始发件人

服务器已经安装了 sendmail,但如果需要我可以使用另一个 MTA。

这听起来很简单,并且 sendmail 已经具有数据库查找功能。但是,我认为这不是特别灵活,并且我不想让 sendmail 独立访问我的数据库。

我最接近现有解决方案的是E-MailRelay,它看起来不错,但如果可以避免的话,我不想要集成它的开销。

我希望在开始之前对我的 B 计划进行全面检查,或者提供其他建议。我没有找到任何有用的文档,而且 Sendmail 书似乎没有任何相关内容。

我在想的是:

  1. 为 sendmail 实现一个 SMTP 传递代理,让 sendmail 和 DA 在同一台服务器上运行,DA 监听某个未指定的端口(哪个?)
  2. Sendmail 在连接到 DA 时大概充当 SMTP 客户端,我的 DA 将响应 MAIL/RCPT/DATA 命令
  3. DA 处理收到的邮件,这些邮件要么是发送到邮件列表的消息,要么是退回邮件,也可能是回复
  4. DA 然后切换到客户端模式,连接到 sendmail,并发出 MAIL/RCT/DATA 命令以将响应返回给原始发件人

这有意义吗?谢谢。

【问题讨论】:

  • 你为什么要重新实现这个?您正在描述 Sendmail 别名。如果您想开发新的东西,我建议您改为使用像 Postfix 这样的现代 MTA。
  • @tripleee:我认为,这比别名更笼统。我可以使用:include: 为列表地址设置别名,但这只是引用一个静态文件,我需要从我自己的数据库中单独维护它。而且我无法进行邮件处理。或者我可以通过| 将别名添加到外部程序,但这只是使用标准输入上的传入邮件执行程序,然后我必须自己执行 sendmail 和响应。那将毫无意义-设置套接字肯定更好吗?此外,如果我在套接字上使用 SMTP,我有一个完全通用的解决方案,与 sendmail 无关。
  • 你严重过度设计了这个。现有的邮件列表管理器做得很好。参见例如gnu.org/software/mailman
  • @tripleee:我过去曾运行过几个邮递员列表,它们是 PITA。此外,这不是我要找的。我有一个基于 MySql 数据库的 webapp,并且列表地址会随着数据库的内容而频繁更改。 mailman 本质上是静态的。正如我所说,我还必须处理传入的消息,而不仅仅是将它们转发到列表中。

标签: smtp sendmail emailrelay


【解决方案1】:

结果证明这很简单,虽然我没有使用 sendmail 传递代理 - 我只是在 SMTP 中做了所有事情。服务器有两个 IP 地址,sendmail 已经在 IP#1 上的 25 端口监听。

我编写了一个 SMTP 代理,它侦听 IP#2 上的端口 25。这会运行一个 SMTP 服务器,该服务器接受传入的消息并重新写入它们。然后它(作为客户端)连接到 IP#1 上的端口 25,将重写的消息发送到 sendmail。然后 sendmail 处理到重写的目标地址的传输。这对原始邮件客户端来说都是透明的。

不过,如果服务器只有一个 IP 地址,我不确定该怎么做。

【讨论】:

  • 仅使用一个 IP 地址来实现这一点相当简单:由于其中一个 sendmail 服务器将仅监听您的应用程序提交的消息,因此您可以让它监听一个非默认端口。
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2016-10-07
相关资源
最近更新 更多