Thread: [maildropl] Strange mailbox error - SOLVED
Brought to you by:
mrsam
From: David J. Weller-F. <dav...@we...> - 2007-10-11 20:18:13
|
I've had a problem with intermittent failure of my greenlisting script, and have finally (I believe) tracked down the problem, and solved it. I believe the problem involves piping a message to a script as a delivery. If that script makes no use of the pipe, performs its function, then exits (as my greenlister script does) then maildrop never has a chance to finish writing larger messages to the pipe. Of course, I may be wrong which is why I'm posting here. ;] The recipe that was failing only on large messages follows. Note that this recipe only fires when a message has certain Delivered-To: headers, so most messages never see this code. #v+ # We don't want multiple messages trying to modify the greenlist at the # same time. dotlock "$HOME/.maildrop/greenlisting$LOCKEXT" { # Grab all addresses from the appropriate fields. if ($MATCH2 =~ /^sender$/) GL_ADDRESSLIST=`reformail -c -xfrom:` else GL_ADDRESSLIST=`reformail -c -xto: -xcc:` # Set the operation to perform (add or remove). GL_OP=$MATCH1 # Loop over each address found. foreach (getaddr($GL_ADDRESSLIST)) =~ /.+/ { # Add/remove the address to/from the greenlist. # NOTE - I do not check for the address in the # greenlist when adding, or for its absence when # removing. This keeps the recipe simple. My script # checks for each address, and only adds/removes if the # address doesn't/does exit (respectively). to "|$MAILDROP/greenlist-$GL_OP.sh \"$MATCH\"" } } #v- The recipe that works correctly no matter the size of the message (because we filter it down to just the relevant addresses) follows. #v+ # We don't want multiple messages trying to modify the greenlist at the # same time. dotlock "$HOME/.maildrop/greenlisting$LOCKEXT" { # Grab all addresses from the appropriate fields. if ($MATCH2 =~ /^sender$/) xfilter "reformail -c -xfrom:" else xfilter "reformail -c -xto: -xcc:" GL_ADDRESSLIST=`cat` # Set the operation to perform (add or remove). GL_OP=$MATCH1 # Loop over each address found. foreach (getaddr($GL_ADDRESSLIST)) =~ /.+/ { # Add/remove the address to/from the greenlist. # NOTE - I do not check for the address in the # greenlist when adding, or for its absence when # removing. This keeps the recipe simple. My script # checks for each address, and only adds/removes if the # address doesn't/does exit (respectively). to "|$MAILDROP/greenlist-$GL_OP.sh \"$MATCH\"" } } #v- So... I have a few questions: 1) Have I diagnosed the problem correctly? 2) If not, what is the problem? 3) If so, am I over-complicating this? IOW, is there a better (simpler) way to do what I'm trying to do? Hopefully that all made sense. If not, please don't hesitate to ask questions. Regards, -- dave [ please don't CC me ] |
From: Devin R. <de...@th...> - 2007-10-11 20:35:39
|
On Thu, Oct 11, 2007 at 10:17:51PM +0200, David J. Weller-Fahy wrote: > I've had a problem with intermittent failure of my greenlisting script, > and have finally (I believe) tracked down the problem, and solved it. > > I believe the problem involves piping a message to a script as a > delivery. If that script makes no use of the pipe, performs its > function, then exits (as my greenlister script does) then maildrop never > has a chance to finish writing larger messages to the pipe. This has been dealt with on the list before. If your script does not drain the pipe, maildrop will assume that delivery failed and behave appropriately. Since you are not actually delivering the message why not replace > to "|$MAILDROP/greenlist-$GL_OP.sh \"$MATCH\"" With: `$MAILDROP/greenlist-$GL_OP.sh \"$MATCH\"` exit -- Devin |
From: David J. Weller-F. <dav...@we...> - 2007-10-11 21:05:50
|
This was supposed to go to the list. My apologies to Devin for sending him a reply instead of simply sending to the list. * Devin Rubia <de...@th...> [2007-10-11 22:35 +0200]: > This has been dealt with on the list before. If your script does not > drain the pipe, maildrop will assume that delivery failed and behave > appropriately. Doh! My apologies, then, for the noise. Apparently my search-fu was not up to the task. > Since you are not actually delivering the message why not replace > > > to "|$MAILDROP/greenlist-$GL_OP.sh \"$MATCH\"" > > With: > > `$MAILDROP/greenlist-$GL_OP.sh \"$MATCH\"` > exit Hrm... probably because I hadn't thought of that. ;] Thanks for the improvement, I'll go test and implement. Regards, -- dave [ please don't CC me ] |