def cmd_thread(self, args): 'usage: thread [msg]' try: (opts, args) = getopt(args, '') except GetoptError: raise Kernel.ShowUsage() (docs, args) = self.get_messages(args or ['.']) if args: self.terminal.warning('Arguments ignored: %r' % args) if not docs: raise Kernel.SyntaxError('No message is specified.') msgids = set() for (_, doc, part) in docs: msg = doc.get_msg() if 'references' in msg: msgids.update(get_msgids(msg['references'])) if 'in-reply-to' in msg: msgids.update(get_msgids(msg['in-reply-to'])) if 'message-id' in msg: msgids.add(msg['message-id']) self.cmd_scan(['references: ' + ' '.join(list(msgids))]) return
def cmd_thread(self, args): 'usage: thread [msg]' try: (opts, args) = getopt(args, '') except GetoptError: raise Kernel.ShowUsage() (docs, args) = self.get_messages(args or ['.']) if args: self.terminal.warning('Arguments ignored: %r' % args) if not docs: raise Kernel.SyntaxError('No message is specified.') msgids = set() for (_,doc,part) in docs: msg = doc.get_msg() if 'references' in msg: msgids.update(get_msgids(msg['references'])) if 'in-reply-to' in msg: msgids.update(get_msgids(msg['in-reply-to'])) if 'message-id' in msg: msgids.add(msg['message-id']) self.cmd_scan(['references: '+' '.join(list(msgids))]) return
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'