Phil,

Thanks for the tips!

I do know (by trial and error), that if we do a DNS quesry for the MX, and 
the first MX fails (because the IP returned cant be assigned), that it will 
try the second, then third.

I will have to test the examples you sent to see if it will try the MX, then 
the A. If the A record also fails, is there a way to set a deault IP with 
the syntax you used?

-Grant


----- Original Message ----- 
From: "Phil Pennock" <[email protected]>
To: "Grant Peel" <[email protected]>
Cc: <[email protected]>
Sent: Tuesday, October 06, 2009 8:50 PM
Subject: Re: [exim] Outgoing Interface


> On 2009-10-06 at 09:58 -0400, Grant Peel wrote:
>> Hi all,
>>
>> I would like to set the outgoing interface to the IP address assigned to 
>> the user's domian.
>>
>> The problem I am encountering is that not all domains have thier MX set 
>> to an IP on our server (because some domains are using a mail filtering 
>> server that relays the message to our server after filtering).
>>
>> Is there a way to rewrite the transport's 'interface' lines below, so it 
>> will attempt to use the MX, then the A record, then a default IP (the 
>> servers main IP) in that order?
>
> I believe so.
>
> Note that a dnsdb mxh lookup will return multiple hosts and you're not
> setting a list separator, so that would also fail if sending with a
> sender address in a domain with multiple MX records.
>
> Also, the interface is supposed to be specified as a list of IP
> addresses.
>
> How about IPv6?  Heck, it's easier to have IP-per-customer with IPv6.
>
> [Beware: long lines below, 80-column viewers may wrap or need scroll]
>
> IPv4-only:
>  ${lookup dnsdb{>; a= <; ${lookup dnsdb{>; mxh=$sender_address_domain}} ; 
> $sender_address_domain }}
>
> This says to do a lookup, using semi-colon as list separator for output,
> of the A records given as a semi-colon separated list; we then use MXH
> pseudo-type items to get the MX hostnames, results separated by
> semi-colon, and then add the domain itself on at the end, all used as
> input.
>
> IPv6/IPv4:
>  ${lookup dnsdb{>; aaaa= <; ${lookup dnsdb{>; mxh=$sender_address_domain}} 
> ; $sender_address_domain }} ; \
>  ${lookup dnsdb{>; a= <; ${lookup dnsdb{>; mxh=$sender_address_domain}} ; 
> $sender_address_domain }}
>
> Note the marked similarity there.
>
> Now, I forget whether or not the interface directive ignores IPs not
> locally bound or whether or not that results in an error.  Skimming the
> source, it looks like you need to filter this.  The @[] list includes
> all the IP addresses of the host that Exim is running on.  We can use
> that to filter.
>
>  ${filter{<string>}{<condition>}}
>
> Conveniently, filter reuses the list separator for the input list when
> generating the output list.
>
> So:
>
>  ${filter{<; ${lookup dnsdb{>; aaaa= <; ${lookup dnsdb{>; 
> mxh=$sender_address_domain}} ; $sender_address_domain }} ; \
>              ${lookup dnsdb{>; a= <; ${lookup dnsdb{>; 
> mxh=$sender_address_domain}} ; $sender_address_domain }}}\
>   {match_ip{$ite...@[]}}}
>
> Finally, remember to tell interface of the list separator and the
> default IPs:
>
>   interface = <; $STUFF_FROM_ABOVE ; @[]
>
>> #       interface       = ${lookup dnsdb{a=${lookup 
>> dnsdb{mxh=$sender_address_domain}}}}
>
> Lather, rinse, repeat.
>
> Around about now, I wish Exim had user-defined functions written in
> Exim's configuration language.  ;)  Well, you can always write it in
> Perl or C and use the ${perl...} or ${dlfunc...} expansions.
>
> -Phil
>
> -- 
> ## 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/
> 


-- 
## 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