Beispiel #1
0
    def savemessage(self, uid, content, flags, rtime):
        """Save the message on the Server

        This backend always assigns a new uid, so the uid arg is ignored.

        This function will update the self.messagelist dict to contain
        the new message after sucessfully saving it, including labels.

        See folder/Base for details. Note that savemessage() does not
        check against dryrun settings, so you need to ensure that
        savemessage is never called in a dryrun mode.

        :param rtime: A timestamp to be used as the mail date
        :returns: the UID of the new message as assigned by the server. If the
                  message is saved, but it's UID can not be found, it will
                  return 0. If the message can't be written (folder is
                  read-only for example) it will return -1."""

        if not self.synclabels:
            return super(GmailFolder,
                         self).savemessage(uid, content, flags, rtime)

        labels = set()
        for hstr in self.getmessageheaderlist(content, self.labelsheader):
            labels.update(imaputil.labels_from_header(self.labelsheader, hstr))

        ret = super(GmailFolder, self).savemessage(uid, content, flags, rtime)
        self.savemessagelabels(ret, labels)
        return ret
Beispiel #2
0
    def savemessagelabels(self, uid, labels, ignorelabels=None):
        """Change a message's labels to `labels`.

        Note that this function does not check against dryrun settings,
        so you need to ensure that it is never called in a dryrun mode."""

        if ignorelabels is None:
            ignorelabels = set()

        filename = self.messagelist[uid]['filename']
        filepath = os.path.join(self.getfullname(), filename)

        with codecs.open(filepath, 'r', errors='replace', encoding='utf-8') as f:
            content = f.read()

        oldlabels = set()
        for hstr in self.getmessageheaderlist(content, self.labelsheader):
            oldlabels.update(imaputil.labels_from_header(self.labelsheader,
                                                         hstr))

        labels = labels - ignorelabels
        ignoredlabels = oldlabels & ignorelabels
        oldlabels = oldlabels - ignorelabels

        # Nothing to change.
        if labels == oldlabels:
            return

        # Change labels into content.
        labels_str = imaputil.format_labels_string(self.labelsheader,
                                                   sorted(labels | ignoredlabels))

        # First remove old labels header, and then add the new one.
        content = self.deletemessageheaders(content, self.labelsheader)
        content = self.addmessageheader(content, '\n', self.labelsheader,
                                        labels_str)

        mtime = int(os.stat(filepath).st_mtime)

        # Write file with new labels to a unique file in tmp.
        messagename = self.new_message_filename(uid, set())
        tmpname = self.save_to_tmp_file(messagename, content)
        tmppath = os.path.join(self.getfullname(), tmpname)

        # Move to actual location.
        try:
            os.rename(tmppath, filepath)
        except OSError as e:
            raise OfflineImapError("Can't rename file '%s' to '%s': %s" %
                                   (tmppath, filepath, e[1]),
                                   OfflineImapError.ERROR.FOLDER,
                                   exc_info()[2])

        # If utime_from_header=true, we don't want to change the mtime.
        if self._utime_from_header and mtime:
            os.utime(filepath, (mtime, mtime))

        # save the new mtime and labels
        self.messagelist[uid]['mtime'] = int(os.stat(filepath).st_mtime)
        self.messagelist[uid]['labels'] = labels
Beispiel #3
0
    def savemessage(self, uid, msg, flags, rtime):
        """Writes a new message, with the specified uid.

        See folder/Base for detail. Note that savemessage() does not
        check against dryrun settings, so you need to ensure that
        savemessage is never called in a dryrun mode."""

        if not self.synclabels:
            return super(GmailMaildirFolder,
                         self).savemessage(uid, msg, flags, rtime)

        labels = set()
        for hstr in self.getmessageheaderlist(msg, self.labelsheader):
            labels.update(imaputil.labels_from_header(self.labelsheader, hstr))

        # TODO - Not sure why the returned uid is stored early as ret here?
        ret = super(GmailMaildirFolder,
                    self).savemessage(uid, msg, flags, rtime)

        # Update the mtime and labels.
        filename = self.messagelist[uid]['filename']
        filepath = os.path.join(self.getfullname(), filename)
        self.messagelist[uid]['mtime'] = int(os.stat(filepath).st_mtime)
        self.messagelist[uid]['labels'] = labels
        return ret
Beispiel #4
0
    def savemessage(self, uid, content, flags, rtime):
        """Save the message on the Server

        This backend always assigns a new uid, so the uid arg is ignored.

        This function will update the self.messagelist dict to contain
        the new message after sucessfully saving it, including labels.

        See folder/Base for details. Note that savemessage() does not
        check against dryrun settings, so you need to ensure that
        savemessage is never called in a dryrun mode.

        :param rtime: A timestamp to be used as the mail date
        :returns: the UID of the new message as assigned by the server. If the
                  message is saved, but it's UID can not be found, it will
                  return 0. If the message can't be written (folder is
                  read-only for example) it will return -1."""

        if not self.synclabels:
            return super(GmailFolder, self).savemessage(uid, content, flags, rtime)

        labels = set()
        for hstr in self.getmessageheaderlist(content, self.labelsheader):
            labels.update(imaputil.labels_from_header(self.labelsheader, hstr))

        ret = super(GmailFolder, self).savemessage(uid, content, flags, rtime)
        self.savemessagelabels(ret, labels)
        return ret
Beispiel #5
0
    def savemessagelabels(self, uid, labels, ignorelabels=set()):
        """Change a message's labels to `labels`.

        Note that this function does not check against dryrun settings,
        so you need to ensure that it is never called in a dryrun mode."""

        filename = self.messagelist[uid]['filename']
        filepath = os.path.join(self.getfullname(), filename)

        file = open(filepath, 'rt')
        content = file.read()
        file.close()

        oldlabels = set()
        for hstr in self.getmessageheaderlist(content, self.labelsheader):
            oldlabels.update(imaputil.labels_from_header(self.labelsheader,
                                                         hstr))

        labels = labels - ignorelabels
        ignoredlabels = oldlabels & ignorelabels
        oldlabels = oldlabels - ignorelabels

        # Nothing to change.
        if labels == oldlabels:
            return

        # Change labels into content.
        labels_str = imaputil.format_labels_string(self.labelsheader,
          sorted(labels | ignoredlabels))

        # First remove old labels header, and then add the new one.
        content = self.deletemessageheaders(content, self.labelsheader)
        content = self.addmessageheader(content, '\n', self.labelsheader,
                                        labels_str)

        mtime = int(os.stat(filepath).st_mtime)

        # Write file with new labels to a unique file in tmp.
        messagename = self.new_message_filename(uid, set())
        tmpname = self.save_to_tmp_file(messagename, content)
        tmppath = os.path.join(self.getfullname(), tmpname)

        # Move to actual location.
        try:
            os.rename(tmppath, filepath)
        except OSError as e:
            six.reraise(OfflineImapError,
                    OfflineImapError("Can't rename file '%s' to '%s': %s"%
                        (tmppath, filepath, e[1]),
                        OfflineImapError.ERROR.FOLDER),
                    exc_info()[2])

        # If utime_from_header=true, we don't want to change the mtime.
        if self._utime_from_header and mtime:
            os.utime(filepath, (mtime, mtime))

        # save the new mtime and labels
        self.messagelist[uid]['mtime'] = int(os.stat(filepath).st_mtime)
        self.messagelist[uid]['labels'] = labels
