mail-server/resources/config/sieve/bounce.sieve

51 lines
2.1 KiB
Sieve

let "subject" "to_lowercase(header.subject)";
if eval "(contains(subject, 'delivery') &&
(contains(subject, 'failed') ||
contains(subject, 'report') ||
contains(subject, 'status') ||
contains(subject, 'warning'))) ||
(contains(subject, 'failure') &&
(contains(subject, 'delivery') ||
contains(subject, 'notice') ||
contains(subject, 'mail') )) ||
(contains(subject, 'delivered') &&
(contains(subject, 'couldn\\'t be') ||
contains(subject, 'could not be') ||
contains(subject, 'hasn\\'t been') ||
contains(subject, 'has not been'))) ||
contains(subject, 'returned mail') ||
contains(subject, 'undeliverable') ||
contains(subject, 'undelivered')" {
# Subject contains words or phrases typical for DSN
let "t.SUBJ_BOUNCE_WORDS" "1";
}
if eval "is_empty(envelope.from)" {
if eval "eq_ignore_case(header.content-type, 'multipart/report') &&
( eq_ignore_case(header.content-type.attr.report-type, 'delivery-status') ||
eq_ignore_case(header.content-type.attr.report-type, 'disposition-notification'))" {
let "t.BOUNCE" "1";
} else {
let "from" "to_lowercase(header.from)";
if eval "contains(from, 'mdaemon') && !is_empty(header.X-MDDSN-Message)" {
let "t.BOUNCE" "1";
} elsif eval "contains(from, 'postmaster') || contains(from, 'mailer-daemon')" {
if eval "t.SUBJ_BOUNCE_WORDS" {
let "t.BOUNCE" "1";
} else {
foreverypart {
if eval "(eq_ignore_case(header.content-type.type, 'message') ||
eq_ignore_case(header.content-type.type, 'text')) &&
(eq_ignore_case(header.content-type.subtype, 'rfc822-headers') ||
eq_ignore_case(header.content-type.subtype, 'rfc822'))" {
let "t.BOUNCE" "1";
break;
}
}
}
}
}
}