From 9e2d61d3bd68ba41bdce5a3e19cf344c9cc9023d Mon Sep 17 00:00:00 2001 From: ale <ale@incal.net> Date: Sat, 22 Oct 2022 10:27:00 +0100 Subject: [PATCH] Fix use of undefined original_from --- feedbackloop/parse.py | 137 +++++++++++++++++++++--------------------- 1 file changed, 68 insertions(+), 69 deletions(-) diff --git a/feedbackloop/parse.py b/feedbackloop/parse.py index 3ebe6cb..7d852ea 100644 --- a/feedbackloop/parse.py +++ b/feedbackloop/parse.py @@ -117,78 +117,77 @@ class MailScanner(): def scan(self, unseen, limit=None): for uid, raw_msg in self._scan_mailbox(unseen, limit): try: - - # Parse the ARF message body. - msg = ARFMessage(raw_msg) - report_sender, _ = _normalize_addr( - _hdr(msg.get_message_headers(), 'From')) - - # Try different ways of finding the original sender. We - # look at a few possible things, in order of increasing - # priority: - # - # - the From of the original message - # - the From reported in the feedback-report attachment - # - the authenticated sender from the Received headers - # - # We also attempt to detect if the sender is a mailing - # list by looking for a "List-Id" header, or a "-bounces" - # sender. - hdrs = msg.get_original_message_headers() - is_list = False - timestamp = datetime.now() - - if hdrs: - original_from = _hdr(hdrs, 'From') - timestamp = datetime.fromtimestamp( - time.mktime(parsedate(_hdr(hdrs, 'Date')))) - - fr = msg.get_feedback_report() - if fr: - print(f'feedback report: {fr.get_feedback_type()} - {fr.get_original_mail_from()}') - original_from = fr.get_original_mail_from() - arrival_date = fr.get_arrival_date() - if arrival_date: - timestamp = datetime.fromtimestamp( - time.mktime(parsedate(arrival_date))) - - if hdrs: - auth_sender = _find_authenticated_sender(hdrs) - if auth_sender: - print(f'found authenticated sender: {auth_sender}') - original_from = auth_sender - - if hdrs: - list_id = _hdr(hdrs, 'List-Id') - if list_id: - list_name = self._list_name_from_id(list_id) - if list_name: - original_from = list_name - is_list = True - - if not original_from: - print('unable to extract original sender') - continue - - original_from, maybe_list = _normalize_addr(original_from) - if maybe_list and not is_list: - is_list = maybe_list - - entry = FeedbackEntry( - sender=original_from, - reporter=report_sender, - is_list=is_list, - timestamp=timestamp, - ) - if not is_list: - entry.message = raw_msg - print(f'original from: {original_from}, list={is_list}') - yield entry + entry = self._parse_message(raw_msg) self._to_delete.append(uid) - + yield entry except Exception as e: print(f'error: {e}') - #print(raw_msg) + + def _parse_message(self, raw_msg): + # Parse the ARF message body. + msg = ARFMessage(raw_msg) + report_sender, _ = _normalize_addr( + _hdr(msg.get_message_headers(), 'From')) + + # Try different ways of finding the original sender. We + # look at a few possible things, in order of increasing + # priority: + # + # - the From of the original message + # - the From reported in the feedback-report attachment + # - the authenticated sender from the Received headers + # + # We also attempt to detect if the sender is a mailing + # list by looking for a "List-Id" header, or a "-bounces" + # sender. + hdrs = msg.get_original_message_headers() + is_list = False + timestamp = datetime.now() + original_from = None + + if hdrs: + original_from = _hdr(hdrs, 'From') + timestamp = datetime.fromtimestamp( + time.mktime(parsedate(_hdr(hdrs, 'Date')))) + + fr = msg.get_feedback_report() + if fr: + print(f'feedback report: {fr.get_feedback_type()} - {fr.get_original_mail_from()}') + original_from = fr.get_original_mail_from() + arrival_date = fr.get_arrival_date() + if arrival_date: + timestamp = datetime.fromtimestamp( + time.mktime(parsedate(arrival_date))) + + if hdrs: + auth_sender = _find_authenticated_sender(hdrs) + if auth_sender: + print(f'found authenticated sender: {auth_sender}') + original_from = auth_sender + + if hdrs: + list_id = _hdr(hdrs, 'List-Id') + if list_id: + list_name = self._list_name_from_id(list_id) + if list_name: + original_from = list_name + is_list = True + + if not original_from: + raise Exception('unable to extract original sender') + + original_from, maybe_list = _normalize_addr(original_from) + if maybe_list and not is_list: + is_list = maybe_list + + print(f'original from: {original_from}, list={is_list}') + return FeedbackEntry( + sender=original_from, + reporter=report_sender, + is_list=is_list, + timestamp=timestamp, + message=raw_msg, + ) def main(): -- GitLab