Added Module Config options to set the minimum allowed time between autoreplies, and to force use of that minimum.
---- Changes since 1.320 ----
The default From: address for autoreplies now respects the default address set in the user's address book.
+---- Changes since 1.330 ----
+Added a filter condition to match mail with a spam score at or above some level.
# Start of condition section
$cmode = $filter->{'condspam'} ? 5 :
+ $filter->{'condlevel'} ? 6 :
$filter->{'condheader'} ? 4 :
$filter->{'condtype'} eq '<' ? 3 :
$filter->{'condtype'} eq '>' ? 2 :
&ui_oneradio("cmode", 5, $text{'edit_cmode5'}, $cmode == 5),
"", undef, \@tds);
+# Spam level is at or above
+print &ui_table_row(
+ &ui_oneradio("cmode", 6, $text{'edit_cmode6'}, $cmode == 6),
+ &ui_textbox("condlevel", $filter->{'condlevel'}, 4), undef, \@tds);
+
# Check some header
@headers = ( "From", "To", "Subject", "Cc" );
$common = &indexoflc($filter->{'condheader'}, @headers) >= 0;
if ($simple->{'condtype'} ne '<' && $simple->{'condtype'} ne '>' &&
!$simple->{'body'} &&
$simple->{'cond'} =~ /^\^?([a-zA-Z0-9\-]+):\s*(.*)/) {
- if ($1 eq "X-Spam-Status" && $2 eq "Yes") {
+ local ($h, $v) = ($1, $2);
+ if ($h eq "X-Spam-Status" && $v eq "Yes") {
# Special case for spam detection
$simple->{'condspam'} = 1;
}
+ elsif ($h eq "X-Spam-Level" && $v =~ /^(\\\*)+$/) {
+ # Spam above some level
+ $simple->{'condlevel'} = length($v)/2;
+ }
else {
# Match on some header
- $simple->{'condheader'} = $1;
- $simple->{'condvalue'} = $2;
+ $simple->{'condheader'} = $h;
+ $simple->{'condvalue'} = $v;
}
delete($simple->{'cond'});
}
if ($filter->{'condspam'}) {
@conds = ( [ "", "X-Spam-Status: Yes" ] );
}
+elsif ($filter->{'condlevel'}) {
+ local $stars = join("", map { "\\*" } (1..$filter->{'condlevel'}));
+ @conds = ( [ "", "X-Spam-Level: $stars" ] );
+ }
elsif ($filter->{'condheader'}) {
@conds = ( [ "", $filter->{'condheader'}.": ".
$filter->{'condvalue'} ] );
if ($f->{'condspam'}) {
$cond = $text{'index_cspam'};
}
+elsif ($f->{'condlevel'}) {
+ $cond = &text('index_clevel', $f->{'condlevel'});
+ }
elsif ($f->{'condheader'}) {
$cond = &text('index_cheader',
"<tt>$f->{'condheader'}</tt>",
index_addauto=Quick automatic reply setup.
index_addfwd=Quick forwarding setup.
index_cspam=Email is spam
+index_clevel=Spam score is at least $1
index_cheader=Header $1 matches $2
index_cre=Headers match $1
index_cre2=Body matches $1
edit_cmode3=Email smaller than
edit_cmode2=Email larger than
edit_cmode5=Email classified as spam
+edit_cmode6=Spam score is at least
edit_cmode1=Based on regular expression
edit_cbody=Apply to message body
edit_other=Other..
save_err=Failed to save filter
save_econdheader=Missing or invalid email header
+save_econdlevel=Minimum spam score must be an integer greater than zero
save_esmall=Missing or invalid maximum mail size
save_elarge=Missing or invalid minimum mail size
save_econd=Missing regular expression
# Parse condition first
delete($filter->{'condspam'});
+ delete($filter->{'condlevel'});
delete($filter->{'condheader'});
delete($filter->{'condtype'});
delete($filter->{'cond'});
# Always enabled, so nothing to set!
}
elsif ($in{'cmode'} == 5) {
- # Need to run spamassassin
+ # Match if spamassassin has set header
$filter->{'condspam'} = 1;
}
+ elsif ($in{'cmode'} == 6) {
+ # Match by spam level
+ $in{'condlevel'} =~ /^[1-9]\d*$/ ||
+ &error($text{'save_econdlevel'});
+ $filter->{'condlevel'} = $in{'condlevel'};
+ }
elsif ($in{'cmode'} == 4) {
# Check some header
$filter->{'condheader'} = $in{'condmenu'} || $in{'condheader'};