On Sat, Dec 27, 2014 at 11:56:29AM +0000, Florian Obser wrote: > Hi, > > so I want to run smtpd(8) as a backup MX and configure the list of > valid email addresses so that the backup MX rejects invalid > email addresses on accepting the message and not bounce > the mail alter on when it tries to deliver to the primary > mail server. > Currently I have this: > accept from any for domain <domains> recipient <recipients> \ > relay backup hostname "primary.mx.example.com" > > Assuming I have example.com in the domains table and > u...@example.com in the recipient table smptd rejects > rcpt to: <user+...@example.com> > with > 550 Invalid recipient > > rcpt to: <u...@example.com> > works just fine. > > This is on -current. > > How can I get +TAG to work on the backup MX? >
This diff should do the trick. It teaches "sender" and "recipient" how to cope with tags in addresses. Let me know how it goes for you. diff --git a/smtpd/table.c b/smtpd/table.c index 66fdb7a..cc61e74 100644 --- a/smtpd/table.c +++ b/smtpd/table.c @@ -347,6 +347,12 @@ table_update(struct table *t) return (t->t_backend->update(t)); } + +/* + * quick reminder: + * in *_match() s1 comes from session, s2 comes from table + */ + int table_domain_match(const char *s1, const char *s2) { @@ -358,6 +364,7 @@ table_mailaddr_match(const char *s1, const char *s2) { struct mailaddr m1; struct mailaddr m2; + char *p; if (! text_to_mailaddr(&m1, s1)) return 0; @@ -367,9 +374,17 @@ table_mailaddr_match(const char *s1, const char *s2) if (! table_domain_match(m1.domain, m2.domain)) return 0; - if (m2.user[0]) + if (m2.user[0]) { + /* if address from table has a tag, we must respect it */ + if (strchr(m2.user, '+') == NULL) { + /* otherwise, strip tag from session address if any */ + p = strchr(m1.user, '+'); + if (p) + *p = '\0'; + } if (strcasecmp(m1.user, m2.user)) return 0; + } return 1; } -- Gilles Chehade https://www.poolp.org @poolpOrg