コード例 #1
0
    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
コード例 #2
0
ファイル: kernel.py プロジェクト: yasusii/shaling
  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
コード例 #3
0
 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
コード例 #4
0
ファイル: kernel.py プロジェクト: yasusii/shaling
 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
コード例 #5
0
ファイル: message.py プロジェクト: yasusii/shaling
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))
コード例 #6
0
ファイル: message.py プロジェクト: yasusii/shaling
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))