Пример #1
0
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)
Пример #2
0
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") == ["*****@*****.**", "*****@*****.**"]
Пример #3
0
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)