Phil Pennock wrote:
> On 2009-05-26 at 15:08 -0700, Phil Pennock wrote:
>   
>> On 2009-05-25 at 11:47 +0100, Mike Cardwell wrote:
>>     
>>> Thomas Klaver wrote:
>>>
>>>       
>>>> Is it possible to retrieve the highest prioritized MX record using a
>>>> dnsdb lookup? If so, how?
>>>>         
>>> The results returned by dnsdb when doing an mx or mxh lookup are not 
>>> ordered by priority:
>>>
>>> r...@haven:~# exim4 -be '${lookup dnsdb{mx=googlemail.com}}'
>>> 30 alt3.gmail-smtp-in.l.google.com
>>> 40 alt4.gmail-smtp-in.l.google.com
>>> 5 gmail-smtp-in.l.google.com
>>> 10 alt1.gmail-smtp-in.l.google.com
>>> 20 alt2.gmail-smtp-in.l.google.com
>>> r...@haven:~#
>>>
>>> I'm not sure how you could pick out the item with the lowest priority 
>>> using Exim expansions.
>>>       
>> ${reduce{<\n ${lookup dnsdb{mx=googlemail.com}}}{65535 .}{${if 
>> <{${extract{1}{ }{$item}}}{${extract{1}{ }{$value}}}{$item}{$value}}}}
>>     
>
> Note that this will reject a legitimate singleton MX at priority 65535.
> It's better to just use a higher-than-16bit-unsigned start value.  Eg,
> 70000.  It will also result in "65535 ." being returned for the NOERROR
> empty response case; eg, a lookup where there's an A record but no MX.
>
> So the fix is to use 70000 as the initial seed and then check for
> "70000 ." for errors.  In an ACL, you might have:
>
>   warn set acl_m_lowest_mx = ${reduce{<\n ${lookup dnsdb{mx=$domain}}}{70000 
> .}{${if <{${extract{1}{ }{$item}}}{${extract{1}{ }{$value}}}{$item}{$value}}}}
>
>   deny condition = ${if eq{$acl_m_lowest_mx}{70000 .}}
>        message = "No MX records found for $domain"
>
> Otherwise, because comparators like eq{} don't store the two tested
> values in variables for use later in the expansion, you're stuck
> re-evaluating -- which should be fast, because the results will be
> cached, but not pretty.  Even if we regard my first response as pretty,
> this one does not qualify.
>
> ${if !eq{${reduce{<\n ${lookup dnsdb{mx=$domain}}}{70000 .}{${if 
> <{${extract{1}{ }{$item}}}{${extract{1}{ }{$value}}}{$item}{$value}}}}}{70000 
> .}{${reduce{<\n ${lookup dnsdb{mx=$domain}}}{70000 .}{${if <{${extract{1}{ 
> }{$item}}}{${extract{1}{ }{$value}}}{$item}{$value}}}}}fail}
>
> However, just because it's not pretty, that doesn't mean it doesn't
> work.  Exim provides enough flexibility to let you do whatever you want,
> rather than constraining you to the solutions which are provided by the
> more normal convenience features.
>
> Provided that you built Exim with dnsdb support, of course.
>
> -Phil
>
>   

My opinion - for what it's worth, is that this functionality should be 
built into Exim as a feature.


-- 
## List details at http://lists.exim.org/mailman/listinfo/exim-users 
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://wiki.exim.org/

Reply via email to