如何配置sendmail ldap路由以在使用mailRoutingAddress时查找最终收件人的邮件主机

如何配置sendmail ldap路由以在使用mailRoutingAddress时查找最终收件人的邮件主机,ldap,sendmail,Ldap,Sendmail,我正在使用sendmail/openldap在地理分布的集群中传递邮件。这是工作的大部分,但我有一个问题,邮件转发 当我为同一域中的用户设置LDAP mailRoutingAddress时,sendmail不会获取最终收件人的mailHost,而是执行本地传递。我知道这是预期的行为,但我需要找到一种方法,让sendmail在完成mailRoutingAddress(ldapmra)的映射重写后,为新收件人执行LDAP mailHost查找(ldapmh) 我希望有人对sendmail有一定的了解

我正在使用sendmail/openldap在地理分布的集群中传递邮件。这是工作的大部分,但我有一个问题,邮件转发

当我为同一域中的用户设置LDAP mailRoutingAddress时,sendmail不会获取最终收件人的mailHost,而是执行本地传递。我知道这是预期的行为,但我需要找到一种方法,让sendmail在完成mailRoutingAddress(ldapmra)的映射重写后,为新收件人执行LDAP mailHost查找(ldapmh)

我希望有人对sendmail有一定的了解,可以建议修改sendmail规则以插入LDAP mailHost查找(请参阅解析器输出中的##注释)

典型的LDAP条目可能如下所示:

dn: uid=allan, dc=my, dc=example
mailLocalAddress: allan@my.example
mailRoutingAddress: babs@my.example

dn: uid=babs, dc=my, dc=example
mailLocalAddress: babs@my.example
mailHost: east.my.example

dn: uid=chuck, dc=my, dc=example
mailLocalAddress: chuck@my.example
mailHost: west.my.example

dn: uid=diane, dc=my, dc=example
mailLocalAddress: diane@my.example
mailRoutingAddress: someuser@freemail.example
下面是一个示例解析器输出

   mailgw# sendmail -d -bt
Version 8.14.7

###debug output redacted

============ SYSTEM IDENTITY (after readcf) ============
      (short domain name) $w = mailgw
  (canonical domain name) $j = mailgw.my.example
         (subdomain name) $m = my.example
              (node name) $k = mailgw.my.example
========================================================

ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> /parse allan@my.example
crackaddr(allan@my.example)
crackaddr=>` 0x81 g'
Cracked address =  0x81 g
Parsing envelope recipient address

--parseaddr(allan@my.example)
canonify           input: allan @ my . example
Canonify2          input: allan < @ my . example >
map_lookup(host, my.example) => host_map_lookup(my.example) => map_rewrite(my.example), av =
    my.example
map_rewrite => my.example.
FOUND my.example
my.example. (0)
Canonify2        returns: allan < @ my . example . >
canonify         returns: allan < @ my . example . >
parse              input: allan < @ my . example . >
Parse0             input: allan < @ my . example . >
map_lookup(dequote, allan) => NOT FOUND (0)
Parse0           returns: allan < @ my . example . >
ParseLocal         input: allan < @ my . example . >
ParseLocal       returns: allan < @ my . example . >
Parse1             input: allan < @ my . example . >
LDAPExpand         input: < allan < @ my . example . > > < allan @ my . example > < >
map_lookup(ldapmra, allan@my.example) => map_rewrite(babs@my.example), av =
    allan@my.example
map_rewrite => babs@my.example
babs@my.example (0)
map_lookup(ldapmh, allan@my.example) => NOT FOUND (68)
canonify           input: babs @ my . example
Canonify2          input: babs < @ my . example >
map_lookup(host, my.example) => host_map_lookup(my.example) => CACHE my.example
#### COMMENT: This is where I need to dip LDAP
map_rewrite(my.example), av =
    my.example
map_rewrite => my.example.
my.example. (0)
Canonify2        returns: babs < @ my . example . >
canonify         returns: babs < @ my . example . >
Parse0             input: babs < @ my . example . >
map_lookup(dequote, babs) => NOT FOUND (0)
Parse0           returns: babs < @ my . example . >
LDAPExpand       returns: babs < @ my . example . >
map_lookup(virtuser, babs@my.example) => map_rewrite(babs), av =
    babs@my.example
    babs
map_rewrite => babs
babs (0)
Recurse            input: babs
canonify           input: babs
Canonify2          input: babs
Canonify2        returns: babs
canonify         returns: babs
parse              input: babs
Parse0             input: babs
map_lookup(dequote, babs) => NOT FOUND (0)
Parse0           returns: babs
ParseLocal         input: babs
ParseLocal       returns: babs
Parse1             input: babs
Parse1           returns:  0x96  local  0x98  babs
parse            returns:  0x96  local  0x98  babs
Recurse          returns:  0x96  local  0x98  babs
Parse1           returns:  0x96  local  0x98  babs
parse            returns:  0x96  local  0x98  babs
2                  input: babs
2                returns: babs
EnvToL             input: babs
EnvToL           returns: babs
final              input: babs
final            returns: babs
parseaddr-->0xbfbfd8c0=allan@my.example:
    mailer 8 (local), host `'
    user `babs', ruser `<null>'
    state=OK, next=0x0, alias 0x0, uid 0, gid 0
    flags=180<QPINGONFAILURE,QPINGONDELAY>
    owner=(none), home="(none)", fullname="(none)"
    orcpt="(none)", statmta=(none), status=(none)
    finalrcpt="(none)"
    rstatus="(none)"
    statdate=(none)
mailer local, user babs
mailgw#sendmail-d-bt
版本8.14.7
###编辑调试输出
=============系统标识(读取CF后)============
(短域名)$w=mailgw
(规范域名)$j=mailgw.my.example
(子域名)$m=my.example
(节点名称)$k=mailgw.my.example
========================================================
地址测试模式(未自动调用规则集3)
进入
>/parseallan@my.example
crackaddr(allan@my.example)
crackaddr=>`0x81 g'
破解地址=0x81 g
解析信封收件人地址
--解析程序(allan@my.example)
规范化输入:allan@my。例子
Canonify2输入:allan<@my。示例>
映射查找(主机,my.example)=>主机映射查找(my.example)=>映射重写(my.example),av=
我的例子
map_rewrite=>my.example。
找到我的例子
我的榜样。(0)
Canonify2返回:allan<@my。示例。>
圣化归来:艾伦<@my。示例。>
解析输入:allan<@my。示例。>
Parse0输入:allan<@my。示例。>
映射查找(dequote,allan)=>未找到(0)
Parse0返回:allan<@my。示例。>
解析本地输入:allan<@my。示例。>
解析本地返回:艾伦<@my。示例。>
Parse1输入:allan<@my。示例。>
LDAPExpand输入:><艾伦@my。示例><>
地图查找(ldapmra,allan@my.example)=>映射_重写(babs@my.example),av=
allan@my.example
map_rewrite=>babs@my.example
babs@my.example (0)
地图查找(ldapmh,allan@my.example)=>未找到(68)
规范化输入:babs@my。例子
Canonify2输入:babs<@my。示例>
映射查找(host,my.example)=>主机映射查找(my.example)=>缓存my.example
####注释:这就是我需要使用LDAP的地方
地图重写(我的示例),av=
我的例子
map_rewrite=>my.example。
我的榜样。(0)
Canonify2返回:babs<@my。示例。>
圣化回归:babs<@my。示例。>
Parse0输入:babs<@my。示例。>
映射查找(dequote,babs)=>未找到(0)
Parse0返回:babs<@my。示例。>
LDAPExpand返回:babs<@my。示例。>
地图查找(virtuser,babs@my.example)=>地图重写(babs),av=
babs@my.example
巴布斯
map_rewrite=>babs
巴布斯(0)
递归输入:babs
规范化输入:babs
Canonify2输入:babs
Canonify2返回:babs
规范化回报:babs
解析输入:babs
Parse0输入:babs
映射查找(dequote,babs)=>未找到(0)
Parse0返回:babs
本地输入:babs
本地返回:babs
Parse1输入:babs
Parse1返回:0x96本地0x98 babs
解析返回:0x96本地0x98 babs
递归返回:0x96本地0x98 babs
Parse1返回:0x96本地0x98 babs
解析返回:0x96本地0x98 babs
2输入:babs
2返回:babs
环境输入:babs
环境报告:babs
最终输入:babs
最终退货:babs
parseaddr-->0xBFD8C0=allan@my.example:
邮件8(本地),主机`'
用户'babs',ruser`'
状态=OK,下一个=0x0,别名0x0,uid 0,gid 0
旗帜=180
所有者=(无),主页=(无),全名=(无)
orcpt=“(无)”,状态=(无),状态=(无)
finalrcpt=“(无)”
rstatus=“(无)”
statdate=(无)
mailer本地,用户babs

您是否考虑过使用
virusertable
重写收件人地址
virtusertable
也可以是“基于LDAP”的,但每个收件人最多可以执行7次查找。我确实使用LDAP进行virtusertable查找,这是可以预期的。从技术上讲,它可能会起作用,但它需要在几个地方对我们的总体架构进行一些根本性的更改,这会使事情变得非常复杂。如果可以将它集成到sendmail.cf补丁中,对我来说就容易多了。您是否考虑过使用
virusertable
重写收件人地址
virtusertable
也可以是“基于LDAP”的,但每个收件人最多可以执行7次查找。我确实使用LDAP进行virtusertable查找,这是可以预期的。从技术上讲,它可能会起作用,但它需要在几个地方对我们的总体架构进行一些根本性的更改,这会使事情变得非常复杂。如果可以将它应用到sendmail.cf补丁中,对我来说就容易多了。