如何使用 Exim 将传入电子邮件路由到您的应用程序

在这里插入图片描述
Exim 是 Unix 系统的流行消息传输代理 (MTA)。它提供了多种路线选择和运输选择。在本文中,我们将展示如何使用 Exim 将传入的电子邮件通过管道传输到您自己的脚本中。

我们假设您已经拥有一个能够接收电子邮件的正常运行的 Exim 服务器。如果您是从头开始全新安装,官方 wiki 会提供信息指导。

管理进出口配置

可用的配置方法因操作系统分布而异。从源代码构建的 Exim 安装将src/configure.default用作其配置文件。

从包管理器安装的 Exim 文件通常是/etc/exim/config或/etc/exim.conf. 您可以通过运行找到当前使用的路径exim -bP configure_file。

基于 Debian 的操作系统有一个稍微复杂的系统。有两种可能的配置方法:单个文件/etc/exim4/exim4.conf.template,或在/etc/exim4/conf.d. 您需要update-exim4.conf在进行更改后运行。这将创建一个由 Exim 实际读取的合并文件。
每次更改配置时都应重新启动 Exim。运行service exim4 restart以应用您的更改。

创建路由器

将电子邮件发送到您的应用程序的第一步是定义自定义路由器。路由器将传入的电子邮件与一组条件进行匹配,以确定要使用的传送机制。

路由器按在配置文件中找到的顺序进行处理。文件中高于您的路由器的任何路由器都可以首先匹配传入的电子邮件。

将您的路由器添加到该ROUTERS CONFIGURATION部分的配置文件中。如果您使用拆分的 Debian 配置,则可以在其中创建一个新文件/etc/exim4/conf.d/routers。使用此方法时,路由器将按字母顺序组合。

这是一个示例路由器:

example_router:
  driver = accept
  domains = example.com
  transport = example_transport

这是一个基本的路由器,可以匹配发送到example.com. 当匹配被处理时,Exim 将accept消息并使用example_transport传输传递它。我们接下来会创建这个。

创建传输

一旦电子邮件被路由器接受,它就会通过传输传送。传输负责实现消息传递例程。不同的驱动程序可以使用 SMTP 通过 Internet 发送、传输到本地 Unix 用户或写入文件。
创建基于内置驱动程序的自定义传输,您可以将匹配的电子邮件发送到您自己的应用程序。然后,您可以在 Exim 之外单独处理每封电子邮件。

与路由器不同,传输的顺序无关紧要。每封传入的电子邮件都将与接受它的路由器指定的单一传输相匹配。在TRANSPORTS CONFIGURATION您的 Exim 文件部分的任何位置添加您的传输。启用拆分配置的 Debian 用户可以在/etc/exim4/conf.d/transports.

这是调用 PHP 脚本的传输:

example_transport:
  driver = pipe
  command = /usr/bin/php /var/www/html/handle_incoming_email.php
  user = www-data
  group = www-data

当与上面的示例路由器结合使用时,发送到的任何电子邮件@example.com都将发送到handle_incoming_email.php. Exim 以符合 RFC 的格式提供整个电子邮件作为命令的标准输入,供您使用编程语言阅读。

// Get email content from standard input in PHP
$email = fopen("php://stdin", "r");
 
// To: user@example.com
// Subject: Demo Email
// 
// This is an email.

传输配置了pipe驱动程序。这使用 Unix 管道将传入的电子邮件提供给您的command. 该命令将作为您指定的用户和组执行。

使用环境变量

Exim 将在执行您的命令之前设置几个环境变量。这些可用于访问有关消息的信息,而无需解析完整的电子邮件格式。

可用变量包括:

  • DOMAIN – 传入电子邮件发送到的域。
  • MESSAGE_ID – 代表电子邮件的 Exim 内部 ID。
  • RECIPIENT – 消息发送到的电子邮件地址。
  • SENDER – 消息源自的电子邮件地址。

您可以通过environment在传输中设置选项来向命令的环境添加其他变量。这接受以逗号分隔的键值对列表:

example_transport:
  environment = foo=bar,demo=example

返回值

您的命令应以0状态代码退出以确认成功交付。非零退出代码将被解释为交付失败。发件人将收到退回邮件。
通过ignore_status在传输中设置选项可以禁用此行为。然后,Exim 会将非零状态代码视为成功。

此外,您可以使用该temp_errors选项来定义脚本退出代码,这些代码表示遇到了错误但预计是暂时的。当 Exim 看到这些状态代码之一时,消息传递将被推迟并稍后重试。

可以使用该return_fail_output选项自定义退回邮件的内容。当它设置为 时true,Exim 将在其退回电子邮件中包含脚本标准输出的内容。该机制有助于使用您的应用程序代码向发件人提供个性化的退回响应。

命令调用

Exim 通常直接从传输调用您的命令。如果您设置了该use_shell选项,它将/bin/sh改为将命令传递给。这在脚本需要完整 shell 环境可用的情况下很有用。

使用默认配置一小时后命令执行超时。超时被视为传递错误。该命令将被终止,并向发件人返回一条退回邮件。超时时间可以通过timeout设置进行自定义。另外设置该timeout_defer选项将导致超时被视为临时错误,允许在延迟后再次尝试传递。

example_transport:
  timeout = 5m
  timeout_defer

您还应该考虑,如果多封电子邮件同时到达,您的脚本可能会同时执行。您的应用程序应该能够承受这种可能性。您的电子邮件处理脚本应该禁用只允许一个实例同时运行的锁定系统。

结论

Exim 很容易配置为将传入的电子邮件路由到您自己的应用程序。通过使用pipe驱动程序耦合到传输的基本路由器,可以实现一个简单的设置来引导所有接收到的消息。

作为应用程序的一部分,您需要提供一个二进制文件来接受标准输入上的电子邮件。每当收到新消息时,Exim 都会调用二进制文件。然后,您应该以符​​合标准的方式解析电子邮件,以提取与您的系统相关的正文内容和邮件标题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mikes zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值