Beispiel #6
0
    def savemessagelabels(self, uid, labels, ignorelabels=set()):
        """Change a message's labels to `labels`.

        Note that this function does not check against dryrun settings,
        so you need to ensure that it is never called in a dryrun mode."""

        filename = self.messagelist[uid]['filename']
        filepath = os.path.join(self.getfullname(), filename)

        file = open(filepath, 'rt')
        content = file.read()
        file.close()

        oldlabels = set()
        for hstr in self.getmessageheaderlist(content, self.labelsheader):
            oldlabels.update(imaputil.labels_from_header(self.labelsheader, hstr))

        labels = labels - ignorelabels
        ignoredlabels = oldlabels & ignorelabels
        oldlabels = oldlabels - ignorelabels

        # Nothing to change
        if labels == oldlabels:
            return

        # Change labels into content
        labels_str = imaputil.format_labels_string(self.labelsheader,
          sorted(labels | ignoredlabels))

        # First remove old labels header, and then add the new one
        content = self.deletemessageheaders(content, self.labelsheader)
        content = self.addmessageheader(content, '\n', self.labelsheader, labels_str)

        rtime = self.messagelist[uid].get('rtime', None)

        # write file with new labels to a unique file in tmp
        messagename = self.new_message_filename(uid, set())
        tmpname = self.save_to_tmp_file(messagename, content)
        tmppath = os.path.join(self.getfullname(), tmpname)

        # move to actual location
        try:
            os.rename(tmppath, filepath)
        except OSError as e:
            raise OfflineImapError("Can't rename file '%s' to '%s': %s" % \
              (tmppath, filepath, e[1]), OfflineImapError.ERROR.FOLDER), \
              None, exc_info()[2]

        if rtime != None:
            os.utime(filepath, (rtime, rtime))

        # save the new mtime and labels
        self.messagelist[uid]['mtime'] = long(os.stat(filepath).st_mtime)
        self.messagelist[uid]['labels'] = labels
Beispiel #7
0
    def savemessagelabels(self, uid, labels, ignorelabels=set()):
        """Change a message's labels to `labels`.

        Note that this function does not check against dryrun settings,
        so you need to ensure that it is never called in a dryrun mode."""

        filename = self.messagelist[uid]['filename']
        filepath = os.path.join(self.getfullname(), filename)

        file = open(filepath, 'rt')
        content = file.read()
        file.close()

        oldlabels = imaputil.labels_from_header(self.labelsheader,
          self.getmessageheader(content, self.labelsheader))


        labels = labels - ignorelabels
        ignoredlabels = oldlabels & ignorelabels
        oldlabels = oldlabels - ignorelabels

        # Nothing to change
        if labels == oldlabels:
            return

        # Change labels into content
        labels_str = imaputil.format_labels_string(self.labelsheader,
          sorted(labels | ignoredlabels))
        content = self.addmessageheader(content, '\n', self.labelsheader, labels_str)
        rtime = self.messagelist[uid].get('rtime', None)

        # write file with new labels to a unique file in tmp
        messagename = self.new_message_filename(uid, set())
        tmpname = self.save_to_tmp_file(messagename, content)
        tmppath = os.path.join(self.getfullname(), tmpname)

        # move to actual location
        try:
            os.rename(tmppath, filepath)
        except OSError as e:
            raise OfflineImapError("Can't rename file '%s' to '%s': %s" % \
              (tmppath, filepath, e[1]), OfflineImapError.ERROR.FOLDER)

        if rtime != None:
            os.utime(filepath, (rtime, rtime))

        # save the new mtime and labels
        self.messagelist[uid]['mtime'] = long(os.stat(filepath).st_mtime)
        self.messagelist[uid]['labels'] = labels
Beispiel #8
0
    def getmessagelabels(self, uid):
        # Labels are not cached in cachemessagelist because it is too slow.
        if not 'labels' in self.messagelist[uid]:
            filename = self.messagelist[uid]['filename']
            filepath = os.path.join(self.getfullname(), filename)

            if not os.path.exists(filepath):
                return set()

            file = open(filepath, 'rt')
            content = file.read()
            file.close()

            self.messagelist[uid]['labels'] = \
              imaputil.labels_from_header(self.labelsheader,
              self.getmessageheader(content, self.labelsheader))

        return self.messagelist[uid]['labels']
Beispiel #9
0
    def getmessagelabels(self, uid):
        # Labels are not cached in cachemessagelist because it is too slow.
        if not 'labels' in self.messagelist[uid]:
            filename = self.messagelist[uid]['filename']
            filepath = os.path.join(self.getfullname(), filename)

            if not os.path.exists(filepath):
                return set()

            file = open(filepath, 'rt')
            content = file.read()
            file.close()

            self.messagelist[uid]['labels'] = \
              imaputil.labels_from_header(self.labelsheader,
              self.getmessageheader(content, self.labelsheader))


        return self.messagelist[uid]['labels']
