将原始 SMTP 消息发送到 AMQP 代理



我正在寻找一种方法来获取大量入站SMTP邮件并将它们放到AMQP代理上进行进一步路由和处理。邮件实际上不会最终进入邮箱,而是将 SMTP 用作邮件网关。

我用 Python 编写了一个 Postfix After-Queue Content Filter,它将入站 SMTP 消息放到 RabbitMQ 代理上。这很好用 - 我通过队列获得原始消息,并且它被消费者很好地拾取。问题是 AMQP 连接是随每条消息一起创建和拆除的......每次都会从头开始重新执行内容筛选器脚本。我想这最终会成为一个性能问题。

如果我可以利用一些可重入的东西,我就可以重用连接。或者也许我只是错误地接近了整个事情......

通过普通TCP建立AMQP连接非常快。 也许如果您使用的是SSL,那么这是另一回事,但是您确定将原始消息排队到AMQP交换将成为瓶颈吗? 我的猜测是,实际上通过SMTP传递邮件的速度会慢得多,因此排队的速度不会影响系统的吞吐量。

如果这篇文章确实是一个瓶颈,我更喜欢使用 Sinatra 或 Rack 创建小型 Web 服务器,但听起来您可能更喜欢基于 Python 的解决方案。 让后缀内容过滤器使用 curl 对 Web 服务器执行 HTTP POST,该服务器保持与 AMQP 服务器的持久连接。

当然,现在您有一个额外的活动部件,您需要考虑监控、错误处理和安全性。

使用 SwiftMQ。它有一个JavaMail桥接器,从IMAP或POP3帐户接收您的电子邮件,将其转换为JMS消息,然后可以被AMQP 0.9.1和/或AMQP 1.0以及JMS客户端使用。

您可以让 Postfix 将您的所有或任何电子邮件传递到外部程序,在那里您可以将它们扔到您想要的任何位置。可以在此处找到一些示例。

最新更新