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)
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)
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()
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)
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)