Hi, > Am 11.06.2015 um 23:45 schrieb Eric Ripa <[email protected]>: > > I haven't looked at the patch or in detail (I'm on my phone at the moment), > but I've been through the same dance with one of my setups. Although I use > Cyrus IMAP. > > I also tracked the issue to RCTP TO. But instead of patching deliver to lmtp > I simply use "recipient" instead of "virtual" and the relay to > lmtp://127.0.0.1:port instead of deliver to the Unix socket.
Yes, but then you can not handle things like: info@domain -> user1@domain, user2@domain > It at least works for my quite limited use in this case (only a handful > users, but with multiple domains). Yes, too much limitation. For me, the above is a must have. > As far as I know dovecot also allows LMTP over TCP instead of Unix sockets. > Have you tried my approach? Yes. Thanks, Regards, Jörg > Best regards > Eric Ripa > >> On 11 Jun 2015, at 23:24, Joerg Jung <[email protected]> wrote: >> >> Hi, >> >> please find below a diff which enhances deliver to LMTP. >> >> Gilles suggested to bring this diff to misc@ to gain a wider audience >> and hopefully receive some comments from actual LMTP users. >> >> tl;dr >> "deliver to lmtp" delivers to (system) users only, making it hard to >> be used in common virtual users setups (with single system user). >> Therefore, I provide a diff which adds a parameter to >> specify/expands RCPT TO within LMTP. >> >> This was described earlier already [1], but no solution. >> >> Let me explain the rationale/background of the diff below a bit: One of >> my production servers runs Sendmail/Dovecot and I would like to migrate >> it to OpenSMTPD/Dovecot. The server uses virtual users in a common >> scenario: with all mail addresses mapped to a single system user/uid/gid >> (called vmail in my case). Dovecot uses a (static) userdb to map the >> IMAP maildirs and addresses. Now I have three options to bring incoming >> mails from OpenSMTPD to Dovecot: >> >> 1. deliver to maildir >> Unfortunately, not an option in my case, because I heavily use Sieve >> and Quotas on the Dovecot server. Both require updates/processing on >> delivery. >> >> 2. deliver to mda "dovecot-lda -a ${rcpt} ..." >> Would work fine, and is what I have done before with Sendmail as >> well. But requires me to fiddle with dovecot-lda options, poor >> performance, and expansions and user permissions, as it needs >> adjusting for the "single system user all virtual" setup mentioned >> above... thus a bit annoying to setup. >> >> 3. deliver to lmtp "/var/dovecot/lmtp" >> IMHO, the most easy and straight forward option, also preferred >> nowadays, due to better performance [2]. Not useable in my >> scenarios, as deliver_lmtp.c always uses the (system) user in >> RCPT TO. >> >> So the diff below addresses this and makes it possible to >> specify/expand the RCPT TO. >> >> Items for Discussion: >> - In a first version of this diff and as suggested in [1], I added a >> new keyword RCPT, e.g. ... deliver to lmtp "..." rcpt "${rcpt}", I >> decided to leave it away as it simplifies things and does not require >> to mess with rule_to_text() and A_LMTP >> - In a second version I added an additional variable to store and >> separate actual lmtp host:port/socket and expanded recipient... >> (similar to r_delivery_user) but this required a lot of more changes >> in several files to copy things around, and even an additional enum >> expand_type might be required: EXPAND_LMTP, or something. So for the >> sake of simplicity I decided against this approach. >> - Another approach to solve this problem, as suggested in Dovecot >> Wiki [3], is to override the RCPT TO with setting >> X-Original-Recipient Header (different approach, different diff). >> I do not like this idea of injecting additional header in LMTP >> session, thus I went with the approach below. >> >> Please: comments, suggestions, other approaches, right/wrong direction, >> rants, flames,... ? >> >> Thanks, >> Regards, >> Joerg >> >> [1] https://www.mail-archive.com/[email protected]/msg00531.html >> [2] http://wiki2.dovecot.org/LDA >> [3] http://wiki2.dovecot.org/LMTP >> >> >> ---------------------------------------------------------------- >> >> >> smtpd/delivery_lmtp.c | 10 ++++------ >> smtpd/parse.y | 22 ++++++++++++++++++++++ >> smtpd/smtpd.conf.5 | 13 ++++++++++++- >> 3 files changed, 38 insertions(+), 7 deletions(-) >> >> diff --git a/smtpd/delivery_lmtp.c b/smtpd/delivery_lmtp.c >> index 5080c46..6c55994 100644 >> --- a/smtpd/delivery_lmtp.c >> +++ b/smtpd/delivery_lmtp.c >> @@ -137,16 +137,14 @@ unix_socket(char *path) { >> static void >> delivery_lmtp_open(struct deliver *deliver) >> { >> - char *buffer; >> - char *lbuf; >> + char *buffer, *lbuf, *rcpt = deliver->to; >> char lhloname[255]; >> int s; >> - FILE *fp; >> + FILE *fp = NULL; >> enum lmtp_state state = LMTP_BANNER; >> size_t len; >> >> - fp = NULL; >> - >> + strsep(&rcpt, " "); >> if (deliver->to[0] == '/') >> s = unix_socket(deliver->to); >> else >> @@ -183,7 +181,7 @@ delivery_lmtp_open(struct deliver *deliver) >> case LMTP_MAIL_FROM: >> if (buffer[0] != '2') >> errx(1, "MAIL FROM rejected: %s\n", buffer); >> - fprintf(fp, "RCPT TO:<%s>\r\n", deliver->user); >> + fprintf(fp, "RCPT TO:<%s>\r\n", rcpt ? rcpt : deliver->user); >> state = LMTP_RCPT_TO; >> break; >> >> diff --git a/smtpd/parse.y b/smtpd/parse.y >> index b73ed7f..8523dd4 100644 >> --- a/smtpd/parse.y >> +++ b/smtpd/parse.y >> @@ -1161,6 +1161,28 @@ deliver_action : DELIVER TO MAILDIR { >> fatal("invalid lmtp destination"); >> free($4); >> } >> + | DELIVER TO LMTP STRING STRING deliver_as { >> + rule->r_action = A_LMTP; >> + if (strchr($4, ':') || $4[0] == '/') { >> + if (strlcpy(rule->r_value.buffer, $4, >> + sizeof(rule->r_value.buffer)) >> + >= sizeof(rule->r_value.buffer)) >> + fatal("lmtp destination too long"); >> + } else >> + fatal("invalid lmtp destination"); >> + if (strchr($5, '%')) { >> + if (strlcat(rule->r_value.buffer, " ", >> + sizeof(rule->r_value.buffer)) >> + >= sizeof(rule->r_value.buffer) || >> + strlcat(rule->r_value.buffer, $5, >> + sizeof(rule->r_value.buffer)) >> + >= sizeof(rule->r_value.buffer)) >> + fatal("lmtp recipient too long"); >> + } else >> + fatal("invalid lmtp recipient"); >> + free($4); >> + free($5); >> + } >> | DELIVER TO MDA STRING deliver_as { >> rule->r_action = A_MDA; >> if (strlcpy(rule->r_value.buffer, $4, >> diff --git a/smtpd/smtpd.conf.5 b/smtpd/smtpd.conf.5 >> index 72d3811..eb76ad6 100644 >> --- a/smtpd/smtpd.conf.5 >> +++ b/smtpd/smtpd.conf.5 >> @@ -287,13 +287,22 @@ accept for domain opensmtpd.org forward-only >> .Pp >> Finally, the method of delivery is specified: >> .Bl -tag -width Ds >> -.It Ic deliver to lmtp Op Ar host : Ns Ar port | socket >> +.It Xo >> +.Ic deliver to lmtp >> +.Op Ar host : Ns Ar port | socket >> +.Op Ar rcpt >> +.Xc >> Mail is delivered to >> .Ar host : Ns Ar port , >> or to the >> .Ux >> .Ar socket >> over LMTP. >> +Optionally, >> +.Ar rcpt >> +might specify a recipient. >> +The latter parameter may use conversion specifiers that are expanded before >> use >> +.Pq see Sx FORMAT SPECIFIERS . >> .It Ic deliver to maildir Ar path >> Mail is added to a maildir. >> Its location, >> @@ -911,7 +920,9 @@ descriptions. >> .Ss FORMAT SPECIFIERS >> Some configuration directives support expansion of their parameters at >> runtime. >> Such directives (for example >> +.Ic deliver to lmtp , >> .Ic deliver to maildir , >> +and >> .Ic deliver to mda ) >> may use format specifiers which will be expanded before delivery or >> relaying.
