def replace_header_when_reply(msg: Message, alias: Alias, header: str): """ Replace CC or To Reply emails by original emails """ addrs = get_addrs_from_header(msg, header) # Nothing to do if not addrs: return new_addrs: [str] = [] for addr in addrs: name, reply_email = parseaddr(addr) # no transformation when alias is already in the header if reply_email == alias.email: continue contact = Contact.get_by(reply_email=reply_email) if not contact: LOG.warning("%s email in reply phase %s must be reply emails", header, reply_email) # still keep this email in header new_addrs.append(addr) else: new_addrs.append(formataddr((contact.name, contact.website_email))) new_header = ",".join(new_addrs) LOG.d("Replace %s header, old: %s, new: %s", header, msg[header], new_header) add_or_replace_header(msg, header, new_header)
def test_get_addrs_from_header(): msg = email.message_from_string("""To: [email protected]""") assert get_addrs_from_header(msg, "To") == ["*****@*****.**"] msg = email.message_from_string("""To: [email protected], [email protected]""") assert get_addrs_from_header(msg, "To") == ["*****@*****.**", "*****@*****.**"] msg = email.message_from_string( """To: ABCD <*****@*****.**>, XYZ <*****@*****.**>""") assert get_addrs_from_header(msg, "To") == [ "ABCD <*****@*****.**>", "XYZ <*****@*****.**>", ] msg = email.message_from_string( """To: =?unknown-8bit?q?test=40example=2eorg=2c_xyz=40test=2eorg?=""") assert get_addrs_from_header(msg, "To") == ["*****@*****.**", "*****@*****.**"]
def replace_header_when_forward(msg: Message, alias: Alias, header: str): """ Replace CC or To header by Reply emails in forward phase """ addrs = get_addrs_from_header(msg, header) # Nothing to do if not addrs: return new_addrs: [str] = [] need_replace = False for addr in addrs: contact_name, contact_email = parseaddr_unicode(addr) # no transformation when alias is already in the header if contact_email == alias.email: new_addrs.append(addr) continue contact = Contact.get_by(alias_id=alias.id, website_email=contact_email) if contact: # update the contact name if needed if contact.name != contact_name: LOG.d( "Update contact %s name %s to %s", contact, contact.name, contact_name, ) contact.name = contact_name db.session.commit() else: LOG.debug( "create contact for alias %s and email %s, header %s", alias, contact_email, header, ) reply_email = generate_reply_email() contact = Contact.create( user_id=alias.user_id, alias_id=alias.id, website_email=contact_email, name=contact_name, reply_email=reply_email, is_cc=header.lower() == "cc", ) db.session.commit() new_addrs.append(contact.new_addr()) need_replace = True if need_replace: new_header = ",".join(new_addrs) LOG.d("Replace %s header, old: %s, new: %s", header, msg[header], new_header) add_or_replace_header(msg, header, new_header) else: LOG.d("No need to replace %s header", header)