这个问题是关于 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 正则表达式。
对此错误的解释将不胜感激。一个版本 这个有效的正则表达式将更受赞赏。另外,如果 如果您发现一般方法有任何问题,请告诉我 知道。我见过的其他解决方案都涉及传输、路由器、 还有很多样板文件,看起来相当复杂。
我会为每个智能主机设置一个路由器,并使用
senders
选择器来确定使用哪一个。
gmail_router:
router = manualroute
senders = gmail.com
transport = remote_smtp_smarthost
route_list = * smtp.gmail.com::587 by_dns
或类似的。