我有一个 Postfix 服务器并将其与 Outlook(POP/SMTP)一起使用。
我有一个帐户的不同发件人地址。现在我想为特定发件人地址配置中继。例如,我有一个主域 domain1.com 的 postfix。现在我有一个发件人地址,即 domain2.com。
对于该发件人地址,我希望该 postfix 将邮件转发到第二个 SMTP 服务器。我认为这应该可以毫无问题地实现。
但问题是我必须创建到第二台服务器的 SSH 隧道才能连接到 SMTP 服务器。但我不能使用持久的 SSH 连接,所以我想知道 postfix 是否有可能在将邮件转发到第二台 SMTP 服务器之前执行一些脚本。
我已经找到了一些关于在收到电子邮件时执行脚本的信息,但我只想在 postfix 将邮件中继到第二个 SMTP 服务器之前建立 SSH 隧道。
答案1
具体如何实现取决于你,但你可以创建自己的传输,并且该传输可以是脚本或守护进程等。
如果你能让隧道保持畅通,那将是轻而易举的事,你只需设置一个
domain2.com smtp:127.0.0.1:2000(或您本地分配的任何端口)
運輸。
答案2
Postfix 不支持在交付时挂接脚本。为了解决这个问题,您可以设置一个crontab
来执行特殊脚本。此脚本将:
- 设置 SSH 隧道
- 刷新队列。
首先,定义 sender_dependent_relayhost_maps,其右侧值是您的隧道端口(例如端口 2525)。
#/etc/main.cf
sender_dependent_relayhost_maps = hash:/etc/postfix/sshtunnel
#/etc/postfix/sshtunnel
domain2.com smtp:[127.0.0.1]:2525
当隧道未连接时,postfix 将暂时的由于 -error 而推迟发送电子邮件Connection refused
。因此您不必担心丢失电子邮件。
然后设置 crontab 来执行上述脚本。这里是实现这些目标的伪脚本。从这个原始脚本。
#!/bin/sh
#setup ssh tunnel. modify the parameter for your needs
ssh -L 2525:localhost:25 [email protected]
# Start mail deliveries.
/usr/sbin/sendmail -q
# Allow deliveries to start.
sleep 10
# Loop until all messages have been tried at least once.
while mailq | grep '^[^ ]*\*' | grep domain2.com >/dev/null
do
sleep 10
done