summaryrefslogtreecommitdiff
path: root/resources/config/sieve/subject.sieve
diff options
context:
space:
mode:
Diffstat (limited to 'resources/config/sieve/subject.sieve')
-rw-r--r--resources/config/sieve/subject.sieve83
1 files changed, 83 insertions, 0 deletions
diff --git a/resources/config/sieve/subject.sieve b/resources/config/sieve/subject.sieve
new file mode 100644
index 00000000..202ab85a
--- /dev/null
+++ b/resources/config/sieve/subject.sieve
@@ -0,0 +1,83 @@
+
+set "thread_name" "%{thread_name(header.subject)}";
+set "subject_lcase" "%{to_lowercase(header.subject)}";
+set "raw_subject_lcase" "%{to_lowercase(header.subject.raw)}";
+set "is_ascii_subject" "%{is_ascii(subject_lcase)}";
+
+if eval "len(thread_name) >= 10 && count(tokenize_words(thread_name)) > 1 && is_uppercase(thread_name)" {
+ # Subject contains mostly capital letters
+ set "t.SUBJ_ALL_CAPS" "1";
+}
+
+if eval "count_chars(thread_name) > 200" {
+ # Subject is very long
+ set "t.SUBJ_VERY_LONG" "1";
+}
+
+if eval "contains(subject_lcase, 'http://') || contains(subject_lcase, 'http://')" {
+ # Subject contains a URL
+ set "t.URL_IN_SUBJECT" "1";
+}
+
+if eval "!is_ascii(raw_subject_lcase)" {
+ # Subject needs encoding
+ set "t.SUBJECT_NEEDS_ENCODING" "1";
+}
+
+if not exists "Subject" {
+ # Missing subject header
+ set "t.MISSING_SUBJECT" "1";
+}
+
+if eval "is_empty(trim(subject_lcase))" {
+ # Subject is empty
+ set "t.EMPTY_SUBJECT" "1";
+}
+
+if eval "is_ascii(subject_lcase) && contains(raw_subject_lcase, '=?') && contains(raw_subject_lcase, '?=')" {
+ if eval "contains(raw_subject_lcase, '?q?')" {
+ # Subject header is unnecessarily encoded in quoted-printable
+ set "t.SUBJ_EXCESS_QP" "1";
+ } elsif eval "contains(raw_subject_lcase, '?b?')" {
+ # Subject header is unnecessarily encoded in base64
+ set "t.SUBJ_EXCESS_BASE64" "1";
+ }
+}
+
+if eval "starts_with(subject_lcase, 're:') && is_empty(header.reply-to) && is_empty(header.references)" {
+ # Fake reply
+ set "t.FAKE_REPLY" "1";
+}
+
+set "subject_lcase_trim" "%{trim_end(subject_lcase)}";
+if eval "subject_lcase != subject_lcase_trim" {
+ # Subject ends with space characters
+ set "t.SUBJECT_ENDS_SPACES" "1";
+}
+
+if eval "contains(subject_lcase, '$') ||
+ contains(subject_lcase, '€') ||
+ contains(subject_lcase, '£') ||
+ contains(subject_lcase, '¥')" {
+ # Subject contains currency symbols
+ set "t.SUBJECT_HAS_CURRENCY" "1";
+}
+
+if eval "ends_with(subject_lcase_trim, '!')" {
+ # Subject ends with an exclamation mark
+ set "t.SUBJECT_ENDS_EXCLAIM" "1";
+} elsif eval "ends_with(subject_lcase_trim, '?')" {
+ # Subject ends with a question mark
+ set "t.SUBJECT_ENDS_QUESTION" "1";
+}
+
+if eval "contains(subject_lcase_trim, '!')" {
+ # Subject contains an exclamation mark
+ set "t.SUBJECT_HAS_EXCLAIM" "1";
+}
+
+if eval "contains(subject_lcase_trim, '?')" {
+ # Subject contains a question mark
+ set "t.SUBJECT_HAS_QUESTION" "1";
+}
+