Beispiel #10
0
    def getmessagelabels(self, uid):
        # Labels are not cached in cachemessagelist because it is too slow.
        if not self.messagelist[uid]['labels_cached']:
            filename = self.messagelist[uid]['filename']
            filepath = os.path.join(self.getfullname(), filename)

            if not os.path.exists(filepath):
                return set()

            with codecs.open(filepath, 'r', errors='replace', encoding='utf-8') as f:
                content = f.read()

            self.messagelist[uid]['labels'] = set()
            for hstr in self.getmessageheaderlist(content, self.labelsheader):
                self.messagelist[uid]['labels'].update(
                    imaputil.labels_from_header(self.labelsheader, hstr))
            self.messagelist[uid]['labels_cached'] = True

        return self.messagelist[uid]['labels']
Beispiel #11
0
    def getmessagelabels(self, uid):
        # Labels are not cached in cachemessagelist because it is too slow.
        if not self.messagelist[uid]["labels_cached"]:
            filename = self.messagelist[uid]["filename"]
            filepath = os.path.join(self.getfullname(), filename)

            if not os.path.exists(filepath):
                return set()

            file = open(filepath, "rt")
            content = file.read()
            file.close()

            self.messagelist[uid]["labels"] = imaputil.labels_from_header(
                self.labelsheader, self.getmessageheader(content, self.labelsheader)
            )
            self.messagelist[uid]["labels_cached"] = True

        return self.messagelist[uid]["labels"]
Beispiel #12
0
    def savemessage(self, uid, content, flags, rtime):
        """Writes a new message, with the specified uid.

        See folder/Base for detail. Note that savemessage() does not
        check against dryrun settings, so you need to ensure that
        savemessage is never called in a dryrun mode."""

        if not self.synclabels:
            return super(GmailMaildirFolder, self).savemessage(uid, content, flags, rtime)

        labels = imaputil.labels_from_header(self.labelsheader, self.getmessageheader(content, self.labelsheader))
        ret = super(GmailMaildirFolder, self).savemessage(uid, content, flags, rtime)

        # Update the mtime and labels
        filename = self.messagelist[uid]["filename"]
        filepath = os.path.join(self.getfullname(), filename)
        self.messagelist[uid]["mtime"] = long(os.stat(filepath).st_mtime)
        self.messagelist[uid]["labels"] = labels
        return ret
Beispiel #13
0
    def getmessagelabels(self, uid):
        # Labels are not cached in cachemessagelist because it is too slow.
        if not self.messagelist[uid]['labels_cached']:
            filename = self.messagelist[uid]['filename']
            filepath = os.path.join(self.getfullname(), filename)

            if not os.path.exists(filepath):
                return set()

            fd = open(filepath, 'rb')
            msg = self.parser['8bit'].parse(fd)
            fd.close()

            self.messagelist[uid]['labels'] = set()
            for hstr in self.getmessageheaderlist(msg, self.labelsheader):
                self.messagelist[uid]['labels'].update(
                    imaputil.labels_from_header(self.labelsheader, hstr))
            self.messagelist[uid]['labels_cached'] = True

        return self.messagelist[uid]['labels']
Beispiel #14
0
    def savemessage(self, uid, content, flags, rtime):
        """Writes a new message, with the specified uid.

        See folder/Base for detail. Note that savemessage() does not
        check against dryrun settings, so you need to ensure that
        savemessage is never called in a dryrun mode."""

        if not self.synclabels:
            return super(GmailMaildirFolder,
                         self).savemessage(uid, content, flags, rtime)

        labels = imaputil.labels_from_header(
            self.labelsheader, self.getmessageheader(content,
                                                     self.labelsheader))
        ret = super(GmailMaildirFolder,
                    self).savemessage(uid, content, flags, rtime)

        # Update the mtime and labels
        filename = self.messagelist[uid]['filename']
        filepath = os.path.join(self.getfullname(), filename)
        self.messagelist[uid]['mtime'] = long(os.stat(filepath).st_mtime)
        self.messagelist[uid]['labels'] = labels
        return ret