def process_inbound(self, raw): """Process inbound message. @param raw: a RawMessage object @rtype: NewMessage """ message = MailMessage(raw.raw_data) new_message = NewInboundMessage() new_message.raw_msg_id = raw.raw_msg_id new_message.subject = message.subject new_message.body_html = message.body_html new_message.body_plain = message.body_plain new_message.date = message.date new_message.size = message.size new_message.protocol = message.message_protocol new_message.is_unread = True new_message.is_draft = False new_message.is_answered = False new_message.is_received = True new_message.importance_level = 0 # XXX tofix on parser new_message.external_references = message.external_references participants = [] for p in message.participants: participant, contact = self.get_participant(message, p) new_message.participants.append(participant) participants.append((participant, contact)) if not participants: raise Exception("no participant found in raw message {}".format( raw.raw_msg_id)) for a in message.attachments: attachment = Attachment() attachment.content_type = a.content_type attachment.file_name = a.filename attachment.size = a.size attachment.mime_boundary = a.mime_boundary if hasattr(a, "is_inline"): attachment.is_inline = a.is_inline new_message.attachments.append(attachment) # Compute PI !! conf = Configuration('global').configuration extractor = InboundMailFeature(message, conf) extractor.process(self.user, new_message, participants) # compute tags self._get_tags(new_message) if new_message.tags: log.debug('Resolved tags {}'.format(new_message.tags)) # lookup by external references lookup_sequence = self.lookup_discussion_sequence(message, new_message) lkp = self.lookup(lookup_sequence) log.debug('Lookup with sequence {} give {}'. format(lookup_sequence, lkp)) if lkp: new_message.discussion_id = lkp.discussion_id else: discussion = Discussion.create_from_message(self.user, message) log.debug('Created discussion {}'.format(discussion.discussion_id)) new_message.discussion_id = discussion.discussion_id self.create_lookups(lookup_sequence, new_message) # Format features new_message.privacy_features = \ marshal_features(new_message.privacy_features) try: new_message.validate() except Exception as exc: log.error( "validation failed with error : « {} » \ for new_message {}[dump : {}]".format( exc, new_message, vars(new_message))) raise exc return new_message
def process_inbound(self, raw): """Process inbound message. @param raw: a RawMessage object @rtype: NewMessage """ email = MailMessage(raw.raw_data) new_message = NewInboundMessage() new_message.raw_msg_id = raw.raw_msg_id new_message.subject = email.subject new_message.body_html = email.body_html new_message.body_plain = email.body_plain new_message.date = email.date new_message.size = email.size new_message.protocol = email.message_protocol new_message.is_unread = True new_message.is_draft = False new_message.is_answered = False new_message.is_received = True new_message.importance_level = 0 # XXX tofix on parser new_message.external_references = email.external_references participants = [] for p in email.participants: p.address = p.address.lower() try: participant, contact = self.get_participant(email, p) new_message.participants.append(participant) participants.append((participant, contact)) except Exception as exc: log.error( "process_inbound failed to lookup participant for email {} : {}" .format(vars(email), exc)) raise exc if not participants: raise Exception("no participant found in raw email {}".format( raw.raw_msg_id)) for a in email.attachments: attachment = Attachment() attachment.content_type = a.content_type attachment.file_name = a.filename attachment.size = a.size attachment.mime_boundary = a.mime_boundary if hasattr(a, "is_inline"): attachment.is_inline = a.is_inline new_message.attachments.append(attachment) # Compute PI !! conf = Configuration('global').configuration extractor = InboundMailFeature(email, conf) extractor.process(self.user, new_message, participants) # compute user tags self._get_tags(new_message) # embed external flags if any new_message.ext_tags = email.external_flags if new_message.tags: log.debug('Resolved tags {}'.format(new_message.tags)) # build discussion_id from lookup_sequence lookup_sequence, discussion_id = self.lookup_discussion_sequence( email, new_message) log.debug('Lookup with sequence {} gives {}'.format( lookup_sequence, discussion_id)) new_message.discussion_id = discussion_id # upsert lookup tables discuss = Discussion(self.user) discuss.upsert_lookups_for_participants(new_message.participants) # Format features new_message.privacy_features = \ marshal_features(new_message.privacy_features) try: new_message.validate() except Exception as exc: log.error("validation failed with error : « {} » \ for new_message {}[dump : {}]".format(exc, new_message, vars(new_message))) raise exc return new_message