def submit_message(self, data, original=None): corpus = self.get_corpus() corpus.set_writable() if not original: (msg, labels) = message.create_message(corpus, data) else: doc = corpus.get_doc(original) (msg, labels) = message.create_message(corpus, data, doc.get_msg(0)) corpus.mark_deleted(original) # Get labels. # We silently ignore unknown labels, # because we shouldn't throw any exception. def get_labels(labels): for name in labels: try: c = config.str2label(name) yield c except config.UnknownLabel: pass return labels = set(get_labels(labels)) # Resolve addresses. # We silently ignore unresolved addresses. 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 alt_headers = [] for (k, v) in msg.items(): if k.lower() in ('to', 'cc', 'bcc'): v = ', '.join(resolve1(addr) for addr in unicode_getaddrs(v)) alt_headers.append((k, v)) for (k, _) in alt_headers: del msg[k] for (k, v) in alt_headers: msg[k] = v loc = corpus.add_message(msg_repr(msg), labels) corpus.flush(self.notice_indexing) # show the edited message. self.select_tmp('edit', corpus, [loc]) return loc
def submit_message(self, data, original=None): corpus = self.get_corpus() corpus.set_writable() if not original: (msg, labels) = message.create_message(corpus, data) else: doc = corpus.get_doc(original) (msg, labels) = message.create_message(corpus, data, doc.get_msg(0)) corpus.mark_deleted(original) # Get labels. # We silently ignore unknown labels, # because we shouldn't throw any exception. def get_labels(labels): for name in labels: try: c = config.str2label(name) yield c except config.UnknownLabel: pass return labels = set(get_labels(labels)) # Resolve addresses. # We silently ignore unresolved addresses. 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 alt_headers = [] for (k,v) in msg.items(): if k.lower() in ('to', 'cc', 'bcc'): v = ', '.join( resolve1(addr) for addr in unicode_getaddrs(v) ) alt_headers.append((k,v)) for (k,_) in alt_headers: del msg[k] for (k,v) in alt_headers: msg[k] = v loc = corpus.add_message(msg_repr(msg), labels) corpus.flush(self.notice_indexing) # show the edited message. self.select_tmp('edit', corpus, [loc]) return loc
def cmd_mime(self, args): 'usage: mime [-R)emove] [-m mimetype] [-c charset] msg[:part] files ...' try: (opts, args) = getopt(args, 'Rm:c:') except GetoptError: raise Kernel.ShowUsage() # charset = None mimetype = None remove = False for (k, v) in opts: if k == '-R': remove = True elif k == '-m': mimetype = v elif k == '-c': charset = v # (docs, args) = self.get_messages(args) corpus = self.get_selection().get_corpus() corpus.set_writable() if len(docs) != 1: raise Kernel.SyntaxError('Can edit only one message at a time.') # (_, doc, part) = docs[0] if config.LABEL4DRAFT not in doc.get_labels(): raise Kernel.ValueError('Message not in the draft.') msg = doc.get_msg(0) if remove: # Remove an attachment. if args: self.terminal.warning('Arguments ignored: %r' % args) msg = message.mime_del(msg, part) elif part: # Replace an attachment. if len(args) != 1: raise Kernel.SyntaxError( 'Need to supply exactly one filename.') (fname, data) = self.terminal.load_file(args[0]) obj = message.mime_new(fname, data, mimetype, charset) msg = message.mime_alter(msg, part, obj) else: if not args: raise Kernel.SyntaxError('Need to supply attachment(s).') # Append an object. for fname in args: (fname, data) = self.terminal.load_file(fname) obj = message.mime_new(fname, data, mimetype, charset) msg = message.mime_add(msg, obj) corpus.mark_deleted(doc.loc) loc = corpus.add_message(msg_repr(msg), doc.get_labels()) self.select_tmp('mime', corpus, [loc]) return
def cmd_mime(self, args): 'usage: mime [-R)emove] [-m mimetype] [-c charset] msg[:part] files ...' try: (opts, args) = getopt(args, 'Rm:c:') except GetoptError: raise Kernel.ShowUsage() # charset = None mimetype = None remove = False for (k,v) in opts: if k == '-R': remove = True elif k == '-m': mimetype = v elif k == '-c': charset = v # (docs, args) = self.get_messages(args) corpus = self.get_selection().get_corpus() corpus.set_writable() if len(docs) != 1: raise Kernel.SyntaxError('Can edit only one message at a time.') # (_,doc,part) = docs[0] if config.LABEL4DRAFT not in doc.get_labels(): raise Kernel.ValueError('Message not in the draft.') msg = doc.get_msg(0) if remove: # Remove an attachment. if args: self.terminal.warning('Arguments ignored: %r' % args) msg = message.mime_del(msg, part) elif part: # Replace an attachment. if len(args) != 1: raise Kernel.SyntaxError('Need to supply exactly one filename.') (fname, data) = self.terminal.load_file(args[0]) obj = message.mime_new(fname, data, mimetype, charset) msg = message.mime_alter(msg, part, obj) else: if not args: raise Kernel.SyntaxError('Need to supply attachment(s).') # Append an object. for fname in args: (fname, data) = self.terminal.load_file(fname) obj = message.mime_new(fname, data, mimetype, charset) msg = message.mime_add(msg, obj) corpus.mark_deleted(doc.loc) loc = corpus.add_message(msg_repr(msg), doc.get_labels()) self.select_tmp('mime', corpus, [loc]) return
def send_message(msg, fromaddr, rcpts): import time, smtplib def getlogin(): import os if hasattr(os, "getlogin"): return os.getlogin() try: # WARNING: untested code! import _winreg key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer") (name, _) = _winreg.QueryValueEx(key, "Logon User Name") key.Close() return name except ImportError: return "???" # Assign a message-id if there isn't one. if not msg["message-id"]: msg["Message-ID"] = make_msgid(getlogin()) # Assign the date. msg["Date"] = formatdate(time.time(), localtime=True) # Now remove BCC and other redundant (empty) headers. del msg["bcc"] for (k, v) in msg.items(): if not rmsp(v): del msg[k] data = msg_repr(msg) # Send the message. smtp = smtplib.SMTP() (host, port, user, password, tls) = config.SMTP_HOST try: smtp.connect(host, port) if tls: smtp.ehlo() smtp.starttls() smtp.ehlo() if user and password: smtp.login(user, password) smtp.sendmail(fromaddr, rcpts, data) except smtplib.SMTPException, e: raise MessageTransportError(str(e))
def send_message(msg, fromaddr, rcpts): import time, smtplib def getlogin(): import os if hasattr(os, 'getlogin'): return os.getlogin() try: # WARNING: untested code! import _winreg key = _winreg.OpenKey( _winreg.HKEY_CURRENT_USER, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer') (name, _) = _winreg.QueryValueEx(key, 'Logon User Name') key.Close() return name except ImportError: return '???' # Assign a message-id if there isn't one. if not msg['message-id']: msg['Message-ID'] = make_msgid(getlogin()) # Assign the date. msg['Date'] = formatdate(time.time(), localtime=True) # Now remove BCC and other redundant (empty) headers. del msg['bcc'] for (k, v) in msg.items(): if not rmsp(v): del msg[k] data = msg_repr(msg) # Send the message. smtp = smtplib.SMTP() (host, port, user, password, tls) = config.SMTP_HOST try: smtp.connect(host, port) if tls: smtp.ehlo() smtp.starttls() smtp.ehlo() if user and password: smtp.login(user, password) smtp.sendmail(fromaddr, rcpts, data) except smtplib.SMTPException, e: raise MessageTransportError(str(e))