<DKIM> maxage causes loss of local email

Janna Martl janna.martl109 at gmail.com
Thu Mar 5 06:54:11 GMT 2015

There's more to this than I thought at first.

On Tue, Mar 03, 2015 at 12:16:47PM +0100, Nicolas Sebrecht wrote:
>So, in folder/Maildir.py we set the timestamp with
>  def savemessage(self, uid, content, flags, rtime):
>      <...>
>      if rtime != None:
>          os.utime(os.path.join(self.getfullname(), tmpname), (rtime, rtime))
>      <...>

At this point, for me, rtime = None, so this isn't doing anything.
This function is called by copymessageto() in Base.py, and the rtime
it passes to savemessage() is set in the following lines:

            rtime = self.getmessagetime(uid)
            if dstfolder.utime_from_message:
                content = self.getmessage(uid)
                rtime = emailutil.get_message_date(content, 'Date')

I have two things to say about these lines:

(1) In line 1, self.getmessagetime() (here self = the remote folder) returns
None for me. This is because in:

    def cachemessagelist(self):
		rtime = imaplibutil.Internaldate2epoch(messagestr)
		self.messagelist[uid] = {'uid': uid, 'flags': flags, 'time': rtime}

times seem to be gotten by parsing messagestr, but my messagestr's
look like (UID 45437 FLAGS ()) and don't contain anything resembling a

(2) In lines 2-4 of the above, utime_from_message is False. This
seems to be an undocumented configuration option (introduced in commit
3bc66c0858ec) whose default option is False. If this is set to True
instead, then lines 3 and 4 actually happen: now rtime is the
internal date (which is not changed by the later call to os.utime),
but the filename still has the download date.

This is bad, because Maildir.py's _iswithinmaxage() still checks the
filename to determine the age of a local message.

>  def _scanfolder(self):
>      <...>
>      for dirannex, filename in files:
>          <...>
>          if maxage and not self._iswithinmaxage(filename, maxage):
>              continue
>          <...>

>Janna, could you confirm that maxage is honored for you and that
>_scanfolder() excludes mails from your Maildir?

So: if I set utime_from_message = True, then the message ends up on the
local messagelist with the correct time, during the run in which it is
downloaded. But if offlineimap is run again later, it uses
_scanfolder() to reconstruct the local messagelist, and the only
maxage-related exclusion is done via _iswithinmaxage(), which only
looks at filenames.

>I wonder if the timestamps are actually written to the filesystem.
>Perhaps it's mounted with noatime?

It is.

-- J.M.

More information about the OfflineIMAP-project mailing list