소스 검색

improve handle_bounce_reply_phase

Son NK 4 년 전
부모
커밋
3dee121bec
1개의 변경된 파일36개의 추가작업 그리고 27개의 파일을 삭제
  1. 36 27
      email_handler.py

+ 36 - 27
email_handler.py

@@ -1338,6 +1338,25 @@ def handle_bounce_reply_phase(alias: Alias, msg: Message, user: User):
     Handle bounce that is sent to alias
     Happens when  an email cannot be sent from an alias to a contact
     """
+    try:
+        email_log_id = int(get_header_from_bounce(msg, _EMAIL_LOG_ID_HEADER))
+    except Exception:
+        # save the data for debugging
+        file_path = f"/tmp/{random_string(10)}.eml"
+        with open(file_path, "wb") as f:
+            f.write(msg.as_bytes())
+
+        LOG.exception(
+            "Cannot get email-log-id from bounced report, %s %s %s",
+            alias,
+            user,
+            file_path,
+        )
+        return
+
+    email_log = EmailLog.get(email_log_id)
+    contact = email_log.contact
+
     # Store the bounced email
     # generate a name for the email
     random_name = str(uuid.uuid4())
@@ -1346,44 +1365,34 @@ def handle_bounce_reply_phase(alias: Alias, msg: Message, user: User):
     s3.upload_email_from_bytesio(full_report_path, BytesIO(msg.as_bytes()), random_name)
 
     orig_msg = get_orig_message_from_bounce(msg)
-    if not orig_msg:
-        # save the data for debugging
-        file_path = f"/tmp/{random_string(10)}.eml"
-        with open(file_path, "wb") as f:
-            f.write(msg.as_bytes())
-
-        LOG.exception("Cannot parse bounce message, %s", file_path)
-        raise Exception("Cannot parse bounce message")
+    file_path = None
+    if orig_msg:
+        file_path = f"refused-emails/{random_name}.eml"
+        s3.upload_email_from_bytesio(
+            file_path, BytesIO(orig_msg.as_bytes()), random_name
+        )
 
-    file_path = f"refused-emails/{random_name}.eml"
-    s3.upload_email_from_bytesio(file_path, BytesIO(orig_msg.as_bytes()), random_name)
+    refused_email = RefusedEmail.create(
+        path=file_path, full_report_path=full_report_path, user_id=user.id, commit=True
+    )
+    LOG.d("Create refused email %s", refused_email)
 
-    email_log_id = int(orig_msg[_EMAIL_LOG_ID_HEADER])
-    email_log = EmailLog.get(email_log_id)
-    contact = email_log.contact
+    email_log.bounced = True
+    email_log.refused_email_id = refused_email.id
+    db.session.commit()
 
     try:
-        mailbox_id = int(orig_msg[_MAILBOX_ID_HEADER])
-    except TypeError:
+        mailbox_id = int(get_header_from_bounce(msg, _MAILBOX_ID_HEADER))
+    except Exception:
         LOG.warning(
-            "cannot parse mailbox from original message header %s",
-            orig_msg[_MAILBOX_ID_HEADER],
+            "cannot parse mailbox from bounce message report %s %s", alias, user
         )
         # fall back to the default mailbox
         mailbox = alias.mailbox
     else:
         mailbox = Mailbox.get(mailbox_id)
         email_log.bounced_mailbox_id = mailbox.id
-
-    refused_email = RefusedEmail.create(
-        path=file_path, full_report_path=full_report_path, user_id=user.id
-    )
-    db.session.flush()
-    LOG.d("Create refused email %s", refused_email)
-
-    email_log.bounced = True
-    email_log.refused_email_id = refused_email.id
-    db.session.commit()
+        db.session.commit()
 
     refused_email_url = (
         URL + f"/dashboard/refused_email?highlight_id=" + str(email_log.id)