示例#1
0
    async def sendmail(request, user_id, account):
        """ Send an email """

        if account.name != user_id:
            raise Forbidden("You can't consult another person account.")

        data = request.json

        from_addr = mailutils.parse_email(account.address)
        all_addrs = [
            mailutils.parse_email(a["address"]) for a in data["recipients"]
        ]
        tos = [
            mailutils.parse_email(a["address"]) for a in data["recipients"]
            if a["type"] == "to"
        ]
        ccs = [
            mailutils.parse_email(a["address"]) for a in data["recipients"]
            if a["type"] == "cc"
        ]

        attachments = data.get("attachments", [])

        msg = mailutils.make_msg(data["subject"], data["content"], from_addr,
                                 tos, ccs, attachments)

        result = await send_mail(account, msg, from_addr, all_addrs)

        return json(result)
示例#2
0
    async def sendmail(request, account):
        data = request.json

        mail_sender = MailSender()

        from_addr = mailutils.parse_email(account.address)
        all_addrs = [mailutils.parse_email(a['address']) for a in data['recipients']]
        tos = [mailutils.parse_email(a['address']) for a in data['recipients'] if a['type'] == 'to']
        ccs = [mailutils.parse_email(a['address']) for a in data['recipients'] if a['type'] == 'cc']

        attachments = data.get('attachments', [])

        msg = mailutils.make_msg(data['subject'], data['content'], from_addr, tos, ccs, attachments)

        # First we store it
        saved_msg = await storage.store_msg(
            msg,
            account=account,
            from_addr=from_addr,
            to_addrs=all_addrs,
            incoming=False
        )

        # Then we send it
        delivery_status = await mail_sender.send(
            msg,
            from_addr=from_addr.addr_spec,
            to_addrs=[a.addr_spec for a in all_addrs]
        )

        # TODO update delivery status in store

        # Finally we return it
        return json(saved_msg)
示例#3
0
async def main():
    settings.init_settings()
    await storage.storage.start()
    fake = Faker()

    for account_name, account in account_manager.accounts.items():
        from_addr = mailutils.parse_email(account.address)
        print(f"Generate messages for {from_addr}...")

        for _ in range(randint(3, 5)):
            to_addr = mailutils.parse_email(fake.safe_email())
            for _ in range(randint(3, 5)):
                # First message
                subject = fake.sentence(nb_words=5, variable_nb_words=True)
                msg = mailutils.make_msg(subject=subject,
                                         content=fake.text(max_nb_chars=200,
                                                           ext_word_list=None),
                                         from_addr=from_addr,
                                         tos=[to_addr],
                                         ccs=None,
                                         attachments=None)
                msg_to_store = await mailutils.extract_data_from_msg(msg)
                saved_msg = await storage.storage.store_msg(
                    msg_to_store,
                    account=account,
                    from_addr=from_addr,
                    to_addrs=[to_addr],
                    incoming=False)

                # response
                msg = mailutils.make_msg(subject="Re: " + subject,
                                         content=fake.text(max_nb_chars=200,
                                                           ext_word_list=None),
                                         from_addr=to_addr,
                                         tos=[from_addr],
                                         ccs=None,
                                         attachments=None)

                msg_to_store = await mailutils.extract_data_from_msg(msg)
                saved_msg = await storage.storage.store_msg(
                    msg_to_store,
                    account=account,
                    from_addr=to_addr,
                    to_addrs=[from_addr],
                    incoming=True)

    await storage.storage.stop()
示例#4
0
def _test_msg_signing():
    # Use https://www.mail-tester.com to test
    from_address = mailutils.parse_email(
        "Joe SixPack <*****@*****.**>")
    to_address = mailutils.parse_email("Suzie Q <*****@*****.**>")

    with mock.patch('byemail.mailutils.settings') as set_mock:
        set_mock.DKIM_CONFIG = {
            'private_key': os.path.join(DATADIR, 'example_private.pem'),
            'public_key': os.path.join(DATADIR, 'example_public.pem'),
            'selector': 'test',
            'domain': 'example.com',
            'headers': ['From', 'To', 'Subject', 'Date', 'Message-Id']
        }

        msg = mailutils.make_msg("Is dinner ready?",
                                 message_content,
                                 from_addr=from_address,
                                 tos=to_address)

        dkim_sign = mailutils.gen_dkim_sign(msg)

        #new_dkim = mailutils.gen_dkim_sign2(msg)
        #assert old_dkim == new_dkim, "DKIM differs"

        msg['DKIM-Signature'] = dkim_sign
        print(msg['DKIM-Signature'])

    with open(os.path.join(DATADIR, 'example_public.pem')) as key:
        publickey = key.read().replace('\n', '')\
            .replace('-----BEGIN PUBLIC KEY-----', '')\
            .replace('-----END PUBLIC KEY-----', '')

    def dnsfunc(*args):
        print("Called with ", *args)
        return DNS_DKIM_RESPONSE_TPL.format(publickey)

    assert dkim.verify(msg.as_string().encode(), dnsfunc=dnsfunc)
示例#5
0
def test_make_msg(loop):
    """ Test message composition """
    from_address = mailutils.parse_email(
        "Joe SixPack <*****@*****.**>")
    to_address = mailutils.parse_email("Suzie Q <*****@*****.**>")

    with mock.patch('byemail.mailutils.settings') as set_mock:
        set_mock.DKIM_CONFIG = {
            'private_key': os.path.join(DATADIR, 'example_private.pem'),
            'public_key': os.path.join(DATADIR, 'example_public.pem'),
            'selector': 'test',
            'domain': 'example.com',
            'headers': ['From', 'To', 'Subject', 'Date', 'Message-Id']
        }

        msg = mailutils.make_msg("Is dinner ready?",
                                 message_content,
                                 from_addr=from_address,
                                 tos=to_address)

        print(msg)

        assert msg['From'] == str(from_address)