I also found the cause of
why the Quota Exceeded message won’t pass the spam/virusfilter in some
cases. It only happens when the original mail is MIME. Then the reply mail
contains the original mail, but only the headers. According to the Perl library
MIME::Parser, the mail has a “unexpected end of preamble”. It
happed to be the following part:
--24332/in2sports2.vianetworks.nl—
Content-Type: message/rfc822
From: "Mark Ruijs"
<test@in2sports.net>
To: <test@ruijs.cc>
Subject: w
Date: Sun, 29 Oct 2006
09:41:56 +0100
Content-Type:
multipart/alternative;
boundary="----=_NextPart_000_0001_01C6FB3E.797DA7A0"
… more headers …
--24332/in2sports2.vianetworks.nl--
This is generated in deliver/mail-send.c,
the function mail_send_rejection(struct mail *mail, const char *recipient,
const char *reason):
/*
original message's headers */
fprintf(f, "--%s\r\nContent-Type: message/rfc822\r\n\r\n", boundary);
input
= mail_get_stream(mail, &hdr_size, NULL);
if
(input != NULL) {
input = i_stream_create_limit(default_pool, input,
0, hdr_size.physical_size);
while ((ret = i_stream_read_data(input, &data, &size, 0)) > 0) {
fwrite(data, size,
i_stream_skip(input, size);
}
My C is a bit rusty. Sure
someone here can add a check in the while-loop to suppress output of the “Content-Type…boundary”
part? Otherwise I’ll give it a shot…
Mark
This is how I tested the (in)validity
of the notice message:
#!/usr/bin/perl
require MIME::Parser;
MIME::Tools->debugging(1);
my $parser = new
MIME::Parser;
$parser->ignore_errors(0);
$entity =
$parser->parse(\*STDIN);
$entity->dump_skeleton;
Van:
dovecot-bounces@dovecot.org
[mailto:dovecot-bounces@dovecot.org] Namens Mark
Ruijs
Verzonden: zondag 29 oktober 2006
2:04
Aan: dovecot@dovecot.org
Onderwerp: Re: [Dovecot] deliver +
quota failure
I investigated the deliver
with quota’s bug a little more (rc10, mysql, virtual domains, maildir).
My log files reads:
deliver(test@ruijs.cc):
Info: msgid=<000f01c6fac1$bd4e8670$8801a8c0@Moskou>: save failed to INBOX
deliver(test@ruijs.cc):
Info: sieve runtime error: Keep: Generic Error
deliver(test@ruijs.cc):
Info: msgid=<000f01c6fac1$bd4e8670$8801a8c0@Moskou>: save failed to INBOX
deliver(test@ruijs.cc):
Error:
open(ruijs.cc/test//.temp.in2sports2.vianetworks.nl.13210.72d247ac698d0019) failed:
No such file or directory
deliver(mark@ruijs.cc):
Info: msgid=<dovecot-1162066721-407295-0@in2sports2.vianetworks.nl>:
saved mail to Junk
Dovecot tries to deliver,
but notices quota exceeded. I don’t think Sieve is playing a role here
– I added Sieve before I encountered the problem.
Two problems:
1) The .dovecot.lda-dupes can’t be written (that’s what
the open...failed notice is about).
2) The Quota Exceed mail seem to contain mal-formed headers
(that’s why it the notice-mail ends in my junk-folder).
Digging into deliver.c, I
noticed that auth_client_put_user_env() changes the HOME environment from
/var/mail (which is ok), to ruijs.cc/test/ (which is the maildir, relative to
/var/mail). And then fopen fails (see the trace below). So I think that the code
auth_socket = getenv("AUTH_SOCKET_PATH");
if
(auth_socket == NULL)
auth_socket = DEFAULT_AUTH_SOCKET_PATH;
ret =
auth_client_put_user_env(ioloop, auth_socket,
destination, process_euid);
if (ret
!= 0)
return ret;
home =
getenv("HOME");
if (home
!= NULL) {
/* If possible chdir to home directory so core file
could be written. If it fails, don't worry. */
(void)chdir(home);
is the key. Should
the chdir be done *before* the
call to auth_client_put_user_env()? I’m not familiar with the internal
workings of the Dovecot LDA, so I won’t suggest a proper fix. Who
will…
As for the mal-formed
headers, I’ll take a look at it later.
Mark
#0 i_error
(format=0x80ac5f7 "open(%s) failed: %m") at failures.c:203
#1 0x0809f900 in
dotlock_create (path=0x9ece2c0 "ruijs.cc/test//.dovecot.lda-dupes",
dotlock=0x9edfc48, flags=Variable "flags" is not available.
) at file-dotlock.c:265
#2 0x0809fb71 in
file_dotlock_open (set=0x80b9c90, path=0x9ece2c0
"ruijs.cc/test//.dovecot.lda-dupes", flags=0, dotlock_r=0x9ee7920) at
file-dotlock.c:614
#3 0x08056ec5 in
duplicate_new (path=0x9ece2c0 "ruijs.cc/test//.dovecot.lda-dupes") at
duplicate.c:157
#4 0x080571c6 in
duplicate_mark (id=0x9ece270, id_size=55, user=0xbf9edb45
"test@ruijs.cc", time=1162163205) at duplicate.c:195
#5 0x080573c9 in
mail_send_rejection (mail=0x9ede7e0, recipient=0xbf9edb45
"test@ruijs.cc", reason=0x9edc218 "Quota exceeded") at
mail-send.c:51
#6 0x08056c51 in main
(argc=5, argv=0xbf9ec5d4) at deliver.c:595