def resolve_address(self, addr): r = {} pat = re.compile(re.escape(addr), re.I | re.UNICODE) preds = [EMailPredicate('addr:' + addr)] corpus = self.get_corpus() try: selection = Selection(corpus, preds, doc_preds=[DEFAULT_FILTER_WITH_SENT], safe=False) for (i, doc) in selection.iter(timeout=1): msg = doc.get_msg() for (n, a) in unicode_getalladdrs(msg, 'from', 'to', 'cc'): x = formataddr((n, a)) if not pat.search(x): continue a = a.lower() if a not in r: r[a] = (1, x) else: (n, x) = r[a] r[a] = (n + 1, x) if config.RESOLVE_ADDRESS_NADDRS <= (i + 1): break except SearchTimeout: pass # ambiguous? return sorted(r.itervalues(), reverse=True)
def resolve_address(self, addr): r = {} pat = re.compile(re.escape(addr), re.I | re.UNICODE) preds = [ EMailPredicate('addr:'+addr) ] corpus = self.get_corpus() try: selection = Selection(corpus, preds, doc_preds=[ DEFAULT_FILTER_WITH_SENT ], safe=False) for (i,doc) in selection.iter(timeout=1): msg = doc.get_msg() for (n, a) in unicode_getalladdrs(msg, 'from', 'to', 'cc'): x = formataddr((n, a)) if not pat.search(x): continue a = a.lower() if a not in r: r[a] = (1, x) else: (n, x) = r[a] r[a] = (n+1, x) if config.RESOLVE_ADDRESS_NADDRS <= (i+1): break except SearchTimeout: pass # ambiguous? return sorted(r.itervalues(), reverse=True)
def resolve1((user, addr)): if user: return formataddr((user, addr)) if addr in config.ADDRESS_ALIASES: return config.ADDRESS_ALIASES[addr] r = self.resolve_address(addr) if not r: return addr (n, x) = r[0] threshold = int(len(r) * config.RESOLVE_ADDRESS_RATIO + 0.5) if n <= threshold: return addr return x
def resolve1((user,addr)): if user: return formataddr((user, addr)) if addr in config.ADDRESS_ALIASES: return config.ADDRESS_ALIASES[addr] r = self.resolve_address(addr) if not r: return addr (n, x) = r[0] threshold = int(len(r)*config.RESOLVE_ADDRESS_RATIO + 0.5) if n <= threshold: return addr return x
def setup_template_string( fromaddr, addrs_to, addrs_cc, addrs_bcc, is_group, subject, labels, headermsgs, includemsgs, forwardlocs ): width = 80 def fold_header(items, sep=", "): lines = [] line = "" for x in items: if not line: line = x elif width < len(line) + len(sep) + len(x): lines.append(line + sep) line = "\t" + x else: line += sep + x if line: lines.append(line) return "\n".join(lines) if forwardlocs: # Append 'Fwd:' if necessary. for m in headermsgs: # Take the subject of the first message. if not subject and m["subject"]: subject = "Fwd: " + unicode_header(m["subject"]) break else: # Append 'Re:' if necessary. for m in headermsgs: # Take the subject if not set. if not subject and m["subject"]: subject = unicode_header(m["subject"]) if not re.match("\s*re:", subject, re.I): subject = "Re: " + subject break # Add extra recipients. for m in headermsgs: if m["mail-reply-to"]: addrs_to.extend(unicode_getall(m, "mail-reply-to")) elif m["reply-to"]: addrs_to.extend(unicode_getall(m, "reply-to")) else: addrs_to.append(unicode_header(m["from"])) if is_group: addrs_cc.extend(formataddr((n, a)) for (n, a) in unicode_getalladdrs(m, "to", "cc")) # msgids = set() refids = set() if headermsgs: for msg in headermsgs: if msg["message-id"]: msgids.add(msg["message-id"]) if msg["references"]: for x in msg.get_all("references"): refids.update(get_msgids(x)) # lines = [] lines.append("From: %s" % fromaddr) lines.append("To: %s" % fold_header(addrs_to)) lines.append("Cc: %s" % fold_header(addrs_cc)) lines.append("Bcc: %s" % fold_header(addrs_bcc)) lines.append("Label: %s" % get_label_names(labels)) lines.append("Subject: %s" % subject) if headermsgs: lines.append("References: %s" % fold_header(msgids.union(refids), " ")) lines.append("In-Reply-To: %s" % fold_header(msgids, " ")) if forwardlocs: lines.append("X-Forward-Msg: %s" % (", ".join(forwardlocs))) lines.append("") if includemsgs: for msg in includemsgs: from0 = unicode_header(msg["from"]) or "unknown person" date0 = unicode_header(msg["date"]) or "unknown date" subject0 = unicode_header(msg["subject"]) or "unknown subject" quoted_lines = [] charset = msg.get_content_charset() for (i, mpart, level) in enum_message_parts(msg, favor="text/plain"): if mpart.get_content_maintype() == "text": text = get_body_text(mpart, charset) quoted_lines.extend(text.splitlines()) lines.extend(config.quotemsg(from0, date0, subject0, quoted_lines)) return "\n".join(lines) + "\n"
def setup_template_string(fromaddr, addrs_to, addrs_cc, addrs_bcc, is_group, subject, labels, headermsgs, includemsgs, forwardlocs): width = 80 def fold_header(items, sep=', '): lines = [] line = '' for x in items: if not line: line = x elif width < len(line) + len(sep) + len(x): lines.append(line + sep) line = '\t' + x else: line += sep + x if line: lines.append(line) return '\n'.join(lines) if forwardlocs: # Append 'Fwd:' if necessary. for m in headermsgs: # Take the subject of the first message. if not subject and m['subject']: subject = 'Fwd: ' + unicode_header(m['subject']) break else: # Append 'Re:' if necessary. for m in headermsgs: # Take the subject if not set. if not subject and m['subject']: subject = unicode_header(m['subject']) if not re.match('\s*re:', subject, re.I): subject = 'Re: ' + subject break # Add extra recipients. for m in headermsgs: if m['mail-reply-to']: addrs_to.extend(unicode_getall(m, 'mail-reply-to')) elif m['reply-to']: addrs_to.extend(unicode_getall(m, 'reply-to')) else: addrs_to.append(unicode_header(m['from'])) if is_group: addrs_cc.extend( formataddr((n, a)) for (n, a) in unicode_getalladdrs(m, 'to', 'cc')) # msgids = set() refids = set() if headermsgs: for msg in headermsgs: if msg['message-id']: msgids.add(msg['message-id']) if msg['references']: for x in msg.get_all('references'): refids.update(get_msgids(x)) # lines = [] lines.append('From: %s' % fromaddr) lines.append('To: %s' % fold_header(addrs_to)) lines.append('Cc: %s' % fold_header(addrs_cc)) lines.append('Bcc: %s' % fold_header(addrs_bcc)) lines.append('Label: %s' % get_label_names(labels)) lines.append('Subject: %s' % subject) if headermsgs: lines.append('References: %s' % fold_header(msgids.union(refids), ' ')) lines.append('In-Reply-To: %s' % fold_header(msgids, ' ')) if forwardlocs: lines.append('X-Forward-Msg: %s' % (', '.join(forwardlocs))) lines.append('') if includemsgs: for msg in includemsgs: from0 = unicode_header(msg['from']) or 'unknown person' date0 = unicode_header(msg['date']) or 'unknown date' subject0 = unicode_header(msg['subject']) or 'unknown subject' quoted_lines = [] charset = msg.get_content_charset() for (i, mpart, level) in enum_message_parts(msg, favor='text/plain'): if mpart.get_content_maintype() == 'text': text = get_body_text(mpart, charset) quoted_lines.extend(text.splitlines()) lines.extend(config.quotemsg(from0, date0, subject0, quoted_lines)) return '\n'.join(lines) + '\n'