def route_email(peer, mailfrom, rcpttos, data): ''' Route messages according to their destination: <topic>@<mount_point>.<subproj2>.<subproj1>.<project>.projects.domain.net gets sent to c.app.handle_message(topic, message) ''' try: msg = mail_util.parse_message(data) except Exception: # pragma no cover log.exception('Parse Error: (%r,%r,%r)', peer, mailfrom, rcpttos) return if mail_util.is_autoreply(msg): log.info('Skipping autoreply message: %s', msg['headers']) return mail_user = mail_util.identify_sender(peer, mailfrom, msg['headers'], msg) with h.push_config(c, user=mail_user): log.info('Received email from %s', c.user.username) # For each of the addrs, determine the project/app and route # appropriately for addr in rcpttos: try: userpart, project, app = mail_util.parse_address(addr) with h.push_config(c, project=project, app=app): if not app.has_access(c.user, userpart): log.info('Access denied for %s to mailbox %s', c.user, userpart) elif not c.app.config.options.get('AllowEmailPosting', True): log.info("Posting from email is not enabled") else: if msg['multipart']: msg_hdrs = msg['headers'] for part in msg['parts']: if part.get('content_type', '').startswith('multipart/'): continue msg = dict(headers=dict( msg_hdrs, **part['headers']), message_id=part['message_id'], in_reply_to=part['in_reply_to'], references=part['references'], filename=part['filename'], content_type=part['content_type'], payload=part['payload']) c.app.handle_message(userpart, msg) else: c.app.handle_message(userpart, msg) except exc.MailError as e: log.error('Error routing email to %s: %s', addr, e) except Exception: log.exception('Error routing mail to %s', addr)
def route_email( peer, mailfrom, rcpttos, data): ''' Route messages according to their destination: <topic>@<mount_point>.<subproj2>.<subproj1>.<project>.projects.domain.net gets sent to c.app.handle_message(topic, message) ''' try: msg = mail_util.parse_message(data) except: # pragma no cover log.exception('Parse Error: (%r,%r,%r)', peer, mailfrom, rcpttos) return if mail_util.is_autoreply(msg): log.info('Skipping autoreply message: %s', msg['headers']) return mail_user = mail_util.identify_sender(peer, mailfrom, msg['headers'], msg) with h.push_config(c, user=mail_user): log.info('Received email from %s', c.user.username) # For each of the addrs, determine the project/app and route # appropriately for addr in rcpttos: try: userpart, project, app = mail_util.parse_address(addr) with h.push_config(c, project=project, app=app): if not app.has_access(c.user, userpart): log.info('Access denied for %s to mailbox %s', c.user, userpart) elif not c.app.config.options.get('AllowEmailPosting', True): log.info("Posting from email is not enabled") else: if msg['multipart']: msg_hdrs = msg['headers'] for part in msg['parts']: if part.get('content_type', '').startswith('multipart/'): continue msg = dict( headers=dict(msg_hdrs, **part['headers']), message_id=part['message_id'], in_reply_to=part['in_reply_to'], references=part['references'], filename=part['filename'], content_type=part['content_type'], payload=part['payload']) c.app.handle_message(userpart, msg) else: c.app.handle_message(userpart, msg) except exc.MailError, e: log.error('Error routing email to %s: %s', addr, e) except:
def test_parse_address_good(self): topic, project, app = parse_address('[email protected]' + config.common_suffix) assert_equal(topic, 'foo') assert_equal(project.name, 'test') assert_equal(app.__class__.__name__, 'ForgeWikiApp')
def test_parse_address_bad_tool(self): parse_address('[email protected]' + config.common_suffix)
def test_parse_address_missing_tool(self): parse_address('[email protected]' + config.common_suffix)
def test_parse_address_bad_project(self): parse_address('[email protected]' + config.common_suffix)
def test_parse_address_bad_domain(self): parse_address('*****@*****.**')
def test_parse_address_good(self): topic, project, app = parse_address('[email protected]' + config.common_suffix) assert_equal(topic, 'foo') assert_equal(project.shortname, 'test') assert_true(isinstance(app, Application))
def test_parse_address_alternate_domain(self): parse_address('*****@*****.**') parse_address('*****@*****.**')
def test_parse_address_good(self): topic, project, app = parse_address( '[email protected]' + config.common_suffix) assert_equal(topic, 'foo') assert_equal(project.shortname, 'test') assert_true(isinstance(app, Application))