Hi,
(respone inline)
Aaron Stone wrote:
In this example, there are three recipients, pat, jones and green. Following
the data command, there are only two acknowledgements. This is contrary to my
understanding that each recipient had to be acknowledged:
The LMTP protocol causes the server to return, after the final "." of
the DATA command, one reply for each recipient. Therefore, if the
queue manager is configured to use LMTP instead of SMTP when
transferring messages to the delivery agents, then the delivery
agents may attempt delivery to each recipient after the final "." and
individually report the status for each recipient. Connections which
should use the LMTP protocol are drawn in the diagram above using
asterisks.
So looking at jones, it is clear why: jones failed the RCPT command, and so
was no longer in the recipient list when the DATA command came around. Then
Clear :)
read this:
The additional restriction is that when there have been no successful
RCPT commands in the mail transaction, the DATA command MUST fail
with a 503 reply code.
The change is that after the final ".", the server returns one reply
for each previously successful RCPT command in the mail transaction,
in the order that the RCPT commands were issued. Even if there were
multiple successful RCPT commands giving the same forward-path, there
must be one reply for each successful RCPT command.
I think that what the first paragraph in this quote means is not that DATA is
failed, per se, but that the whole conversation is flagged with a 503.
So here's what I think needs to be fixed:
- If there are no recipients, use 503 AND NOTHING ELSE to report it,
which means changing this section of code to use a 503:
if (!has_recipients)
{
trace(TRACE_DEBUG,"main(): no valid recipients found, cancel message.");
fprintf((FILE *)stream, "554 No valid recipients.\r\n" );
}
Yep, change the 554 to 503
- When a recipient is failed, report the error and then *remove that
recipient from the dsnusers list* so that after the message is
received, their failure is not reported a second time.
Sounds good :)
I'll get on it this afternoon, please test it in the morning, your time!
I will.
Ilja
Ilja Booij <[EMAIL PROTECTED]> said:
After some more reading of RFC 2033 I'm inclined to believe an LMTP
client does not get a response after sending the DATA, except for the
responses about the delivery of the message to the users.
Example session from the RFC:
S: 220 foo.edu LMTP server ready
C: LHLO foo.edu
S: 250-foo.edu
S: 250-PIPELINING
S: 250 SIZE
C: MAIL FROM:<[EMAIL PROTECTED]>
S: 250 OK
C: RCPT TO:<[EMAIL PROTECTED]>
S: 250 OK
C: RCPT TO:<[EMAIL PROTECTED]>
S: 550 No such user here
C: RCPT TO:<[EMAIL PROTECTED]>
S: 250 OK
C: DATA
S: 354 Start mail input; end with <CRLF>.<CRLF>
C: Blah blah blah...
C: ...etc. etc. etc.
C: .
S: 250 OK
S: 452 <[EMAIL PROTECTED]> is temporarily over quota
C: QUIT
S: 221 foo.edu closing connection
The important bit is after the DATA line
there are two responses from the server after the data line:
1. "250 OK": the message to [EMAIL PROTECTED] was delivered
2. "452 <[EMAIL PROTECTED]> is temporarily over quota", the message to
[EMAIL PROTECTED] was not delivered.
There is no line indicating that the message was received by the server.
The server should only indicate when a message was not received correctly.
I'll complete remove the
fprintf((FILE *)stream, "250 Message received OK\r\n"); line
Ilja Booij wrote:
Hi,
Removing the
"250 Message received OK" after having received the message takes care
of the error. I can just send several messages, with
"lmtp_cache_connection = yes" in /etc/postfix/main.cf
I'm starting to wonder whether LMTP requires us to send a message if the
message was received OK by the server.
Ilja
Ilja Booij wrote:
Hi,
with some help from a guy on [EMAIL PROTECTED] I found something:
The "250 Recipient <[EMAIL PROTECTED]> OK" message from
dbmail-lmtp is out of sync. The postfix/lmtp program stores this
message until the next message is sent, causing the messages between
postfix and dbmail-smtp to be horribly out-of-sync.
I guess this should be quite easy to fix. I'll see if I have some time
to do it this weekend. Otherwise I'll do it on Monday. Unless anybody
else wants to do it of course ;)
I'll be off in a few minutes. First a beer, then it's off to home :)
Have a nice weekend!
Ilja
Ilja Booij wrote:
Hmm, I still don't really understand the problem. I've done some
ngrep-ing, to see what goes over the network.
This is a session that's OK:
T 2004/03/05 13:45:46.324232 127.0.0.1:10024 -> 127.0.0.1:46715 [AP]
220 test01 DBMail LMTP service ready to rock..
##
T 2004/03/05 13:45:46.324696 127.0.0.1:46715 -> 127.0.0.1:10024 [AP]
LHLO test01.office.fastxs.net..
##
T 2004/03/05 13:45:46.324900 127.0.0.1:10024 -> 127.0.0.1:46715 [AP]
250-test01..250-PIPELINING..250-ENHANCEDSTATUSCODES..250 SIZE..
#
T 2004/03/05 13:45:46.325306 127.0.0.1:46715 -> 127.0.0.1:10024 [AP]
MAIL FROM:<[EMAIL PROTECTED]> SIZE=866..RCPT
TO:<[EMAIL PROTECTED]>..DATA..
#
T 2004/03/05 13:45:46.325479 127.0.0.1:10024 -> 127.0.0.1:46715 [AP]
250 Sender <[EMAIL PROTECTED]> OK..
##
T 2004/03/05 13:45:46.365648 127.0.0.1:10024 -> 127.0.0.1:46715 [AP]
250 Recipient <[EMAIL PROTECTED]> OK..354 Start mail
input; end with <CRLF>.<CRLF>..
##
T 2004/03/05 13:45:46.365974 127.0.0.1:46715 -> 127.0.0.1:10024 [AP]
Received: from earthquake.office.fastxs.net
(earthquake.office.fastxs.net [10.0.1.15])...by test01.office.fastxs.n
et (Postfix) with ESMTP id 394DD19F30A...for
<[EMAIL PROTECTED]>; Fri, 5 Mar 2004 13:45:46 +0100 (C
ET)..Received: from earthquake.office.fastxs.net (localhost
[127.0.0.1])...by earthquake.office.fastxs.net (Postfi
x) with ESMTP id 405D4375FE...for
<[EMAIL PROTECTED]>; Fri, 5 Mar 2004 13:49:12 +0100
(CET)..Receiv
ed: (from [EMAIL PROTECTED])...by earthquake.office.fastxs.net
(8.12.9/8.12.9/Submit) id i25CnCo0005116...for target@
test01.office.fastxs.net; Fri, 5 Mar 2004 13:49:12 +0100
(CET)..Date: Fri, 5 Mar 2004 13:49:12 +0100 (CET)..From:
Ilja Booij <[EMAIL PROTECTED]>..Message-Id:
<[EMAIL PROTECTED]
net>..To: [EMAIL PROTECTED]: 5-3
27......27.....
##
T 2004/03/05 13:45:46.568851 127.0.0.1:10024 -> 127.0.0.1:46715 [AP]
250 Message received OK..
##
T 2004/03/05 13:45:46.608610 127.0.0.1:10024 -> 127.0.0.1:46715 [AP]
c..
If another message is sent (over the same connection):
##
T 2004/03/05 13:46:01.879964 127.0.0.1:46715 -> 127.0.0.1:10024 [AP]
RSET..
##
T 2004/03/05 13:46:01.880127 127.0.0.1:46715 -> 127.0.0.1:10024 [AP]
MAIL FROM:<[EMAIL PROTECTED]> SIZE=858..RCPT
TO:<[EMAIL PROTECTED]>..DATA..
##
T 2004/03/05 13:46:01.880368 127.0.0.1:10024 -> 127.0.0.1:46715 [AP]
250 OK..
##
T 2004/03/05 13:46:01.880460 127.0.0.1:10024 -> 127.0.0.1:46715 [AP]
250 Sender <[EMAIL PROTECTED]> OK..
##
T 2004/03/05 13:46:01.883495 127.0.0.1:10024 -> 127.0.0.1:46715 [AP]
250 Recipient <[EMAIL PROTECTED]> OK..
##
T 2004/03/05 13:46:01.883541 127.0.0.1:10024 -> 127.0.0.1:46715 [AP]
354 Start mail input; end with <CRLF>.<CRLF>..
##
T 2004/03/05 13:47:41.920055 127.0.0.1:46715 -> 127.0.0.1:10024 [AP]
RSET..QUIT..
###
T 2004/03/05 13:52:41.875033 127.0.0.1:10024 -> 127.0.0.1:46715 [AP]
500 Error reading header...
#
You can see that the client (postfix) starts with an RSET command,
and starts sending MAIL_FROM, RCPT and DATA.
The server responds with 250 OK to the reset, and 250 Sender OK and
250 Recipient OK, and lets the client start sending (354 Start mail
input).
The problem is that Postfix detects that it should not send data,
because the message is supposedly bounced by dbmail.. But why?
Ilja
Ilja Booij wrote:
Hi,
Robert, thanks for your suggestion. It seems to work perfectly here.
Messages now get delivered to users without a problem.
I'll take a look at lmtp.c to see if I can spot the difference
between the server getting a QUIT from the client and a reconnection
on a new message, and a cached connection.
Ilja
Robert Theisen wrote:
New to the list here. But I read over the archives regarding this
problem and I may have a little to add.
I was able to get postfix to consistently deliver via lmtp to
dbmail (even two consecutive messages to the same user) by setting
the postfix directive lmtp_cache_connection to false instead of
true. This would termintate the lmtp connection after each
delivery. I assume, with lmtp_cache_connection turned on, the
connection would die after lmtp_timeout was reached and a new
connection would be established and the mail would get sent. This
may have been a "neat feature" that works with Cyrus (postfix's
preferred lmtp client) or it may be a specification of the lmtp rfc
(I have not read it). But it seems like a simple enough fix to
make it work. It would probably just involve having the
conversation status fall back to a state the postfix expects after
message delivery and waiting in that state until either the
connection terminates or the conversation picks up again. I took
a cursory glance at the lmtp.c and lmtpd.c code but did not have
enough time to really dig into it.
Good Luck. I am anxiously awaiting the 2.0 release. :)
Robert Theisen
Aaron Stone wrote:
Sure thing, I've got about an hour of time this morning. Looks
like you're
burning the midnight oil over there! Yikes!
Aaron
Ilja Booij <[EMAIL PROTECTED]> said:
Hi,
I haven't been able to find the cause of the problem yet. I found
some more info in the logs though:
Mar 4 16:55:34 test01 postfix/lmtp[21340]: 3378119F30A:
to=<[EMAIL PROTECTED]>,
relay=localhost.fastxs.net[127.0.0.1], delay=0, status=bounced
(host localhost.fastxs.net[127.0.0.1] said: 250 Recipient
<[EMAIL PROTECTED]> OK)
apparently, postfix thinks we want to bounce the message. But
why? A previous message to the same user arrives correctly..
strange, looking further. Aaron, can you also take a look at this?
Ilja
Ilja Booij wrote:
OK, I've found something:
It seems that Postfix sends a RSET command, when we expect to
get the header.
readheader() then waits for postfix to send more, while postfix
waits for a '250 OK' Message from dbmail-lmtp.
So, there's probably something wrong in our LMTP-logic.
I'll take a look at it, after I've done some small scripting job
here for a customer.
Ilja
Ilja Booij wrote:
OK,
this seems to have tackled the problem of the double delivery :)
There still is another problem though:
It still seems to hang for a while on every second delivery
attempt to the LMTP daemon.
Can you try the following scenario:
* configure MTA to use dbmail-lmtp for delivery
* send message to a recipient
* verify that the message is received using dbmail-lmtp
* send a second message.
What I observe here is that the second message takes a lot
longer to be delivered than the first one. The second one is
only delivered after minutes.
I have the feeling that something is not right here..
Ilja
Aaron Stone wrote:
New versions checked in, though not extensively tested yet.
Ilja Booij <[EMAIL PROTECTED]> said:
sounds ok to me :)
Ilja
Aaron Stone wrote:
Working on it as we speak! Catch you in about an hour?
Aaron
Ilja Booij <[EMAIL PROTECTED]> said:
Hi,
Aaron Stone wrote:
The reason for the double deliveries in the LMTP daemon is
because the old
insert_messages() function used to take lists of users to
directly deliver.
The new insert_messages() function takes a list of dsnuser
structures, and
expects that *either* the useridnr field is filled (for
direct-to-useridnr
delivery, which isn't supported by any of the frontends,
but is supported in
the lower layers ;-) or the address field, which is first
checked as a
username and then as an alias (this allows usernames in
the form of
'[EMAIL PROTECTED]' to operate without requiring an alias that
says '[EMAIL PROTECTED]
delivers to [EMAIL PROTECTED]').
Some refactoring might be necessary, because we need to
inform the MTA
whether
or not its envelope recipients were valid before it will
send us the message.
This means users need to be validated before
read_header(), which is a
problem
because at the moment this vaildation happens in
insert_messages().
OK, that's clear
Fine and dandy in pipe land, where the MTA will send the
message
regardless of
the disposition of the recipients, and only at the very
end are error
conditions returned as exit codes... in LMTP land we need
to know ahead of
time.
I think what I'll do is move the user validation code from
insert_messages()
into dsn.c, perhaps calling it dsn_check_users() or
dsn_prepare_deliveries().
Then, we'll have this order:
For command-line and envelope-recipient deliveries:
- receive addresses and store them into the dsnusers list.
- dsn_prepare_deliveries()
- if no deliveries are valid, return an error.
- read_header()
For deliver-to header deliveries:
- mime_readheader()
- mail_adr_list()
- dsn_prepare_deliveries()
- if no deliveries are valid, return an error.
- insert_messages()
I like the part where you say 'What I'll do' :)
Do you think this work will take long? I think we must
really release rc3 tomorrow (Friday, March 5th). This stuff
really has to work if we want to release.
Ilja
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev