aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Engelhardt <[email protected]>2020-12-09 15:58:57 +0000
committerJan Engelhardt <[email protected]>2020-12-11 22:10:39 +0000
commitf4c611b736ac290ec4f99faaa48b59fdd7c63809 (patch)
tree3b2a523a15513324175c40dec2dad1747c9dc0ef /src
parentCheck for DSN extension support before using it. (diff)
downloadvmime-f4c611b736ac290ec4f99faaa48b59fdd7c63809.tar.gz
vmime-f4c611b736ac290ec4f99faaa48b59fdd7c63809.zip
Avoid force-encoding display names that fit within qcontent
When the display name contains an At sign, or anything of the sort, libvmime would forcibly encode this to =?...?=, even if the line is fine ASCII which only needs quoting. rspamd takes excessive quoting as a sign of spam and penalizes such mails by raising the score (rule/match: TO_EXCESS_QP et al.)
Diffstat (limited to 'src')
-rw-r--r--src/vmime/mailbox.cpp34
1 files changed, 2 insertions, 32 deletions
diff --git a/src/vmime/mailbox.cpp b/src/vmime/mailbox.cpp
index db5cc74e..30a082ea 100644
--- a/src/vmime/mailbox.cpp
+++ b/src/vmime/mailbox.cpp
@@ -355,44 +355,14 @@ void mailbox::generateImpl(
// - if it contains characters in a charset different from "US-ASCII",
// - and/or if it contains one or more of these special chars:
// CR LF TAB " ; , < > ( ) @ / ? . = :
-
+ // these special chars only require quoting, not full encoding
// Check whether there are words that are not "US-ASCII"
// and/or contain the special chars.
bool forceEncode = false;
for (size_t w = 0 ; !forceEncode && w != m_name.getWordCount() ; ++w) {
- if (m_name.getWordAt(w)->getCharset() == charset(charsets::US_ASCII)) {
-
- const string& buffer = m_name.getWordAt(w)->getBuffer();
-
- for (string::const_iterator c = buffer.begin() ;
- !forceEncode && c != buffer.end() ; ++c) {
-
- switch (*c) {
-
- case '\r':
- case '\n':
- case '\t':
- case ';':
- case ',':
- case '<': case '>':
- case '(': case ')':
- case '@':
- case '/':
- case '?':
- case '.':
- case '=':
- case ':':
- case '"':
-
- forceEncode = true;
- break;
- }
- }
-
- } else {
-
+ if (m_name.getWordAt(w)->getCharset() != charset(charsets::US_ASCII)) {
forceEncode = true;
}
}