only run spam check in email handler if ENABLE_SPAM_ASSASSIN is enabled

This commit is contained in:
Son NK 2021-03-26 10:00:48 +01:00
parent 2270ccf35d
commit 365c11f926
1 changed files with 76 additions and 71 deletions

View File

@ -72,6 +72,7 @@ from app.config import (
BOUNCE_SUFFIX, BOUNCE_SUFFIX,
TRANSACTIONAL_BOUNCE_PREFIX, TRANSACTIONAL_BOUNCE_PREFIX,
TRANSACTIONAL_BOUNCE_SUFFIX, TRANSACTIONAL_BOUNCE_SUFFIX,
ENABLE_SPAM_ASSASSIN,
) )
from app.email.spam import get_spam_score from app.email.spam import get_spam_score
from app.email_utils import ( from app.email_utils import (
@ -594,47 +595,48 @@ def forward_email_to_mailbox(
contact_id=contact.id, user_id=user.id, mailbox_id=mailbox.id, commit=True contact_id=contact.id, user_id=user.id, mailbox_id=mailbox.id, commit=True
) )
# Spam check if ENABLE_SPAM_ASSASSIN:
spam_status = "" # Spam check
is_spam = False spam_status = ""
is_spam = False
if SPAMASSASSIN_HOST: if SPAMASSASSIN_HOST:
start = time.time() start = time.time()
spam_score, spam_report = get_spam_score(msg, email_log) spam_score, spam_report = get_spam_score(msg, email_log)
LOG.d( LOG.d(
"%s -> %s - spam score:%s in %s seconds. Spam report %s", "%s -> %s - spam score:%s in %s seconds. Spam report %s",
contact, contact,
alias, alias,
spam_score, spam_score,
time.time() - start, time.time() - start,
spam_report, spam_report,
) )
email_log.spam_score = spam_score email_log.spam_score = spam_score
db.session.commit() db.session.commit()
if (user.max_spam_score and spam_score > user.max_spam_score) or ( if (user.max_spam_score and spam_score > user.max_spam_score) or (
not user.max_spam_score and spam_score > MAX_SPAM_SCORE not user.max_spam_score and spam_score > MAX_SPAM_SCORE
): ):
is_spam = True is_spam = True
# only set the spam report for spam # only set the spam report for spam
email_log.spam_report = spam_report email_log.spam_report = spam_report
else: else:
is_spam, spam_status = get_spam_info(msg, max_score=user.max_spam_score) is_spam, spam_status = get_spam_info(msg, max_score=user.max_spam_score)
if is_spam: if is_spam:
LOG.w( LOG.w(
"Email detected as spam. %s -> %s. Spam Score: %s, Spam Report: %s", "Email detected as spam. %s -> %s. Spam Score: %s, Spam Report: %s",
contact, contact,
alias, alias,
email_log.spam_score, email_log.spam_score,
email_log.spam_report, email_log.spam_report,
) )
email_log.is_spam = True email_log.is_spam = True
email_log.spam_status = spam_status email_log.spam_status = spam_status
db.session.commit() db.session.commit()
handle_spam(contact, alias, msg, user, mailbox, email_log) handle_spam(contact, alias, msg, user, mailbox, email_log)
return False, "550 SL E1 Email detected as spam" return False, "550 SL E1 Email detected as spam"
if contact.invalid_email: if contact.invalid_email:
LOG.d("add noreply information %s %s", alias, mailbox) LOG.d("add noreply information %s %s", alias, mailbox)
@ -818,44 +820,47 @@ def handle_reply(envelope, msg: Message, rcpt_to: str) -> (bool, str):
) )
# Spam check # Spam check
spam_status = "" if ENABLE_SPAM_ASSASSIN:
is_spam = False spam_status = ""
is_spam = False
# do not use user.max_spam_score here # do not use user.max_spam_score here
if SPAMASSASSIN_HOST: if SPAMASSASSIN_HOST:
start = time.time() start = time.time()
spam_score, spam_report = get_spam_score(msg, email_log) spam_score, spam_report = get_spam_score(msg, email_log)
LOG.d( LOG.d(
"%s -> %s - spam score %s in %s seconds. Spam report %s", "%s -> %s - spam score %s in %s seconds. Spam report %s",
alias, alias,
contact, contact,
spam_score, spam_score,
time.time() - start, time.time() - start,
spam_report, spam_report,
) )
email_log.spam_score = spam_score email_log.spam_score = spam_score
if spam_score > MAX_REPLY_PHASE_SPAM_SCORE: if spam_score > MAX_REPLY_PHASE_SPAM_SCORE:
is_spam = True is_spam = True
# only set the spam report for spam # only set the spam report for spam
email_log.spam_report = spam_report email_log.spam_report = spam_report
else: else:
is_spam, spam_status = get_spam_info(msg, max_score=MAX_REPLY_PHASE_SPAM_SCORE) is_spam, spam_status = get_spam_info(
msg, max_score=MAX_REPLY_PHASE_SPAM_SCORE
)
if is_spam: if is_spam:
LOG.w( LOG.w(
"Email detected as spam. Reply phase. %s -> %s. Spam Score: %s, Spam Report: %s", "Email detected as spam. Reply phase. %s -> %s. Spam Score: %s, Spam Report: %s",
alias, alias,
contact, contact,
email_log.spam_score, email_log.spam_score,
email_log.spam_report, email_log.spam_report,
) )
email_log.is_spam = True email_log.is_spam = True
email_log.spam_status = spam_status email_log.spam_status = spam_status
db.session.commit() db.session.commit()
handle_spam(contact, alias, msg, user, mailbox, email_log, is_reply=True) handle_spam(contact, alias, msg, user, mailbox, email_log, is_reply=True)
return False, "550 SL E15 Email detected as spam" return False, "550 SL E15 Email detected as spam"
delete_all_headers_except( delete_all_headers_except(
msg, msg,