在 Debian 上的 Exim4 中根据 From: 地址(发件人地址)选择智能主机

问题描述 投票:0回答:1

这个问题是关于 Exim 中正则表达式的使用,所以 虽然它有点异国情调,但我相信它是这里的主题。如果大家一致认为情况并非如此,我将不胜感激关于将其发布在哪里的建议。

我在 Debian 11.6(牛眼)上使用 Exim 4.94.2-7,并且我还在 Exim4 上使用 Debian 配置系统,其中涉及像

/etc/exim4/update-exim4.conf.conf
这样的文件。

我一直在尝试配置 Exim 以根据以下条件选择智能主机 发件人地址(发件人地址)。描述的解决方案 马克·奥斯兰德 [debian-user] 基于发件人的 exim4 智能主机选择 对我有用,尽管它可能并不完美。

有关此内容的更多背景信息,请参阅我在线程中的第一篇文章: [Pkg-exim4-users] 如何根据 Exim4 中的 From: 地址选择智能主机

我对 Marc Auslander 的解决方案稍加修改,设置了 /etc/exim4/update-exim4.conf.conf 中 dc_smarthost 的值为 如下。

dc_smarthost='"${if match{${lc:$header_from:}}{.*gmail.com}{smtp.gmail.com::587}{${if match{${lc:$header_from:}}{.*mydomain}{smtp.mailbox.org::587}{secure-email-32.luxsci.com::587}}}}"'

这使用了中描述的语法 [Exim Internet Mailer] 第 11 章 - 字符串扩展 第 5 节:扩展项,即

 ${if <condition> {<string1>}{<string2>}}

第7节:扩展条件,即

 match {<string1>}{<string2>}

或者,如果您有 Exim 官方书籍,“The Exim SMTP Mail Server”(我的版本是“Official Guide for Release 4”,第一版, 2003 年出版),该语法在第 17.7 节中讨论,其中

match
第 17.7.3 节涵盖。

用伪代码来说,这是

if the from header matches the regex .*gmail.com
    then
        use smtp.gmail.com::587
else if the from header matches .*mydomain
    then
        use smtp.mailbox.org::587
else # default if nothing else matches
        use secure-email-32.luxsci.com::587

这对我有用,尽管可能存在一些有问题的边缘 案例。但是,当我尝试将其修改为 如下。

dc_smarthost='"${if match{${lc:$header_from:}}{.*gmail.com}{smtp.gmail.com::587}{${if match{${lc:$header_from:}}{.*mydomain|.*mailbox.org}{smtp.mailbox.org::587}{secure-email-32.luxsci.com::587}}}}"'

这与之前的版本类似,但就伪代码而言, 这只是替换

else if the from header matches .*mydomain

else if the from header matches .*mydomain|.*mailbox.org

即from 标头匹配

.*mydomain
.*mailbox.org

错误是:

Mar 30 01:59:54 orwell exim4[3626569]: sed: -e expression #1, char 861: unknown option to `s'

我搜索了这个错误,它似乎最常发生 当

sed
尝试处理带有正斜杠的文本时。但我有 不知道这个错误在这里意味着什么。据我所知我正在使用 语法正确; Exim4 使用 PCRE 正则表达式。

对此错误的解释将不胜感激。一个版本 这个有效的正则表达式将更受赞赏。另外,如果 如果您发现一般方法有任何问题,请告诉我 知道。我见过的其他解决方案都涉及传输、路由器、 还有很多样板文件,看起来相当复杂。

regex debian pcre exim4
1个回答
0
投票

我会为每个智能主机设置一个路由器,并使用

senders
选择器来确定使用哪一个。

gmail_router:
   router = manualroute
   senders = gmail.com
   transport = remote_smtp_smarthost
   route_list = * smtp.gmail.com::587 by_dns

或类似的。

© www.soinside.com 2019 - 2024. All rights reserved.