Alternative ways of sendmail & cyrus integration [Was: Virtual domains, user@domain.com: Mailbox unknown]

William K. Hardeman wont-i at wkh.org
Mon Mar 8 19:30:53 EST 2004


--On Thursday, 26 February, 2004 18:10 +0100 Andrzej Filip 
<anfi at priv.onet.pl> wrote:

> Below please find modified sendmail.mc lines to make sendmail check cyrus
> mailbox existence using socket map [instead of fstat map]:
> ----->
> dnl
> dnl *.mc file modifications for real time integration of cyrus and
> sendmail
> dnl
> dnl It makes sendmail define user map in sendmail.cf
> define(`LUSER_RELAY')
> LOCAL_CONFIG
># cyrus - map for file stat checking
> Kcyrus socket local:_path_to_smmapd_socket_
> dnl
> dnl
> LOCAL_RULESETS
> SLocal_localaddr
># Treat system mailboxes as usual
> R$+             $: $(user $1 $)
> R$+ <>          $@
># Detect cyrus mailboxes - deliver via cyrus mailer
> R$+             $: $1 <$(cyrus $1 $: $)>
> R$<$+>          $# cyrus $: @$1
># Treat remaining as usual
> R$*             $@
> <-----
>
> I hope will publish next version next week:
> * capable to support cyrus virtual domains
> * milter-sender friendly
> [current version creates problems with checking local address validity]

I couldn't get the above config to work in my patched sendmail 8.12.11, so 
I've been playing around with it for several days now, and I've got the 
following working for 99% of my situations. The only time it does NOT work 
is in one virtual host situation. All of my other tests return true.

-------<start domain.mc config>----------
dnl # Local mailer definition
define(`confLOCAL_MAILER', `cyrusv2virtdomain')dnl

dnl # Acceptable mailers
MAILER(`local')dnl
MAILER(`smtp')dnl
MAILER(`cyrusv2virtdomain')dnl

dnl # Custom rulesets defined below

dnl # LOCAL_CONFIG custom definitions
LOCAL_CONFIG
# cyrus - map for checking cyrus maibox presence
Kcyrus socket -T<TMPF> local:SMMAP_SOCKET

LOCAL_RULESETS
SLocal_localaddr
# Treat system mailboxes as usual
R$+             $: $(user $1 $)
R$+ <>          $@
# Detect cyrus mailboxes - deliver via cyrus mailer
R$*                             $: $1 $| $>"Cyrusvmap" $1
R$+ $| $#ok                     $@ $# cyrusv2virtdomain $: @$1
R$- @ $- . $* $| $#$*           $: $1@$2.$3 $| $>"Cyrusvmap" $1@$3
R$+ $| $#ok                     $@ $# cyrusv2virtdomain $: @$1
R$- + $* @ $- . $* $| $#$*      $: $1+$2@$3.$4 $| $>"Cyrusvmap" $1+$2@$4
R$+ $| $#ok                     $@ $# cyrusv2virtdomain $: @$1
R$- + $* @ $- . $* $| $#$*      $: $1+$2@$3.$4 $| $>"Cyrusvmap" $1+$2@$3.$4
R$+ $| $#ok                     $@ $# cyrusv2virtdomain $: @$1
R$+ $| $#$*                     $#$2
# Treat remaning as usual
R$*             $@

SCyrusvmap
R$*             $: $(cyrus $1 $: $)
R$@             $#error $@ nouser $: "551 Unknown user"
-------<end domain.mc config>----------

For completeness, this is the cyrusv2.cf file modified per the Cyrus 2.2.x 
to support virtual domains. I chose to create a new mailer instead of just 
modifying the standard cyrusv2.cf file.

-------<start cyrusv2virtdomain.cf config>----------
PUSHDIVERT(-1)
#
# Copyright (c) 2002 Sendmail, Inc. and its suppliers.
#       All rights reserved.
#
# By using this file, you agree to the terms and conditions set
# forth in the LICENSE file which can be found at the top level of
# the sendmail distribution.
#
#       Contributed by Kenneth Murchison.
#

_DEFIFNOT(`_DEF_CYRUSV2VIRTDOMAIN_MAILER_FLAGS', `lsDFMnqXz')
_DEFIFNOT(`CYRUSV2VIRTDOMAIN_MAILER_FLAGS', `1A5@/:|m')
ifdef(`CYRUSV2VIRTDOMAIN_MAILER_ARGS',, 
`define(`CYRUSV2VIRTDOMAIN_MAILER_ARGS', `FILE /var/imap/socket/lmtp')')
define(`_CYRUSV2VIRTDOMAIN_QGRP', 
`ifelse(defn(`CYRUSV2VIRTDOMAIN_MAILER_QGRP'),`',`', ` 
Q=CYRUSV2VIRTDOMAIN_MAILER_QGRP,')')dnl

POPDIVERT

#########################################
###   Cyrus V2 Mailer specification   ###
#########################################

VERSIONID(`$Id: cyrusv2virtdomain.m4,v 1.5 2004/02/18 08:01:26 wont Exp $')

Mcyrusv2virtdomain,     P=[IPC], 
F=_MODMF_(CONCAT(_DEF_CYRUSV2VIRTDOMAIN_MAILER_FLAGS, 
CYRUSV2VIRTDOMAIN_MAILER_FLAGS),`CYRUSV2VIRTDOMAIN'),
                S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n,
                _OPTINS(`CYRUSV2VIRTDOMAIN_MAILER_MAXMSGS', `m=', `, 
')_OPTINS(`CYRUSV2VIRTDOMAIN_MAILER_MAXRCPTS', `r=', `, 
')_OPTINS(`CYRUSV2VIRTDOMAIN_MAILER_CHARSET', `C=', `, 
')T=DNS/RFC822/SMTP,_CYRUSV2VIRTDOMAIN_QGRP
                A=CYRUSV2VIRTDOMAIN_MAILER_ARGS
-------<end cyrusv2virtdomain.cf config>----------

As I mentioned above, there is one situation where I have found that the 
above configuration does not work. This is when email is sent to a 
canonical hostname in the virtual domain. For example, mail to 
wont-i at wkh.org succeeds with no problems. Mail sent to wont-i at mail.wkh.org, 
however, does not succeed. Where I've run into problems, according to the 
debug, is that in the 2nd case, mail.wkh.org never makes it into the 
mailertable definition, but gets rewritten to the primary host's canonical 
hostname in the virtusertable steps, e.g., wont-i at mail.wkh.org becomes 
wont-i at mail.hands-solutions.com. In the first example, wont-i at wkh.org 
successfully makes it to the mailertable lookup, and everything works 
successfully from there. Since I very very rarely have any mail sent to the 
MX record's canonical host name, I can live with this (for now anyway :-).

I hope this helps others fighting the same battle I've been fighting.
Will

----------------------------------------------------------------------------
William K. Hardeman
wont-i at wkh.org
http://www.wkh.org

The most exciting phrase to hear in science, the one that heralds new
discoveries, is not "Eureka!" (I found it!) but "That's funny ..."
                -- Isaac Asimov

Always listen to experts. They'll tell you what can't be done and why. Then
do it.
--Robert A. Heinlein
---
Home Page: http://asg.web.cmu.edu/cyrus
Wiki/FAQ: http://cyruswiki.andrew.cmu.edu
List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html




More information about the Info-cyrus mailing list