Compare commits

...

165 Commits

Author SHA1 Message Date
Nikolaus Schulz e1a6028332 test suite: bail out on python versions << 2.4
The test suite uses function that were introduced in Python 2.4 (e.g.
set(), sorted()).
2012-11-04 23:29:08 +01:00
Nikolaus Schulz 4346bc5815 manpage: minor grammar fix "allows to" -> "allows you to"
This error was found by lintian.
2011-07-10 00:18:05 +02:00
Nikolaus Schulz e3f0440305 MANIFEST: distribute db2man.xsl 2011-07-09 20:32:29 +02:00
Nikolaus Schulz 22d4393cb6 Bump year in copyright notes 2011-07-09 19:58:36 +02:00
Nikolaus Schulz 09e460555e Prepare release of archivemail v0.9.0 2011-07-09 19:17:21 +02:00
Nikolaus Schulz 87084b69f0 NEWS: note support for international IMAP mailbox names 2011-07-09 19:15:57 +02:00
Nikolaus Schulz e3f5289e13 Changelog: shorten message about fix for test suite failures with Python 2.7
That really were too much details nobody cares for.
2011-07-09 19:11:43 +02:00
Nikolaus Schulz 483a58879f test suite: adapt to new behaviour of parse_imap_url()
This also removes some pretty bogus test URLs.
2011-07-09 19:03:16 +02:00
Nikolaus Schulz 1fa57aa577 Manpage: update last-modified date 2011-07-09 18:42:36 +02:00
Nikolaus Schulz 6cb9ba9122 FAQ: update note about missing bzip2 support 2011-07-09 18:41:20 +02:00
Nikolaus Schulz 14e0929ba2 Changelog: record improved handling of empty IMAP SEARCH response 2011-07-09 18:17:13 +02:00
Nikolaus Schulz 14e5cd6eb1 test suite: add simple test for parsing IMAP urls specifying port numbers 2011-07-09 18:03:40 +02:00
Nikolaus Schulz eb07611fae IMAP: support servers listening on non-standard ports 2011-07-09 18:03:12 +02:00
Nikolaus Schulz f9f9eacd88 IMAP: handle broken servers sending no untagged SEARCH response
The proprietary "SmartMail" IMAP server likes to send no untagged SEARCH
response when the set of matching email messages is empty.

This was brought up as sf.net support request #3213272.
2011-07-09 16:53:19 +02:00
Nikolaus Schulz 947be25f82 Fix whitespace and formatting of the manpage XML source 2011-07-05 23:45:34 +02:00
Nikolaus Schulz 88653766db Manpage & changelog: document support for international IMAP mailbox names 2011-07-05 23:45:34 +02:00
Nikolaus Schulz 6b0fefc45f IMAP: add support for non-ascii mailbox names 2011-07-05 23:45:28 +02:00
Nikolaus Schulz f6046b9d69 test suite: let FixedGzipFile.seek() pass on what gzip.GzipFile.seek() returned
This fixes test suite failures with Python 2.7.

Starting with Python 2.7, gzip.GzipFile is subclassing io.IOBase.
The seek() method of io.IOBase differs from file.seek() and the old
gzip.GzipFile.seek() in that it returns the new file position, not None.

And in Python 2.7, gzip.GzipFile.tell() is inherited from
io.IOBase.tell(), which is implemented using its seek() method.
FixedGzipFile subclasses gzip.GzipFile and overrides seek(); therefore,
this method need be adapted for this change in the interface.

Closes: #3314293.
2011-06-18 00:13:41 +02:00
Nikolaus Schulz 39e6a532d0 Makefile: remove obsolete rules
* docbook2{man,html} used to generate temporary files; the new XML tool
  xsltproc does not, so we can drop the corresponding cleanup rule.
* The `bdist_rpm' rule for building rpm packages was broken for a long
  time, and therefore commented out.  The distutils bug that broke the
  rule is now fixed, but I'm removing the rule nevertheless because it's
  useless.
* The `upload' rule no longer works; drop it.
* Update .PHONY
2011-03-28 23:55:22 +02:00
Nikolaus Schulz 8173caa81d Add .gitignore, ignoring auto-generated files 2011-03-28 23:29:51 +02:00
Nikolaus Schulz 4f8171341d Update changelog 2011-03-28 23:17:50 +02:00
Nikolaus Schulz 0e1aace796 Manpage & webpage CSS: drop font selections
There's no need to tell the visitor which fonts to use; she knows best
what she likes, so let her decide.
2011-03-28 23:07:03 +02:00
Nikolaus Schulz 8190e4807e Manpage: lots of cleanup and fixes in the XML and formatting 2011-03-28 23:06:07 +02:00
Nikolaus Schulz 0437ec3e8b Remove manpage, there is no need to keep an auto-generated file around 2011-03-28 22:58:59 +02:00
Nikolaus Schulz c2106bdda1 manpage: define proper "manual" and "source" strings 2011-01-07 08:58:40 +01:00
Nikolaus Schulz f6be896b1f Port man page from SGML to XML 2010-12-29 02:49:08 +01:00
Nikolaus Schulz ea0d95e121 IMAP: don't collect statistics data when run with --quiet option
This gives a significant operation speedup in quiet mode.
2010-12-26 15:18:36 +01:00
Nikolaus Schulz 7ee2555cc2 Fix typo in the manpage 2010-12-26 14:49:18 +01:00
Nikolaus Schulz 393f08bb2e setup.py: install manpage into share/man/man1 instead of man/man1
This change aims to comply with the FHS, which puts manpages into
/usr/share/man, not /usr/man.
2010-11-28 02:02:51 +01:00
Nikolaus Schulz ad4c4b9642 Default options.debug_imap to 0 again, not False
This was overdone when switching from integers to booleans.
Here 0 and False are in fact probably equivalent, but it's still a bug.
2010-11-12 21:38:32 +01:00
Nikolaus Schulz a08cde18fb Update changelog and prepare 0.8.2 release 2010-10-16 18:58:04 +02:00
Nikolaus Schulz 77a2856e48 IMAP: don't prepend NAMESPACE prefix to INBOX and its children 2010-10-16 18:57:43 +02:00
Nikolaus Schulz 45f82b7218 Update changelog and prepare 0.8.1 release 2010-09-30 22:12:30 +02:00
Nikolaus Schulz eb8bc7a4ec IMAP: correctly handle IMAP `literal' and unquoted `astring' in LIST reply
The LIST reply handling in imap_find_mailboxes() was buggy in several
ways.  It expected a non-NIL hierarchy delimiter, and it assumed that the
mailbox name in a LIST reply is always quoted; but it can be an astring, a
quoted string, or a literal (see RFC 3501 for the definitions of these
tokens).  These variants should now all be interpreted correctly.

In addition, quoted mailbox names are now handled more strictly to the
letter of the RFC; this only affects mailbox names containing a " or a
backslash, though.
2010-09-26 21:28:54 +02:00
Nikolaus Schulz b7091e90ea Releasing 0.8.0: fix release date in the changelog, and update the project web page 2010-08-09 13:25:41 +02:00
Nikolaus Schulz 945c4bb28e MANIFEST.in: distribute NEWS 2010-08-09 13:16:14 +02:00
Nikolaus Schulz 40a5e6a9f9 Add new file NEWS, gathering noteworthy changes from the changelog 2010-08-09 13:14:23 +02:00
Nikolaus Schulz 5d5408dcd2 Remove release notes
This file is not really suitable to put into a revision control system.
2010-08-09 13:12:13 +02:00
Nikolaus Schulz 5fb60dd522 Regenerate manpage from sgml source 2010-08-09 11:43:30 +02:00
Nikolaus Schulz 8d01846e3f Manpage, TODO, CHANGELOG: document and record wildcard expansion in IMAP mailbox names 2010-08-09 11:43:10 +02:00
Nikolaus Schulz f08403c99b Expand wildcards in IMAP mailbox names
The only non-obvious code change required for this is due to the fact that
computing the archive names has to move into the format-specific archiving
functions, because they can no longer be derived from the mailbox name
beforehand.
2010-08-09 11:32:01 +02:00
Nikolaus Schulz 910b507a2d TODO: drop more obsolete items
In particular:
* we no longer use shutil.copy{,2} to write back a changed mbox
* having temporary mbox files in the same directory as the originals doesn't
  make sense anymore since we no longer commit them with rename(2)
* the --archive-name option is now implemented
2010-08-08 18:53:11 +02:00
Nikolaus Schulz ca80e185e6 Regenerate manpage from sgml source 2010-07-31 22:08:22 +02:00
Nikolaus Schulz 3a6e4072b0 Manpage: various updates
Document the --archive-name option, and explain the basic idea of deriving the
archive filename from the mailbox earlier and more prominently.  Also document
how archivemail tries not to create hidden archive files, and remove some
obsolete notes.
2010-07-31 22:05:11 +02:00
Nikolaus Schulz 3a9a5cd4b8 New option --archive-name, alias -a, to hard-code the archive filename 2010-07-31 20:49:30 +02:00
Nikolaus Schulz 04bf8eaa23 test suite: fix buggy test of --suffix and --prefix option parsing 2010-07-31 20:49:30 +02:00
Nikolaus Schulz 0921a1c91a test suite: replace some plain assertions with TestCase.assertEqual() 2010-07-31 20:49:30 +02:00
Nikolaus Schulz 40ba265fde Rename variables in make_archive_name()
Archive name prefixes may contain path components, thus renaming some
variables accordingly.
2010-07-31 20:49:29 +02:00
Nikolaus Schulz f1f34ca46e Don't create hidden archives when archiving mailboxes with leading dots in the name
When archiving a mailbox with leading dots in the name and no archive name
prefix specified, strip the dots off the archive name.  This is targeting
Maildir++ subfolders.
2010-07-31 20:49:29 +02:00
Nikolaus Schulz 67f23e1af4 Only use the default archive name suffix when the user specified no affix
Also add more archive name affix testing to the test suite.
2010-07-31 20:49:29 +02:00
Nikolaus Schulz b6bc92c34f New option --archive-prefix, alias -p
Technically, this works just like the --suffix option.  This commit also
updates the manpage accordingly.

Currently, the prefix is not checked for slashes, so it could contain path
components.  (The same applies for the suffix, btw).  Since the expanded
string is prepended to the archive base name, this can be used to dynamically
configure the archive directory, depending on the archive cutoff date.  I'm
not sure if this can be considered a reasonable feature, though.
2010-07-31 20:49:03 +02:00
Nikolaus Schulz f22fe4decd Detect and never archive IMAP server pseudo mbox messages
IMAP servers (Dovecot and UW-IMAP at least) may store mailbox meta data for
mboxes in a pseudo message.  Such messages are now detected and never archived.

This commit includes a test case in the test suite.
2010-07-30 19:15:21 +02:00
Nikolaus Schulz d99b4b4414 Give the changelog some more love
Add references to bug numbers and be more verbose.
2010-07-30 15:42:26 +02:00
Nikolaus Schulz e9446e2fc4 test suite: test unlocking an mbox after dotlocking failed with EACCES 2010-07-30 13:30:20 +02:00
Nikolaus Schulz eadedf27d0 Fix crash when unlocking an mbox after dotlocking failed with EACCES
If we don't have sufficient permissions to create a dotlock for an mbox file,
record that, and don't try to remove the dotlock when unlocking the mbox
later.
2010-07-30 13:24:36 +02:00
Nikolaus Schulz 71485f2469 index.html: reword pointer to the Suse Build Service to be more generic
Better don't write "soon there will be... <foo>" and don't be specific about
available versions.  Writing it more generically means lesser maintenance. :)
2010-07-30 12:29:18 +02:00
Nikolaus Schulz db8eb62c16 Regenerate manpage from the sgml source 2010-07-30 12:29:14 +02:00
Nikolaus Schulz 6813e21d54 Updated the manpage date 2010-07-30 12:25:56 +02:00
Nikolaus Schulz 1c412524f2 Document in the manpage that archivemail locks the archive mbox 2010-07-30 12:25:55 +02:00
Nikolaus Schulz 03932a8cb2 Remove the notes about setuid support from the manpage
This feature has been removed.
2010-07-29 22:55:00 +02:00
Nikolaus Schulz 280113982f Replace distutils MANIFEST with MANIFEST.in template
Recent distutils versions always generate a new MANIFEST, overwriting our
custom one.  See Python bug #8688.
2010-07-29 22:12:52 +02:00
Nikolaus Schulz a102b5baf9 Rename archivemail.py to archivemail
On Unix, most scripts don't come with a file extension, it's not needed, and
we distribute the script as "archivemail" anyway.  And most importantly, I
like it better without the extension. :)

With a little trick we can still load the script as a module from the test
suite.
2010-07-29 21:35:58 +02:00
Nikolaus Schulz b47cc46fbf README: drop warning that the test suite is slow
With the recent optimizations of the test suite, it has become quite fast.
2010-07-29 21:32:37 +02:00
Nikolaus Schulz febd030e14 Drop .py extension from the unittest script 2010-07-29 21:02:12 +02:00
Nikolaus Schulz a04226580b Bump version to 0.8.0 2010-07-29 21:02:07 +02:00
Nikolaus Schulz 89cff1807c Updated changelog, which was very outdated 2010-07-29 20:39:50 +02:00
Nikolaus Schulz 0eddfe7357 Updated copyright year 2010-07-29 20:39:46 +02:00
Nikolaus Schulz af3bb16a4c Updated TODO, dropping a lot of obsolete items
Notable items that are now resolved or implemented:
    * archives are now locked
    * the mbox classes have been refactored to a cleaner design
    * we moved from flock locking to fcntl
    * the setuid() feature is long gone
    * symlink attacks for tempfiles are not possible (that is really an
      ancient TODO item from the original author)
    * the test suite now has a lot of maildir test cases
2010-07-29 19:49:42 +02:00
Nikolaus Schulz 368f312e2d test suite: add more maildir test cases
Maildir testing should now be roughly on par with mbox testing.
2010-07-29 19:29:53 +02:00
Nikolaus Schulz 2ce89ef508 test suite: remove unused remove() methods from maildir classes
For cleanup of temporary files, we lean on shutil.rmtree anyway, so don't
bother wasting more code on this.
2010-07-29 15:46:15 +02:00
Nikolaus Schulz 7058290c2e test suite: remove incomplete MH testing code
I just discovered that archivemails MH support is broken with respect to
message flags, and in my opinion it doesn't make much sense to test
known-broken functionality.

In fact there may well be zero archivemail users with MH mailboxes; MH is
basically an obsolete format, and any archivemail user with MH mailboxes would
probably have complained about lost message flags.
2010-07-29 15:46:15 +02:00
Nikolaus Schulz 0dfae37e04 test suite: first shot at implementing maildir test cases 2010-07-29 15:46:10 +02:00
Nikolaus Schulz 78c4c6e3da test suite: remove obsolete $Id$ subversion keyword 2010-07-29 14:41:05 +02:00
Nikolaus Schulz d845ab862e test suite: cleanup of the mbox testing code
This code is complex, too complex actually.  Rename some methods and
variables, rework some code and and add some explaining comments in order to
make it it least a bit easier to understand.
2010-07-29 14:41:00 +02:00
Nikolaus Schulz 584918b265 test suite: remove obsolete test that we preserve mbox file modes
This test case is obsolete since we no longer replace the mbox file with a new
copy but rewrite it.
2010-07-29 13:32:20 +02:00
Nikolaus Schulz 9ff7774aba Fix TempMbox.saveas() to unregister the right file from _stale 2010-07-28 15:28:39 +02:00
Nikolaus Schulz e5ee9b98c1 Python language fix: replace C-style boolean values "1" and "0" with True/False 2010-07-19 01:40:25 +02:00
Nikolaus Schulz 7269c32734 Remove unused variable 2010-07-19 01:40:25 +02:00
Nikolaus Schulz 80b3483439 Python language fix: remove parentheses around asserted expressions
assert is not a function.
2010-07-19 01:40:25 +02:00
Nikolaus Schulz 2d15728c2d Add a note about the race window when resetting an mbox file timestamp 2010-07-19 01:40:25 +02:00
Nikolaus Schulz dcf849afeb TODO: new items: make IMAP test suite with no network I/O; drop .py extension 2010-07-19 01:40:25 +02:00
Nikolaus Schulz 573f2b9358 Warn if the temporary directory is not empty on cleanup 2010-07-19 01:40:25 +02:00
Nikolaus Schulz 4fb833176e When creating a dotlock, register it slightly earlier for cleanup
This closes a very unlikely window where we could create a dotlock file, but
then encounter an error and fail to clean up the dotlock.
2010-07-19 01:40:25 +02:00
Nikolaus Schulz 2b7baaf294 In verbose mode, say that we're about to dotlock an mbox before trying to do so 2010-07-19 01:40:25 +02:00
Nikolaus Schulz 0f2b04ff89 Minor docstring/whitespace fixes 2010-07-19 01:40:25 +02:00
Nikolaus Schulz b9b2174c45 At critical points, flush mbox files and sync them to disk
This should minimize the risk of data loss.  Flushing a locked mbox file
before unlocking it also ensures that there's no window when another
process could lock the mbox after us, but still see the old content.
2010-07-19 01:40:24 +02:00
Nikolaus Schulz 86471d12a4 Further refactoring of the mbox classes, adding archive locking support
The mbox locking methods move into a new class LockableMboxMixin, and the
Mbox and ArchiveMbox classes become subclasses of LockableMboxMixin.
class StaleFiles is updated to handle multiple dotlock files.
2010-07-19 01:40:24 +02:00
Nikolaus Schulz da595427ff Fail as gracefully as possible if writing out the new mailboxes fails
In particular:

* If writing the archived messages to the final archive fails, try to
  restore the archive and abort (by not handling the exception).  This is
  possible since we first save the archive, and only then the modified
  mailbox, so we don't corrupt the original mbox in this case.
* If writing a modified mbox file fails, save the temporary copy.
2010-07-19 01:40:24 +02:00
Nikolaus Schulz 1db28f2b04 Refactoring of the mbox classes
The RetainMbox and ArchiveMbox classes are now gone, mainly because their
finalise() methods were messing with the archived mbox and the archive,
respectively, which was not good OO design.

The core functionality of the finalise() methods of both removed classes
is moved to the objects that are manipulated: the Mbox class representing
the mbox that is being archived gains a new method overwrite_with(), and
there is a new class ArchiveMbox that represents the actual archive, which
has an append() method (yes, unfortunately the new class has the same name
like the removed class).

The RetainMbox instance is replaced with a TempMbox, and the ArchiveMbox
instance either with a TempMbox, or a CompressedTempMbox if archive
compression is enabled.

Finally, a compressed TempMbox is now a implemented as a subclass of
TempMbox, named CompressedMbox.

Cooperation with the StaleFiles class moves into the TempMbox class.
This means slightly less detailed verbose cleanup reporting, oh well.
2010-07-19 01:40:24 +02:00
Nikolaus Schulz 40f9a4c049 Use safe methods to open the archive mbox and an existing mbox file 2010-07-19 01:17:02 +02:00
Nikolaus Schulz f031573071 mbox locking: omit dotlock if we don't have the permissions to create it
Closes: issue #855269.
2010-07-19 01:13:25 +02:00
Nikolaus Schulz 11103e2de2 mbox locking: combine locking functions into one and swap lock order
We used to create a dotlock file first and then lock with fcntl; swap that
order, since locking first with fcntl seems to be more common.

This patch also adds general mbox lock/unlock methods, which call the
dotlock and fcntl-lock methods, and moves the retry logic there.

When the dotlock and fcntl methods fail to acquire a lock, they now raise
a custom exception "LockUnavailable", which gets caught in the general
lock() method.  That way, if we succeed to acquire one lock but fail to
acquire the other, we can release our locks at the upper level and retry.
2010-07-19 01:13:25 +02:00
Nikolaus Schulz d706409c59 Switch mbox locking from flock(2) to posix lockf(2)
flock() locks aren't portable; lockf() locks are.
2010-07-19 01:13:25 +02:00
Nikolaus Schulz d726589414 Rename procmail_lock->dotlock_lock
An entirely cosmetic variable rename, but it's just not correct to call
this a "procmail lock".  Also reword some comments accordingly.
2010-07-19 01:13:25 +02:00
Nikolaus Schulz c6e462fef0 test suite: use common base class with helper methods for mbox testing
These helper methods provide success verification after test archiving runs, and
test case setup.  This is a tradeoff: because these methods need to support all
scenarios in one place, they introduce some new complexity - but they replace a
lot of tedious, very similar, but still not entirely identical code all over the
place.
2010-07-19 01:13:25 +02:00
Nikolaus Schulz 84f42ead36 test suite: cut down the test of the --all option
Don't do entire test archiving runs, just call
archivemail.should_archive().
2010-07-19 01:13:25 +02:00
Nikolaus Schulz 512130df02 test suite: cut down the test of the --preserve-unread option
Don't do entire test archiving runs, just call
archivemail.should_archive().
2010-07-19 01:13:25 +02:00
Nikolaus Schulz 03bfb88d30 test suite: change misleading test case name
TestArchiveMboxPreserveStatus actually doesn't test that the message
status is preserved, but that the --preserve-unread option works.
Rename it to TestArchiveMboxPreserveUnread.
2010-07-19 01:13:25 +02:00
Nikolaus Schulz 41da26b655 test suite: cut down the test of the --size option
Don't do entire test archiving runs, just call
archivemail.should_archive().
2010-07-19 01:13:25 +02:00
Nikolaus Schulz 6d2e23ac80 test suite: cut down the test of --output-dir
Don't do entire test archiving runs, just call
archivemail.make_archive_name() and verify the result.
2010-07-19 01:13:25 +02:00
Nikolaus Schulz 8ec8a00ffa test suite: cut down testing the handling of flagged messages
Don't do entire test archiving runs, just call
archivemail.should_archive().
2010-07-19 01:13:25 +02:00
Nikolaus Schulz 0ca3f6ceee test suite: remove duplicate test case for --date option 2010-07-19 01:13:25 +02:00
Nikolaus Schulz bf99c6b69d test suite: cut down archive suffix generation testing
Don't do entire test archiving runs, just call
archivemail.make_archive_name() and verify the result.
2010-07-19 01:13:24 +02:00
Nikolaus Schulz 232b2256c2 test suite: test weird message headers in one run
Before, every test header was tested in a separate archiving run.
2010-07-19 01:13:24 +02:00
Nikolaus Schulz 573cbbce91 test suite: cut down the test of date header processing
Don't do entire test archiving runs, just call
archivemail.should_archive().
2010-07-19 01:13:24 +02:00
Nikolaus Schulz e9d2284a07 test suite: let make_message() optionally return a rfc822.Message 2010-07-19 01:13:24 +02:00
Nikolaus Schulz 8476dcd18f Remove lots of redundant test runs from the test suite
The test suite used to run a lot of triple tests, by first calling
archivemail.archive() directly, and then running the entire archivemail
script twice, once with long and once with short options.  But we already
test option processing seperately, and beyond that, archivemail.main()
essentially just calls archive() for each mailbox in turn.  So we just drop
all runs of the entire archivemail script from the test suite, giving it a
huge speed boost (on my old iBook, running the test suite drops from 73 to
5 seconds).
2010-07-19 01:13:24 +02:00
Nikolaus Schulz 8f58deef5c Test suite: test command line option processing 2010-07-19 01:13:24 +02:00
Nikolaus Schulz f80e709f7e test suite: eliminate remaining call of external gzip program
Use gzip.GzipFile instead.
2010-07-19 01:13:24 +02:00
Nikolaus Schulz 8c6f4b99c1 test suite: define and use assertEqualContent() to compare files
This eliminates a lot of copy-and-paste code, and switches from
os.system("gzip <...>") to gzip.GzipFile.
2010-07-19 01:13:24 +02:00
Nikolaus Schulz 9d9f13a440 test suite: account for lacking precision of os.utime()
os.utime() uses the utimes(2) system call to set file timestamps.  utimes(2)
has a microsecond resolution, but stat(2) may return timestamps with
nanosecond resolution.  So, the check that we have properly reset the mbox
file timestamp must allow a minor deviation.
2010-07-19 01:13:24 +02:00
Nikolaus Schulz 54821151e4 Fix minor race when deleting messages in a maildir/mh box
Nothing serious, but if another client deleted it in the small window after
we checked it, we would have crashed trying to delete a non-existing file.
2010-07-19 01:13:24 +02:00
Nikolaus Schulz a7414319c9 Simplify the final committing of the mailbox and archive
* Make the finalise() methods spot if they have anything to do
* We used to create the temporary mbox files on demand in the message
  processing loop, if we needed to write to them.  Now we create them
  beforehand, but only if they might be needed (e.g. we don't create an
  archive if options.delete_old_mail is set).
* The above combined makes the final committing of the changes simpler (a
  *lot* simpler for mboxes), and we can dump the Mbox.leave_empty() method.
2010-07-19 01:13:24 +02:00
Nikolaus Schulz b37b3d627e Split out new class TempMbox
This separates write-only mbox access to the temporary mboxes from the read-only
access to the original mbox.
2010-07-19 01:01:04 +02:00
Nikolaus Schulz d6a161cd9e Simplify ArchiveMbox.__init__ 2009-11-06 21:09:40 +01:00
Nikolaus Schulz df680c19be Append to the archive, and don't use rename()
This is WIP to prepare locking for the archive.  Since we no longer copy the
whole archive before appending, archiving should also be faster.
2009-11-06 21:09:40 +01:00
Nikolaus Schulz 37f96c1c84 Remove unused method Mbox.is_empty() 2009-11-06 21:09:40 +01:00
Nikolaus Schulz a78af4c0ff Keep mbox files open, so we don't break our locks
When committing a changed mbox, don't use os.rename(), and don't open/close
the mbox file to truncate it to zero length.  Locking was pretty much broken
before -- at least in theory a quite severe bug.
2009-11-06 21:09:39 +01:00
Nikolaus Schulz ba8928d279 Cleanup restoring of the mbox timestamps
* Remove code duplication: restore the mbox timestamps once and for all when
  we're done
* Don't bother restoring the file mode when finishing, since this is handled in
  RetainMbox.finalise() (and need be)
* Therefore, rename Mbox.reset_stat() to reset_timestamps()
2009-11-06 21:09:39 +01:00
Nikolaus Schulz 223e2f9802 Cosmetics: in verbose mode, report current mailbox early
This is now before we do the sanity checking, so in verbose mode, we don't error
out before having said that we now turn attention to the current mailbox.
2009-11-06 21:09:39 +01:00
Nikolaus Schulz aee4df2fcf Refuse to process mailboxes owned by someone else
This should also protect people relying on the old setuid feature.
If the mailbox is local, by checking the ownership we necessarily check for
existance.
2009-11-06 21:09:39 +01:00
Nikolaus Schulz 2e0f3cd3aa Sanity check existing archives early
This used to happen when creating the temporary archive, we now do it before we
start processing the mailbox.
2009-11-06 21:09:39 +01:00
Nikolaus Schulz 79bcf86860 Remove simple-minded security checks
Remove the checks if the mailbox is a symlink, and if the output directory is
world-writable.  Better no security than half-baked security.
2009-11-06 21:09:39 +01:00
Nikolaus Schulz a3276f8c68 Move archive naming code into new function make_archive_name() 2009-11-06 21:09:38 +01:00
Nikolaus Schulz cd07a2663e Remove the setuid functionality
It was not a good idea, and trying to do it right would be too much effort.
2009-11-06 21:09:38 +01:00
Nikolaus Schulz bd85cffe37 Simplify imap_get_namespace() and imap_guess_mailboxnames()
I don't think anybody wants to archive folders in shared or public IMAP
namespaces, so we don't bother checking all possible namespaces.  The code was
ugly anyway.
2009-11-06 21:09:38 +01:00
Nikolaus Schulz 9574c4f41c Removed obsolete references to subversion
archivemail development has moved to git.  This patch updates the project
webpage, removes the subversion $Id$ keyword that was stored in
archivemail.__svn_id__, and updates the Makefile.
2009-11-06 17:20:16 +01:00
Nikolaus Schulz c6cb0b4612 IMAP: imap_guess_mailboxnames: check for NIL delimiter.
Only replace the slash with the server's hierarchy delimiter if the latter
actually exists (is not NIL).
2008-04-09 00:22:07 +00:00
Nikolaus Schulz 415e055a6e TODO: dropped items about --all, which is now implemented. 2008-04-08 23:15:45 +00:00
Nikolaus Schulz 622c0105ea IMAP: only check for \Deleted in PERMANENTFLAGS if mailbox isn't read-only.
This spewed an error when --dry-running.
2008-04-08 23:06:10 +00:00
Nikolaus Schulz 775952ec98 IMAP: added sanity check for \Deleted in PERMANENTFLAGS. 2008-04-08 19:31:11 +00:00
Nikolaus Schulz 681fd0c527 Minor, local variable renaming. 2008-04-08 19:10:41 +00:00
Nikolaus Schulz e5b6397dd5 Moved IMAP SELECT code into a separate function. 2008-04-08 19:06:42 +00:00
Nikolaus Schulz 78b4923832 IMAP: be NAMESPACE-aware; improved probing for guessed mailbox names.
* Automatically add NAMESPACE prefix to the mailbox path if necessary, 
  * Explicitely check for guessed mailbox names with LIST instead of just trying
    to SELECT them. 
  * Updated documentation about NAMESPACE handling.
2008-04-08 15:38:51 +00:00
Nikolaus Schulz 37816fd659 archivemail.sgml: warn that multiple passes with --copy will create duplicates. 2008-04-08 14:11:45 +00:00
Nikolaus Schulz bfff00e395 Code structuring: made a separate group of IMAP functions.
No code changes, just moved functions around.
2008-04-07 20:16:29 +00:00
Nikolaus Schulz 07219ff14b IMAP: servers should never advertise LOGINDISABLED with SSL; removed the check
for it, which was just used to spit a special error message anyway.
2008-03-21 01:05:15 +00:00
Nikolaus Schulz 26ab4611ec Archiving an IMAP folder with --all didn't archive *any* messages.
The message sequence numbers must be strings, but were generated as integers;
fixed.
2008-03-19 18:30:43 +00:00
Nikolaus Schulz efe02ea32a Updated year in another copyright note, which I overlooked before. 2008-03-16 17:57:18 +00:00
Nikolaus Schulz bc5c3d5e45 Updated changelog, which was a little behind. 2008-03-15 20:51:40 +00:00
Nikolaus Schulz a9215463c4 Removed an assertion which choked upon --days=0. 2008-03-15 20:34:52 +00:00
Nikolaus Schulz f43cbb106d Added new option --all to archive all messages in a mailbox.
Updated documentation, and added a first simple unittest for this.
Closes: #1764846.
2008-03-15 20:24:46 +00:00
Nikolaus Schulz 2719645f2c Updated copyright notes to include year 2008. 2008-03-15 19:39:28 +00:00
Nikolaus Schulz 9ac3a68228 Documented the new option --debug-imap in the manpage. 2008-03-15 19:35:22 +00:00
Nikolaus Schulz c0f0ad33d7 Fixed crash when archiving an empty maildir with python 2.5.
The incompatible changes in mailbox.Maildir triggered an assertion in
_archive_dir(); removing that assertion since it looks not useful anyway.
2008-03-15 18:42:56 +00:00
Nikolaus Schulz 22e23d9d38 Sanitized parsing some IMAP server responses by switching to regular
expressions.
2008-03-15 15:59:05 +00:00
Nikolaus Schulz f6f7903f58 test_archivemail.py: removed nested calls to setUp() and tearDown(). 2008-03-06 20:09:44 +00:00
Nikolaus Schulz afa61f8597 TODO: added items:
* perhaps integrate --debug-imap into -vv switch
* graceful IMAP connection termination upon error
2008-02-14 22:31:11 +00:00
Nikolaus Schulz 704d5a961e Added --debug-imap option which just sets imaplib.Debug. 2008-02-14 22:26:10 +00:00
Nikolaus Schulz 6abf732d2e IMAP: catch LOGINDISABLED, and suggest using imaps. 2008-02-14 22:24:16 +00:00
Nikolaus Schulz 533628c2fc Only try CRAM-MD5 authentication if the server advertises it. 2008-02-14 22:19:34 +00:00
Nikolaus Schulz 1fcd5b7292 TODO: added issues:
- no locking with archives
- no validation of existing archives
- discomfort with current mbox class design and usage
2008-01-19 00:12:35 +00:00
Nikolaus Schulz 77481169d8 _archive_imap() used SSL only if the 'imaps://' url scheme was all lowercase.
Fixed.
2008-01-19 00:04:01 +00:00
Nikolaus Schulz ce02aba226 Updated TODO list. Added:
* rework locking
 * IMAP SEARCH BEFORE matching dates only, no time
 * document mbox format issues
2007-11-15 04:15:25 +00:00
Nikolaus Schulz 8e5c870057 guess_delivery_time():
* look for the timestamp of the latest 'Received' header before resorting to
   'Date' or 'Resent-Date'.  
 * let 'Resent-date' header take precedence over 'Date'. 
Document these changes in manpage and changelog. 
Closes: #1481316, #1764855, Debian bug #272666.
2007-11-13 21:13:38 +00:00
Nikolaus Schulz 4584dffe14 Fixed date header parsing to be precise with timezone information. Also, when
writing From_ line timestamps, don't use UTC but local time, without timezone
information.
2007-11-13 02:59:31 +00:00
Nikolaus Schulz 5178c956bc !%&$*# Repair previous broken commit where an unrelated hunk slipped through.
Reverted that hunk.
2007-11-13 00:36:51 +00:00
Nikolaus Schulz d9ffaf4a3b When converting from other formats to mbox, re-use existing 'Status' and
'X-Status' headers if appropriate (instead of deleting and re-generating them).
2007-11-13 00:32:49 +00:00
Nikolaus Schulz ead112daba If running as root, only call seteuid/setegid if the if the owner of the mailbox
is not root.
2007-11-09 17:04:52 +00:00
Nikolaus Schulz 0ae7edab86 Bumped version to 0.7.2, and updated release info on the webpage. 2007-11-09 14:54:54 +00:00
Nikolaus Schulz 8cc36126ec RELNOTES: slightly re-edited to be more consistent. 2007-11-09 14:52:38 +00:00
Nikolaus Schulz f1784f3093 RELNOTES, CHANGELOG: updated for v0.7.2, which fixes a crash with IMAP and
python << 2.5.
2007-11-09 14:46:17 +00:00
Nikolaus Schulz e0c75a1001 IMAP: fixed crash by working around python bug #1277098, which is still pending
in python << 2.5.
2007-11-09 14:33:13 +00:00
Nikolaus Schulz 5db3d2fe63 Makefile: made the htdocs rule a little bit more intelligent. 2007-11-08 18:23:15 +00:00
Nikolaus Schulz c19a9873b0 Makefile: declare phony targets. 2007-11-08 18:09:45 +00:00
23 changed files with 3853 additions and 3497 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
/archivemail.1
/archivemail.html
/MANIFEST

100
CHANGELOG
View File

@ -1,3 +1,103 @@
version 0.9.0 - 9 July 2011
* Fixed manpage installation path to be FHS compliant
* Speed up IMAP archiving with the --quiet option
* Ported the manpage from SGML to XML
* Fix test suite failures with Python 2.7. Closes: #3314293.
* IMAP: support international mailbox names containing non-ASCII characters.
* IMAP: handle broken servers sending no untagged SEARCH response.
Closes: #879716, #3213272.
* IMAP: support servers listening on non-standard ports. Closes: #3168416.
version 0.8.2 - 16 October 2010
* IMAP: don't prepend NAMESPACE prefix to INBOX and its children.
Closes: #3083236.
version 0.8.1 - 30 September 2010
* IMAP: fixed handling of LIST replies by the server where the mailbox name
is not a quoted string. (Thanks Karsten Müller)
Version 0.8.0 - 9 August 2010
* Fixed date header parsing to be precise with timezone information. Also,
when writing From_ line timestamps, don't use UTC but local time, without
timezone information.
* To determine the delivery date of a message, archivemail now looks for the
timestamp of the latest 'Received' header before resorting to
'Resent-Date' or 'Date'. This should give much better results when there
is no 'Delivery-date' header, which is still checked first.
(Thanks Andrew Ferrier & Christian Brabandt)
Closes: #1481316, #1764855, Debian bug #272666.
* If present, the 'Resent-date' header now takes precedence over 'Date'.
* IMAP: recognize when a server advertises LOGINDISABLED.
* New option --debug-imap; this just sets imaplib.Debug, thereby dumping
archivemail's chat with the server to stdout.
* Fixed crash with Python 2.5 when archiving an empty maildir.
(Thanks "Aidant") Closes: #1878940.
* New option --all to archive all messages in a mailbox. Closes: #1764846.
* Fixed a crash when archiving maildirs with --days=0. (Thanks John Goerzen)
* IMAP: automatically add NAMESPACE prefix to a mailbox path if necessary.
* Removed the feature to setuid to the mailbox owners when run as root.
This was a bad idea; it's really hard to do safely, if at all possible.
Obsoletes: patch #2783134.
* Replaced some simple minded file operation security checks with more
decent ones. This means we can safely operate in /tmp, for example. The
price is that we no longer accept symlinked files. Obsoletes: patch
#1874868.
* Don't use rename() to update mbox files and the archive, but write the
files directly. This is more fragile, but required for correct mbox
locking, and also for mboxes in mail spool directories where we don't have
permission to create files. It also means that if selinux is enabled,
archivemail now preserves the selinux security context of an mbox.
Closes: #2210732.
* Fixed the test suite to deal with nanosecond file timestamps. These are
provided by ext4 and XFS, for example. Closes: #2043900.
* Cleaned up the test suite, replacing a lot of duplicated code and avoiding
a lot of redundand testing. This speeds up the test suite by a factor of
15 or so.
* mbox locking got completely rewritten. Switched from flock to lockf
locking, which is NFS-safe and portable, and we now lock with lockf first,
then with a dotlock, instead of the other way around. (This is makes
archivemail compatible with Debian systems. ;)
* We now omit the dotlock if we don't have sufficient permissions to create
it in the mbox directory. (The file is still locked with lockf.)
Since we also no longer use rename() to commit changes to an mbox, (see
above) this means archivemail can now operate on mbox files in the system
mail spool. Closes: #855269.
* Refactoring of the mbox classes; much of the code got rewritten.
* The archive now also gets locked while archivemail updates it.
* Various Python language fixes (for example don't use "0" and "1" as
boolean constants).
* Added a lot of test cases for maildir archiving to the test suite.
Maildir testing should now be roughly on par with mbox testing.
* IMAP servers (Dovecot and UW-IMAP at least) may store mailbox meta data
for mboxes in a pseudo message. Such messages are now detected and never
archived. Obsoletes: patch #2210707. (Thanks, "tlhackque")
* New option --prefix, or short -p, to specify an archive name prefix. Like
a suffix specified with the --suffix option, the prefix is expanded with
strftime(). Specifying this option disables the default archive name
suffix. Obsoletes: feature request #604281. (Thanks Serafeim Zanikolas
for an initial patch)
* When archiving a mailbox with a leading dot in the name and with no archive
name prefix specified, archivemail no longer creates hidden archives, but
strips the dot off the archive name. In particular, this makes working
with Maildir++ subfolders more convenient. Closes: feature request
#604281.
* New option --archive-name, or short -a, to hard-code an archive filename.
Like the --suffix and --prefix options, it is expanded with strftime().
This option conflicts with archiving multiple mailboxes. Closes: feature
request #1306538.
* archivemail now expands wildcards in IMAP mailbox names. For example, the
url imaps://user@server/foo/* will expand to all subfolders of foo.
Closes: feature request #1978540. Obsoletes: patch #1918937.
Version 0.7.2 - 9 November 2007
* IMAP: fixed crash by working around python bug #1277098, which is still pending
in python << 2.5.
Version 0.7.1 - 7 November 2007
* Fixed incompatibility with Python 2.5 which broke Maildir handling.

7
FAQ
View File

@ -2,10 +2,9 @@
1. Why doesn't archivemail support bzip2 compression in addition to gzip?
-------------------------------------------------------------------------
I am quite happy to add bzip2 support to archivemail as soon as a 'bzip2'
module (similar to the gzip module) is available for python.
[ Hint hint ;) ]
The bzip2 module in Python 2.x is not fully compatible with the gzip module,
and cannot be used with the current implementation of compressed mailbox
support in archivemail. See Python feature request #5863 for details.
2. Can you add a switch to archive mailboxes greater than a certain size?
-------------------------------------------------------------------------

View File

@ -1,12 +0,0 @@
CHANGELOG
COPYING
FAQ
MANIFEST
README
TODO
archivemail
archivemail.1
archivemail.sgml
examples/archivemail_all
setup.py
test_archivemail.py

11
MANIFEST.in Normal file
View File

@ -0,0 +1,11 @@
include CHANGELOG
include COPYING
include FAQ
include MANIFEST
include TODO
include NEWS
include archivemail.1
include archivemail.xml
include db2man.xsl
graft examples
include test_archivemail

View File

@ -1,19 +1,16 @@
VERSION=$(shell python setup.py --version)
VERSION_TAG=v$(subst .,_,$(VERSION))
TARFILE=archivemail-$(VERSION).tar.gz
SVNROOT=https://archivemail.svn.sourceforge.net/svnroot/archivemail
HTDOCS=htdocs-$(VERSION)
default:
@echo "no default target"
clean:
rm -f *.pyc manpage.links manpage.refs manpage.log
rm -rf $(HTDOCS)
test:
python test_archivemail.py
python test_archivemail
clobber: clean
rm -rf build dist
@ -21,44 +18,26 @@ clobber: clean
sdist: clobber doc
cp archivemail.py archivemail
python setup.py sdist
rm archivemail
# FIXME: bdist_rpm chokes on the manpage.
# This is python/distutils bug #644744
#bdist_rpm: clobber doc
# cp archivemail.py archivemail
# python setup.py bdist_rpm
# rm archivemail
tag:
# Overwriting tags at least doesn't work with svn << 1.4,
# it silently creates a new subidr. It *may* work with
# svn 1.4, I haven't tested it. See svn bug #2188.
#cvs tag -F current
@if svn list "$(SVNROOT)/tags" | grep -qx "$(VERSION_TAG)/\?"; then \
echo "Tag '$(VERSION_TAG)' already exists, aborting"; \
else \
svn copy . "$(SVNROOT)/tags/$(VERSION_TAG)"; \
fi
upload:
(cd dist && lftp -c 'open upload.sf.net && cd incoming && put $(TARFILE)')
git tag -a $(VERSION_TAG)
doc: archivemail.1 archivemail.html
htdocs: index.html archivemail.html RELNOTES style.css manpage.css
htdocs: $(HTDOCS).tgz
$(HTDOCS).tgz: index.html archivemail.html RELNOTES style.css manpage.css
install -d -m 775 $(HTDOCS)
install -m 664 $^ $(HTDOCS)
cd $(HTDOCS) && mv archivemail.html manpage.html
tar czf $(HTDOCS).tgz $(HTDOCS)
archivemail.1: archivemail.sgml
docbook2man archivemail.sgml
chmod 644 archivemail.1
archivemail.1: archivemail.xml db2man.xsl
xsltproc db2man.xsl archivemail.xml
archivemail.html: archivemail.sgml db2html.dsl
docbook2html --dsl db2html.dsl -u archivemail.sgml
chmod 644 archivemail.html
archivemail.html: archivemail.xml db2html.xsl
xsltproc --output archivemail.html \
db2html.xsl archivemail.xml
tidy -modify -indent -f /dev/null archivemail.html || true
.PHONY: default clean test clobber sdist tag doc htdocs

44
NEWS Normal file
View File

@ -0,0 +1,44 @@
Notable changes in archivemail 0.9.0:
* IMAP: support for international mailbox names containing non-ASCII
characters.
Notable changes in archivemail 0.8.0:
* Removed the feature to setuid to the mailbox owners when run as root.
This was a bad idea; it's really hard to do safely, if at all possible.
Obsoletes: patch #2783134.
* New option --archive-name, or short -a, to hard-code an archive filename.
Like the --suffix and --prefix options, it is expanded with strftime().
This option conflicts with archiving multiple mailboxes. Closes: feature
request #1306538.
* New option --prefix, or short -p, to specify an archive name prefix. Like
a suffix specified with the --suffix option, the prefix is expanded with
strftime(). Specifying this option disables the default archive name
suffix. Obsoletes: feature request #604281. (Thanks Serafeim Zanikolas
for an initial patch)
* New option --all to archive all messages in a mailbox. Closes: #1764846.
* archivemail now expands wildcards in IMAP mailbox names. For example, the
url imaps://user@server/foo/* will expand to all subfolders of foo.
Closes: feature request #1978540. Obsoletes: patch #1918937.
* To determine the delivery date of a message, archivemail now looks for the
timestamp of the latest 'Received' header before resorting to
'Resent-Date' or 'Date'. This should give much better results when there
is no 'Delivery-date' header, which is still checked first.
(Thanks Andrew Ferrier & Christian Brabandt)
Closes: #1481316, #1764855, Debian bug #272666.
* We now omit the dotlock if we don't have sufficient permissions to create
it in the mbox directory. (The file is still locked with lockf.)
Together with more changes under the hood (see below) this means
archivemail can now operate on mbox files in the system mail spool.
Closes: #855269.
* Replaced some simple minded file operation security checks with more
decent ones. This means we can safely operate in /tmp, for example. The
price is that we no longer accept symlinked files. Obsoletes: patch
#1874868.
* The archive now also gets locked while archivemail updates it.
* mbox locking got completely rewritten. Switched from flock to lockf
locking, which is NFS-safe and portable, and we now lock with lockf first,
then with a dotlock, instead of the other way around. (This is makes
archivemail compatible with Debian systems. ;)

4
README
View File

@ -35,9 +35,7 @@ Python is available from http://www.python.org/
INSTALLATION:
If you want to test archivemail:
cp archivemail archivemail.py
python test_archivemail.py
(NOTE: This could take over 90 seconds on slower systems)
python test_archivemail
To install archivemail, run:
python setup.py install

View File

@ -1,34 +0,0 @@
Date: Wed, 07 Nov 2007 23:12:26 +0100
Subject: archivemail 0.7.1 released
Hi folks,
archivemail 0.7.1 was released today. This is a maintenance release with
numerous fixes. Most notably, archivemail should now work flawlessly with
python 2.5; this was long overdue. Again, there are quite important fixes in
the IMAP code. And like with 0.7.0, there's one new feature (the new --copy
option, see below).
Here are the main items from the changelog, roughly ordered by priority:
* Fixed incompatibility with Python 2.5 which broke Maildir handling.
* Fixed IMAP message flag conversion which was completely broken.
* Username and password in IMAP URLs can now be double-quoted, so it should be
no longer a problem if they contain delimiters like the '@' character.
* New option --copy: archive mail, but don't delete it from the mailbox.
This is mainly useful for testing purposes, and complements --delete.
* IMAP: if selecting the mailbox fails, archivemail detects the server's
mailbox hierarchy delimiter, replaces slashes in the mailbox name with the
delimiter and tries again.
* When converting from other formats to mbox, archivemail used to preserve
existing 'Status' and 'X-Status' mbox headers; these are now silently
overwritten to ensure they have correct values.
* Invalid messages/files in Maildirs caused archivemail to silently stop
processing mails and claim it's all done. Now skip these and go ahead.
* The automatic seteuid feature of archivemail is insecure and thus
deprecated; it will be removed from later versions.
* archivemail now accepts --days=0
Cheers,
Nikolaus

64
TODO
View File

@ -1,3 +1,33 @@
Integrate --debug-imap option into yet-to-be-implemented -vv switch?
I had the idea to provide separate debugging info levels anyway, see --debug
below.
Gracefully close IMAP connection upon unexptected error (currently archivemail
just terminates).
LOCKING & Co:
* Block signals while writing changed mailbox back.
* Double-check the entire locking code.
Seems like existing archives are not read or validated in any way. New archive
data is blindly appended... Probably okay, but should be documented.
IMAP SEARCH BEFORE disregards time and timezone information. This should at
least be documented. E.g. I've found that '-d 0' didn't match all messages in
an IMAP mailbox. This is because the SEARCH key is (BEFORE 14-Nov-2007) on 14
November, not matching messages that arrived today. (This problem is probably
fixed for most use cases by the --all option.)
Document mbox format issues: link to
http://homepages.tesco.net/~J.deBoynePollard/FGA/mail-mbox-formats.html,
qmail mbox manpage, Debian manpage, RFC 4155. Document what mbox format we can
read, and what we write.
FIXME: we cannot yet parse rfc 2822 addr-spec stuff like quoted local-parts in
return-path addresses.
Minor annoyance: when a From_ line is generated, guess_delivery_time() reports
the used date header a second time.
Check sf.net and Debian BTS for new bugs. Again.
IMAP: ensure mailbox archives are properly named. Currently imap folder names
@ -9,25 +39,17 @@ are mapped like this:
test/box | box_archive.gz
Implement --all. (?) Check patch from #1764846.
Implement --include-draft. But before, think about it again. (This is feature
request #1569305.)
Create temporary archive mbox in /tmp only if we don't have write permissions in
the mbox directory. Currently, if /tmp resides on another filesystem, we have
to copy the entire box to its destination.
Implement a fallback if an IMAP server doesn't support SEARCH. (Ouch!)
Add IMAP tests to the testsuite (upload test messages with IMAP "APPEND
date-string").
date-string"). This should be done without any real network I/O.
Try to port archivemail to email.message and the new mailboxes in Python 2.5.
Is these flexible enough for our needs?
Add recursive archiving of mail subfolders?
Line out what we want with respect to multiple selection criteria.
Some make sense, but this easily gets too complex, and if only it's a hassle
with adding all the options. Hm.
@ -46,15 +68,6 @@ Perhaps add some more nice stuff like printing of subject, sender...
See tracker #868714 "added stats option to archivemail", which has a point.
Message-Ids are useful for diagnosis, but not very nice to read for humans.
Regarding the --archive-name option:
* Do we want this? Probably, it adds flexibility.
* I think we should expand date format strings like we do with --suffix
* Hmm, --output-dir overrides os.dirname(archive_name)...
If no output_dir is given, use $PWD like we do for IMAP, or require -o?
* Provide short option -a? Not sure.
* The patch in #905657 is not bad. The Debian package also has a custom
--archive-name option, but with a worse implementation.
Be a nicer citizen with respect to mailbox locking.
Perhaps prune/shorten IMAP mailbox URLs in messages?
@ -65,31 +78,18 @@ Perhaps find a clean, lean replacement for all that clutter in the IMAP urls.
Require --output-dir for IMAP archiving? Otherwise we just drop the archive in
in the current working directory.
Switch to fcntl(2) locking? That would be NFS-safe. Perhaps make the locking
method configurable?
Check all items below, which are from the original author. :-)
.archivemailrc support
Specify an option to not seteuid() when run as root?
When you get a file-not-found in the 6th mailbox of 10, it aborts the whole
run. Better to fail gracefully and keep going.
Think about the best way to specify the names of archives created with
possibly an --archive-name option.
Add more tests (see top of test_archivemail.py)
Add more tests (see top of test_archivemail)
We need some better checking to see if we are really looking at a valid
mbox-format mailbox.
Lock any original .gz files
- is this necessary?
Check for symlink attacks for tempfiles (although we don't use /var/tmp)
Add an option to not cut threads.
Add MMDF mailbox support

File diff suppressed because it is too large Load Diff

View File

@ -1,435 +0,0 @@
.\" This manpage has been automatically generated by docbook2man
.\" from a DocBook document. This tool can be found at:
.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>
.\" Please send any bug reports, improvements, comments, patches,
.\" etc. to Steve Cheng <steve@ggi-project.org>.
.TH "ARCHIVEMAIL" "1" "07 November 2007" "SP" ""
.SH NAME
archivemail \- archive and compress your old email
.SH SYNOPSIS
\fBarchivemail\fR [ \fBoptions\fR ] \fB\fIMAILBOX\fB\fR\fI ...\fR
.SH "DESCRIPTION"
.PP
archivemail is a tool for archiving and compressing old email in mailboxes.
By default it will read the mailbox \fIMAILBOX\fR, moving messages
that are older that the specified number of days (180 by default) to a
\fBmbox\fR(5)-format mailbox in the same directory that is compressed
with \fBgzip\fR(1)\&.
It can also just delete old email rather than archive it.
.PP
\fBarchivemail\fR supports reading \fBIMAP\fR,
\fBMaildir\fR, \fBMH\fR and \fBmbox\fR-format
mailboxes, but always writes \fBmbox\fR-format archives.
.PP
Messages that are flagged important are not archived or deleted unless
explicitely requested with the \fB--include-flagged\fR option.
Also, \fBarchivemail\fR can be configured not to archive unread mail, or
to only archive messages larger than a specified size.
.PP
To archive an \fBIMAP\fR-format mailbox, use the format
\fIimap://username:password@server/mailbox\fR to specify the mailbox.
You can omit the password from the URL; use the
\fB--pwfile\fR option to make \fBarchivemail\fR read the
password from a file, or alternatively just enter it upon request.
If the \fB--pwfile\fR option is set, \fBarchivemail\fR does not
look for a password in the URL, and the colon is not considered a
delimiter.
Substitute '\fBimap\fR\&' with '\fBimaps\fR\&', and
\fBarchivemail\fR will establish a secure SSL connection.
See below for more \fBIMAP\fR peculiarities.
.PP
\fBarchivemail\fR has some support for being run as the root user on
user mailboxes. When running as root, it will \fBseteuid\fR(2) to the owner of the
mailbox it is reading, creating any archive files as that user.
\fBWarning:\fR
this automatic seteuid feature is insecure and deprecated.
It will be removed from later versions of \fBarchivemail\fR\&.
.SH "OPTIONS"
.TP
\fB -d \fINUM\fB, --days=\fINUM\fB\fR
Archive messages older than \fINUM\fR days.
The default is 180. This option is incompatible with the
\fB--date\fR option below.
.TP
\fB -D \fIDATE\fB, --date=\fIDATE\fB\fR
Archive messages older than \fIDATE\fR\&.
\fIDATE\fR can be a date string in ISO format (eg '2002-04-23'),
Internet format (eg '23 Apr 2002') or Internet format with full month names
(eg '23 April 2002'). Two-digit years are not supported.
This option is incompatible with the \fB--days\fR option above.
.TP
\fB -o \fIPATH\fB, --output-dir=\fIPATH\fB\fR
Use the directory name \fIPATH\fR to store the
mailbox archives. The default is the same directory as the mailbox to be
read.
.TP
\fB -P \fIFILE\fB, --pwfile=\fIFILE\fB\fR
Read IMAP password from file \fIFILE\fR
instead of from the command line. Note that this will probably not work if you
are archiving folders from more than one IMAP account.
.TP
\fB -F \fISTRING\fB, --filter-append=\fISTRING\fB\fR
Append \fISTRING\fR to the IMAP filter string.
For IMAP wizards.
.TP
\fB -s \fINAME\fB, --suffix=\fINAME\fB\fR
Use the suffix \fINAME\fR to create the filename used for archives.
The default is \fI_archive\fR\&. For example, if you
run \fBarchivemail\fR on a mailbox called
\fIexsouthrock\fR, the archive will be created
with the filename \fIexsouthrock_archive.gz\fR\&.
\fINAME\fR is run through the \fBpython\fR(1) \fBtime.strftime()\fR
function, which means that you can specify any of the following special
directives in \fINAME\fR to make archives named after the archive
cut-off date:
.RS
.TP 0.2i
\(bu
\fB%a\fR
Locale's abbreviated weekday name.
.TP 0.2i
\(bu
\fB%A\fR
Locale's full weekday name.
.TP 0.2i
\(bu
\fB%b\fR
Locale's abbreviated month name.
.TP 0.2i
\(bu
\fB%B\fR
Locale's full month name.
.TP 0.2i
\(bu
\fB%c\fR
Locale's appropriate date and time representation.
.TP 0.2i
\(bu
\fB%d\fR
Day of the month as a decimal number [01,31].
.TP 0.2i
\(bu
\fB%H\fR
Hour (24-hour clock) as a decimal number [00,23].
.TP 0.2i
\(bu
\fB%I\fR
Hour (12-hour clock) as a decimal number [01,12].
.TP 0.2i
\(bu
\fB%j\fR
Day of the year as a decimal number [001,366].
.TP 0.2i
\(bu
\fB%m\fR
Month as a decimal number [01,12].
.TP 0.2i
\(bu
\fB%M\fR
Minute as a decimal number [00,59].
.TP 0.2i
\(bu
\fB%p\fR
Locale's equivalent of either AM or PM.
.TP 0.2i
\(bu
\fB%S\fR
Second as a decimal number [00,61]. (1)
.TP 0.2i
\(bu
\fB%U\fR
Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0.
.TP 0.2i
\(bu
\fB%w\fR
Weekday as a decimal number [0(Sunday),6].
.TP 0.2i
\(bu
\fB%W\fR
Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0.
.TP 0.2i
\(bu
\fB%x\fR
Locale's appropriate date representation.
.TP 0.2i
\(bu
\fB%X\fR
Locale's appropriate time representation.
.TP 0.2i
\(bu
\fB%y\fR
Year without century as a decimal number [00,99].
.TP 0.2i
\(bu
\fB%Y\fR
Year with century as a decimal number.
.TP 0.2i
\(bu
\fB%Z\fR
Time zone name (or by no characters if no time zone exists).
.TP 0.2i
\(bu
\fB%%\fR
A literal "%" character.
.RE
.TP
\fB -S \fINUM\fB, --size=\fINUM\fB\fR
Only archive messages that are \fINUM\fR bytes or
greater.
.TP
\fB -n, --dry-run\fR
Don't write to any files -- just show what would have been done. This is
useful for testing to see how many messages would have been archived.
.TP
\fB -u, --preserve-unread\fR
Do not archive any messages that have not yet been read. \fBarchivemail\fR
determines if a message in a \fBmbox\fR-format or
\fBMH\fR-format mailbox has been read by looking at the
\fBStatus\fR header (if it exists). If the status
header is equal to 'RO' or 'OR' then \fBarchivemail\fR assumes the
message has been read. \fBarchivemail\fR determines if a
\fBmaildir\fR message has
been read by looking at the filename. If the filename contains an 'S' after
\fI:2,\fR then it assumes the message has been read.
.TP
\fB --dont-mangle\fR
Do not mangle lines in message bodies beginning with "From ". When archiving
a message from a mailbox not in \fBmbox\fR format, by default
\fBarchivemail\fR mangles such lines by prepending a '>' to them, since mail
user agents might otherwise interpret these lines as message separators.
Messages from \fBmbox\fR folders are never mangled. See \fBmbox\fR(5) for more
information.
.TP
\fB --delete\fR
Delete rather than archive old mail. Use this option with caution!
.TP
\fB --copy\fR
Copy rather than archive old mail.
Creates an archive, but the archived messages are not deleted from the
originating mailbox, which is left unchanged.
This is a complement to the \fB--delete\fR option, and mainly useful for
testing purposes.
.TP
\fB --include-flagged\fR
Normally messages that are flagged important are not archived or deleted. If
you specify this option, these messages can be archived or deleted just like
any other message.
.TP
\fB --no-compress\fR
Do not compress any archives.
.TP
\fB --warn-duplicate\fR
Warn about duplicate \fBMessage-ID\fRs that appear in the input
mailbox.
.TP
\fB -v, --verbose\fR
Reports lots of extra debugging information about what is going on.
.TP
\fB -q, --quiet\fR
Turns on quiet mode. Do not print any statistics about how many messages were
archived. This should be used if you are running \fBarchivemail\fR from
cron.
.TP
\fB -V, --version\fR
Display the version of \fBarchivemail\fR and exit.
.TP
\fB -h, --help\fR
Display brief summary information about how to run \fBarchivemail\fR\&.
.SH "NOTES"
.PP
\fBarchivemail\fR requires \fBpython\fR(1) version 2.3 or later.
When reading an \fBmbox\fR-format mailbox, \fBarchivemail\fR will
create a lockfile with the extension \fI\&.lock\fR so that
procmail will not deliver to the mailbox while it is being processed. It will
also create an advisory lock on the mailbox using \fBflock\fR(2)\&.
\fBarchivemail\fR will also complain and abort if a 3rd-party modifies the
mailbox while it is being read.
.PP
\fBarchivemail\fR will always attempt to preserve the mode,
last-access and last-modify times of the input mailbox. However, archive
mailboxes are always created with a mode of \fB0600\fR\&.
If \fBarchivemail\fR finds a pre-existing archive mailbox it
will append rather than overwrite that archive.
\fBarchivemail\fR will refuse to operate on mailboxes that are symbolic
links or create tempfiles or archives in world-writable directories.
.PP
\fBarchivemail\fR attempts to find the delivery date of a message by
looking for valid dates in the following headers, in order of precedence:
\fBDelivery-date\fR,
\fBDate\fR and
\fBResent-Date\fR\&.
If it cannot find any valid date in these headers, it
will use the last-modified file timestamp on \fBMH\fR and
\fBMaildir\fR format mailboxes, or the date on the
\fBFrom\fR line on \fBmbox\fR-format mailboxes.
.PP
A conversion from other formats to \fBmbox\fR(5) will silently overwrite existing
\fBStatus\fR and \fBX-Status\fR message headers.
.SS "IMAP"
.PP
When \fBarchivemail\fR processes an \fBIMAP\fR folder, all messages
in that folder will have their \\Recent flag unset, and they will
probably not show up as 'new' in your user agent later on.
There is no way around this, it's just how \fBIMAP\fR works.
This does not apply, however, if you run \fBarchivemail\fR with the options
\fB--dry-run\fR or \fB--copy\fR\&.
.PP
\fBarchivemail\fR relies on server-side searches to determine the messages
that should be archived.
When matching message dates, \fBIMAP\fR servers refer to server internal
message dates, and these may differ from both delivery time of a message and
its \fBDate\fR header.
Also, there exist broken servers which do not implement server side searches.
.SS "IMAP URLS"
.PP
\fBarchivemail\fR\&'s \fBIMAP\fR URL parser was written
with the RFC 2882 (\fIInternet Message
Format\fR) rules for the local-part of email addresses
in mind.
So, rather than enforcing an URL-style encoding of non-ascii
and reserved characters, it allows to double-quote the username and password.
If your username or password contains the delimiter characters '@' or ':', just
quote it like this:
\fIimap://"username@bogus.com":"password"@imap.bogus.com/mailbox\fR\&.
You can use a backslash to escape double-quotes that are part of a quoted
username or password.
Note that quoting only a substring will not work, and be aware that your shell
will probably remove unprotected quotes or backslashes.
.PP
\fBIMAP\fR servers supporting subfolders may use any character as a
mailbox path separator, that is, as an equivalent to the slash character on Unix
systems.
If you are archiving an IMAP subfolder, first \fBarchivemail\fR will try
to open a given mailbox name unchanged; if this fails, it will interpret any
slashes in the URL as path separators and try again.
.SH "EXAMPLES"
.PP
.PP
To archive all messages in the mailbox \fIdebian-user\fR that
are older than 180 days to a compressed mailbox called
\fIdebian-user_archive.gz\fR in the current directory:
.nf
bash$ \fBarchivemail debian-user\fR
.fi
.PP
.PP
To archive all messages in the mailbox \fIdebian-user\fR that
are older than 180 days to a compressed mailbox called
\fIdebian-user_October_2001.gz\fR (where the current month and
year is April, 2002) in the current directory:
.nf
bash$ \fBarchivemail --suffix '_%B_%Y' debian-user\fR
.fi
.PP
.PP
To archive all messages in the mailbox \fIcm-melb\fR that
are older than the first of January 2002 to a compressed mailbox called
\fIcm-melb_archive.gz\fR in the current directory:
.nf
bash$ \fBarchivemail --date'1 Jan 2002' cm-melb\fR
.fi
.PP
.PP
Exactly the same as the above example, using an ISO date format instead:
.nf
bash$ \fBarchivemail --date=2002-01-01 cm-melb\fR
.fi
.PP
.PP
To delete all messages in the mailbox \fIspam\fR that
are older than 30 days:
.nf
bash$ \fBarchivemail --delete --days=30 spam\fR
.fi
.PP
.PP
To archive all read messages in the mailbox \fIincoming\fR that
are older than 180 days to a compressed mailbox called
\fIincoming_archive.gz\fR in the current directory:
.nf
bash$ \fBarchivemail --preserve-unread incoming\fR
.fi
.PP
.PP
To archive all messages in the mailbox \fIreceived\fR that
are older than 180 days to an uncompressed mailbox called
\fIreceived_archive\fR in the current directory:
.nf
bash$ \fBarchivemail --no-compress received\fR
.fi
.PP
.PP
To archive all mailboxes in the directory \fI$HOME/Mail\fR
that are older than 90 days to compressed mailboxes in the
\fI$HOME/Mail/Archive\fR directory:
.nf
bash$ \fBarchivemail -d90 -o $HOME/Mail/Archive $HOME/Mail/*\fR
.fi
.PP
.PP
To archive all mails older than 180 days from the given \fBIMAP\fR
INBOX to a compressed mailbox INBOX_archive.gz in the
\fI$HOME/Mail/Archive\fR directory, quoting the password and
reading it from the environment variable \fBPASSWORD\fR:
.nf
bash$ \fBarchivemail -o $HOME/Mail/Archive imaps://user:'"'$PASSWORD'"'@example.org/INBOX\fR
.fi
.PP
Note the protected quotes.
.SH "TIPS"
.PP
Probably the best way to run \fBarchivemail\fR is from your \fBcrontab\fR(5)
file, using the \fB--quiet\fR option.
Don't forget to try the \fB--dry-run\fR and perhaps the
\fB--copy\fR option for non-destructive testing.
.SH "EXIT STATUS"
.PP
Normally the exit status is 0. Nonzero indicates an unexpected error.
.SH "BUGS"
.PP
If an \fBIMAP\fR mailbox path contains slashes, the archive filename
will be derived from the basename of the mailbox.
If the server's folder separator differs from the Unix slash and is used in the
\fBIMAP\fR URL, however, the whole path will be considered
the basename of the mailbox.
E.g. the two URLs
\fBimap://user@example.com/folder/subfolder\fR and
\fBimap://user@example.com/folder.subfolder\fR will be
archived in \fIsubfolder_archive.gz\fR and
\fIfolder.subfolder_archive.gz\fR, respectively, although they
might refer to the same \fBIMAP\fR mailbox.
.PP
\fBarchivemail\fR does not support reading \fBMMDF\fR or
\fBBabyl\fR-format mailboxes. In fact, it will probably think it is
reading an \fBmbox\fR-format mailbox and cause all sorts of problems.
.PP
\fBarchivemail\fR is still too slow, but if you are running from \fBcrontab\fR(5)
you won't care. Archiving \fBmaildir\fR-format mailboxes should be
a lot quicker than \fBmbox\fR-format mailboxes since it is less
painful for the original mailbox to be reconstructed after selective message
removal.
.SH "SEE ALSO"
\fBpython\fR(1), \fBgzip\fR(1), \fBmutt\fR(1), \fBprocmail\fR(1)
.SH "URL"
.PP
The \fBarchivemail\fR home page is currently hosted at
sourceforge <URL:http://archivemail.sourceforge.net>
.SH "AUTHOR"
.PP
This manual page was written by Paul Rodger <paul at paulrodger dot
com>\&. Updated and supplemented by Nikolaus Schulz
<microschulz@web.de>

View File

@ -1,641 +0,0 @@
<!DOCTYPE RefEntry PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
<!ENTITY flock "<CiteRefEntry>
<RefEntryTitle><Command/flock/</RefEntryTitle>
<ManVolNum/2/</CiteRefEntry>">
<!ENTITY gzip "<CiteRefEntry>
<RefEntryTitle><Command/gzip/</RefEntryTitle>
<ManVolNum/1/</CiteRefEntry>">
<!ENTITY mutt "<CiteRefEntry>
<RefEntryTitle><Command/mutt/</RefEntryTitle>
<ManVolNum/1/</CiteRefEntry>">
<!ENTITY procmail "<CiteRefEntry>
<RefEntryTitle><Command/procmail/</RefEntryTitle>
<ManVolNum/1/</CiteRefEntry>">
<!ENTITY python "<CiteRefEntry>
<RefEntryTitle><Command/python/</RefEntryTitle>
<ManVolNum/1/</CiteRefEntry>">
<!ENTITY seteuid "<CiteRefEntry>
<RefEntryTitle><Command/seteuid/</RefEntryTitle>
<ManVolNum/2/</CiteRefEntry>">
<!ENTITY crontab "<CiteRefEntry>
<RefEntryTitle><Command/crontab/</RefEntryTitle>
<ManVolNum/5/</CiteRefEntry>">
<!ENTITY mbox "<CiteRefEntry>
<RefEntryTitle><Command/mbox/</RefEntryTitle>
<ManVolNum/5/</CiteRefEntry>">
]>
<RefEntry>
<DocInfo><Date>7 November 2007</Date></DocInfo>
<RefMeta>
<RefEntryTitle>archivemail</RefEntryTitle>
<ManVolNum>1</ManVolNum>
<RefMiscInfo>SP</RefMiscInfo>
</RefMeta>
<RefNameDiv>
<RefName>archivemail</RefName>
<RefPurpose>archive and compress your old email</RefPurpose>
</RefNameDiv>
<RefSynopsisDiv>
<CmdSynopsis>
<Command/archivemail/
<Arg><Option>options</Option></Arg>
<Arg choice=req rep=repeat><Replaceable/MAILBOX/</Arg>
</CmdSynopsis>
</RefSynopsisDiv>
<RefSect1>
<Title>Description</Title>
<Para>
archivemail is a tool for archiving and compressing old email in mailboxes.
By default it will read the mailbox <Replaceable/MAILBOX/, moving messages
that are older that the specified number of days (180 by default) to a
&mbox;-format mailbox in the same directory that is compressed
with &gzip;.
It can also just delete old email rather than archive it.
</Para>
<Para>
<Command/archivemail/ supports reading <application/IMAP/,
<application/Maildir/, <application/MH/ and <application/mbox/-format
mailboxes, but always writes <application/mbox/-format archives.
</Para>
<Para>
Messages that are flagged important are not archived or deleted unless
explicitely requested with the <Option>--include-flagged</Option> option.
Also, <command/archivemail/ can be configured not to archive unread mail, or
to only archive messages larger than a specified size.
</Para>
<Para>
To archive an <application/IMAP/-format mailbox, use the format
<replaceable>imap://username:password@server/mailbox
</replaceable> to specify the mailbox.
You can omit the password from the <acronym/URL/; use the
<option>--pwfile</option> option to make <command/archivemail/ read the
password from a file, or alternatively just enter it upon request.
If the <option>--pwfile</option> option is set, <command/archivemail/ does not
look for a password in the <acronym/URL/, and the colon is not considered a
delimiter.
Substitute '<userinput/imap/' with '<userinput/imaps/', and
<command/archivemail/ will establish a secure <acronym/SSL/ connection.
See below for more <application/IMAP/ peculiarities.
</Para>
<Para>
<Command/archivemail/ has some support for being run as the root user on
user mailboxes. When running as root, it will &seteuid; to the owner of the
mailbox it is reading, creating any archive files as that user.
<emphasis>Warning:</emphasis>
<!-- I would like to have a <warning> here, but the dsssl stylesheet thinks a
warning need be decorated with a graphic. *sigh* I won't start hacking
dsssl because of this. -->
this automatic seteuid feature is insecure and deprecated.
It will be removed from later versions of <command/archivemail/.
</Para>
</RefSect1>
<RefSect1>
<Title>Options</Title>
<VariableList>
<VarListEntry>
<Term>
<Option>-d <Replaceable/NUM/, --days=<Replaceable/NUM/</Option>
</Term>
<ListItem><Para>Archive messages older than <Replaceable/NUM/ days.
The default is 180. This option is incompatible with the
<Option/--date/ option below.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>-D <Replaceable/DATE/, --date=<Replaceable/DATE/</Option>
</Term>
<ListItem><Para>Archive messages older than <Replaceable/DATE/.
<Replaceable/DATE/ can be a date string in ISO format (eg '2002-04-23'),
Internet format (eg '23 Apr 2002') or Internet format with full month names
(eg '23 April 2002'). Two-digit years are not supported.
This option is incompatible with the <Option/--days/ option above.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>-o <Replaceable/PATH/, --output-dir=<Replaceable/PATH/</Option>
</Term>
<ListItem><Para>Use the directory name <Replaceable/PATH/ to store the
mailbox archives. The default is the same directory as the mailbox to be
read.
</Para></ListItem>
<VarListEntry>
<Term>
<Option>-P <Replaceable/FILE/, --pwfile=<Replaceable/FILE/</Option>
</Term>
<ListItem><Para>Read <acronym/IMAP/ password from file <Replaceable/FILE/
instead of from the command line. Note that this will probably not work if you
are archiving folders from more than one IMAP account.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>-F <Replaceable/STRING/,
--filter-append=<Replaceable/STRING/</Option>
</Term>
<ListItem><Para>Append <Replaceable/STRING/ to the <acronym/IMAP/ filter string.
For <acronym/IMAP/ wizards.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>-s <Replaceable/NAME/, --suffix=<Replaceable/NAME/</Option>
</Term>
<ListItem><Para>
Use the suffix <Replaceable/NAME/ to create the filename used for archives.
The default is <filename>_archive</filename>. For example, if you
run <Command/archivemail/ on a mailbox called
<filename>exsouthrock</filename>, the archive will be created
with the filename <filename>exsouthrock_archive.gz</filename>.
</Para>
<Para>
<Replaceable/NAME/ is run through the &python; <application/time.strftime()/
function, which means that you can specify any of the following special
directives in <Replaceable/NAME/ to make archives named after the archive
cut-off date:
<itemizedlist mark='none'>
<listitem><para><option>%a</option>
Locale's abbreviated weekday name.</para></listitem>
<listitem><para><option>%A</option>
Locale's full weekday name.</para></listitem>
<listitem><para><option>%b</option>
Locale's abbreviated month name.</para></listitem>
<listitem><para><option>%B</option>
Locale's full month name.</para></listitem>
<listitem><para><option>%c</option>
Locale's appropriate date and time representation.</para></listitem>
<listitem><para><option>%d</option>
Day of the month as a decimal number [01,31].</para></listitem>
<listitem><para><option>%H</option>
Hour (24-hour clock) as a decimal number [00,23].</para></listitem>
<listitem><para><option>%I</option>
Hour (12-hour clock) as a decimal number [01,12].</para></listitem>
<listitem><para><option>%j</option>
Day of the year as a decimal number [001,366].</para></listitem>
<listitem><para><option>%m</option>
Month as a decimal number [01,12].</para></listitem>
<listitem><para><option>%M</option>
Minute as a decimal number [00,59].</para></listitem>
<listitem><para><option>%p</option>
Locale's equivalent of either AM or PM.</para></listitem>
<listitem><para><option>%S</option>
Second as a decimal number [00,61]. (1)</para></listitem>
<listitem><para><option>%U</option>
Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0.</para></listitem>
<listitem><para><option>%w</option>
Weekday as a decimal number [0(Sunday),6].</para></listitem>
<listitem><para><option>%W</option>
Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0.</para></listitem>
<listitem><para><option>%x</option>
Locale's appropriate date representation.</para></listitem>
<listitem><para><option>%X</option>
Locale's appropriate time representation.</para></listitem>
<listitem><para><option>%y</option>
Year without century as a decimal number [00,99].</para></listitem>
<listitem><para><option>%Y</option>
Year with century as a decimal number.</para></listitem>
<listitem><para><option>%Z</option>
Time zone name (or by no characters if no time zone exists).</para></listitem>
<listitem><para><option>%%</option>
A literal "%" character.</para></listitem>
</itemizedlist>
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>-S <Replaceable/NUM/, --size=<Replaceable/NUM/</Option>
</Term>
<ListItem><Para>Only archive messages that are <Replaceable/NUM/ bytes or
greater.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>-n, --dry-run</Option>
</Term>
<ListItem><Para>
Don't write to any files -- just show what would have been done. This is
useful for testing to see how many messages would have been archived.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>-u, --preserve-unread</Option>
</Term>
<ListItem><Para>
Do not archive any messages that have not yet been read. <command/archivemail/
determines if a message in a <application/mbox/-format or
<application/MH/-format mailbox has been read by looking at the
<application/Status/ header (if it exists). If the status
header is equal to 'RO' or 'OR' then <application/archivemail/ assumes the
message has been read. <command/archivemail/ determines if a
<application/maildir/ message has
been read by looking at the filename. If the filename contains an 'S' after
<filename>:2,</filename> then it assumes the message has been read.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>--dont-mangle</Option>
</Term>
<ListItem><Para>
Do not mangle lines in message bodies beginning with "From ". When archiving
a message from a mailbox not in <application/mbox/ format, by default
<command/archivemail/ mangles such lines by prepending a '>' to them, since mail
user agents might otherwise interpret these lines as message separators.
Messages from <application/mbox/ folders are never mangled. See &mbox; for more
information.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>--delete</Option>
</Term>
<ListItem><Para>
Delete rather than archive old mail. Use this option with caution!
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>--copy</Option>
</Term>
<ListItem><Para>
Copy rather than archive old mail.
Creates an archive, but the archived messages are not deleted from the
originating mailbox, which is left unchanged.
This is a complement to the <option/--delete/ option, and mainly useful for
testing purposes.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>--include-flagged</Option>
</Term>
<ListItem><Para>
Normally messages that are flagged important are not archived or deleted. If
you specify this option, these messages can be archived or deleted just like
any other message.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>--no-compress</Option>
</Term>
<ListItem><Para>
Do not compress any archives.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>--warn-duplicate</Option>
</Term>
<ListItem><Para>
Warn about duplicate <application/Message-ID/s that appear in the input
mailbox.</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>-v, --verbose</Option>
</Term>
<ListItem><Para>
Reports lots of extra debugging information about what is going on.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>-q, --quiet</Option>
</Term>
<ListItem><Para>
Turns on quiet mode. Do not print any statistics about how many messages were
archived. This should be used if you are running <Command/archivemail/ from
cron.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>-V, --version</Option>
</Term>
<ListItem><Para>
Display the version of <Command/archivemail/ and exit.
</Para></ListItem>
</VarListEntry>
<VarListEntry>
<Term>
<Option>-h, --help</Option>
</Term>
<ListItem><Para>
Display brief summary information about how to run <Command/archivemail/.
</Para></ListItem>
</VarListEntry>
</VariableList>
</RefSect1>
<RefSect1>
<Title>Notes</Title>
<Para>
<Command/archivemail/ requires &python; version 2.3 or later.
When reading an <application/mbox/-format mailbox, <command/archivemail/ will
create a lockfile with the extension <filename>.lock</filename> so that
procmail will not deliver to the mailbox while it is being processed. It will
also create an advisory lock on the mailbox using &flock;.
<command/archivemail/ will also complain and abort if a 3rd-party modifies the
mailbox while it is being read.
</Para>
<Para>
<Command/archivemail/ will always attempt to preserve the mode,
last-access and last-modify times of the input mailbox. However, archive
mailboxes are always created with a mode of <application/0600/.
If <Command/archivemail/ finds a pre-existing archive mailbox it
will append rather than overwrite that archive.
<Command/archivemail/ will refuse to operate on mailboxes that are symbolic
links or create tempfiles or archives in world-writable directories.
</Para>
<Para>
<Command/archivemail/ attempts to find the delivery date of a message by
looking for valid dates in the following headers, in order of precedence:
<application/Delivery-date/,
<application/Date/ and
<application/Resent-Date/.
If it cannot find any valid date in these headers, it
will use the last-modified file timestamp on <application/MH/ and
<application/Maildir/ format mailboxes, or the date on the
<application/From/ line on <application/mbox/-format mailboxes.
</Para>
<Para>
A conversion from other formats to &mbox; will silently overwrite existing
<application/Status/ and <application/X-Status/ message headers.
</Para>
<RefSect2>
<Title><acronym/IMAP/</Title>
<Para>
When <command/archivemail/ processes an <application/IMAP/ folder, all messages
in that folder will have their <literal/\Recent/ flag unset, and they will
probably not show up as 'new' in your user agent later on.
There is no way around this, it's just how <application/IMAP/ works.
This does not apply, however, if you run <command/archivemail/ with the options
<option/--dry-run/ or <option/--copy/.
</Para>
<Para>
<command/archivemail/ relies on server-side searches to determine the messages
that should be archived.
When matching message dates, <application/IMAP/ servers refer to server internal
message dates, and these may differ from both delivery time of a message and
its <application/Date/ header.
Also, there exist broken servers which do not implement server side searches.
</Para>
<RefSect3><Title><acronym/IMAP/ <acronym/URLs/</Title>
<Para>
<command/archivemail/'s <application/IMAP/ <acronym/URL/ parser was written
with the <acronym>RFC</acronym> 2882 (<citetitle>Internet Message
Format</citetitle>) rules for the <token>local-part</token> of email addresses
in mind.
So, rather than enforcing an <acronym/URL/-style encoding of non-<acronym/ascii/
and reserved characters, it allows to double-quote the username and password.
If your username or password contains the delimiter characters '@' or ':', just
quote it like this:
<replaceable>imap://"username@bogus.com":"password"@imap.bogus.com/mailbox
</replaceable>.
You can use a backslash to escape double-quotes that are part of a quoted
username or password.
Note that quoting only a substring will not work, and be aware that your shell
will probably remove unprotected quotes or backslashes.
</Para>
<Para>
<application/IMAP/ servers supporting subfolders may use any character as a
mailbox path separator, that is, as an equivalent to the slash character on Unix
systems.
If you are archiving an IMAP subfolder, first <command/archivemail/ will try
to open a given mailbox name unchanged; if this fails, it will interpret any
slashes in the <acronym/URL/ as path separators and try again.
</Para>
</RefSect3>
</RefSect2>
</RefSect1>
<RefSect1>
<Title>Examples</Title>
<InformalExample>
<Para>
To archive all messages in the mailbox <filename>debian-user</filename> that
are older than 180 days to a compressed mailbox called
<filename>debian-user_archive.gz</filename> in the current directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail debian-user</userinput>
</screen>
</Para>
</InformalExample>
<InformalExample>
<Para>
To archive all messages in the mailbox <filename>debian-user</filename> that
are older than 180 days to a compressed mailbox called
<filename>debian-user_October_2001.gz</filename> (where the current month and
year is April, 2002) in the current directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --suffix '_%B_%Y' debian-user</userinput>
</screen>
</Para>
</InformalExample>
<InformalExample>
<Para>
To archive all messages in the mailbox <filename>cm-melb</filename> that
are older than the first of January 2002 to a compressed mailbox called
<filename>cm-melb_archive.gz</filename> in the current directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --date'1 Jan 2002' cm-melb</userinput>
</screen>
</Para>
</InformalExample>
<InformalExample>
<Para>
Exactly the same as the above example, using an ISO date format instead:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --date=2002-01-01 cm-melb</userinput>
</screen>
</Para>
</InformalExample>
<InformalExample>
<Para>
To delete all messages in the mailbox <filename>spam</filename> that
are older than 30 days:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --delete --days=30 spam</userinput>
</screen>
</Para>
</InformalExample>
<InformalExample>
<Para>
To archive all read messages in the mailbox <filename>incoming</filename> that
are older than 180 days to a compressed mailbox called
<filename>incoming_archive.gz</filename> in the current directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --preserve-unread incoming</userinput>
</screen>
</Para>
</InformalExample>
<InformalExample>
<Para>
To archive all messages in the mailbox <filename>received</filename> that
are older than 180 days to an uncompressed mailbox called
<filename>received_archive</filename> in the current directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --no-compress received</userinput>
</screen>
</Para>
</InformalExample>
<InformalExample>
<Para>
To archive all mailboxes in the directory <filename>$HOME/Mail</filename>
that are older than 90 days to compressed mailboxes in the
<filename>$HOME/Mail/Archive</filename> directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail -d90 -o $HOME/Mail/Archive $HOME/Mail/*</userinput>
</screen>
</Para>
</InformalExample>
<InformalExample>
<Para>
To archive all mails older than 180 days from the given <application/IMAP/
INBOX to a compressed mailbox INBOX_archive.gz in the
<filename>$HOME/Mail/Archive</filename> directory, quoting the password and
reading it from the environment variable <envar>PASSWORD</envar>:
</Para>
<!-- I'm open to suggestions how to avoid making such a super-long line here. -->
<screen>
<prompt>bash$ </prompt><userinput>archivemail -o $HOME/Mail/Archive imaps://user:'"'$PASSWORD'"'@example.org/INBOX</userinput>
</screen>
<Para>
Note the protected quotes.
</Para>
</InformalExample>
</RefSect1>
<RefSect1>
<Title>Tips</Title>
<Para>
Probably the best way to run <Command/archivemail/ is from your &crontab;
file, using the <Option>--quiet</Option> option.
Don't forget to try the <Option>--dry-run</Option> and perhaps the
<Option>--copy</Option> option for non-destructive testing.
</Para>
</RefSect1>
<RefSect1>
<Title>Exit Status</Title>
<SimPara>Normally the exit status is 0. Nonzero indicates an unexpected error.
</SimPara>
</RefSect1>
<RefSect1>
<Title>Bugs</Title>
<SimPara>
If an <application/IMAP/ mailbox path contains slashes, the archive filename
will be derived from the basename of the mailbox.
If the server's folder separator differs from the Unix slash and is used in the
<application/IMAP/ <acronym/URL/, however, the whole path will be considered
the basename of the mailbox.
E.g. the two <acronym/URL/s
<userinput>imap://user@example.com/folder/subfolder</userinput> and
<userinput>imap://user@example.com/folder.subfolder</userinput> will be
archived in <filename>subfolder_archive.gz</filename> and
<filename>folder.subfolder_archive.gz</filename>, respectively, although they
might refer to the same <application/IMAP/ mailbox.
</SimPara>
<SimPara>
<command/archivemail/ does not support reading <application/MMDF/ or
<application/Babyl/-format mailboxes. In fact, it will probably think it is
reading an <application/mbox/-format mailbox and cause all sorts of problems.
</SimPara>
<SimPara>
<Command/archivemail/ is still too slow, but if you are running from &crontab;
you won't care. Archiving <application/maildir/-format mailboxes should be
a lot quicker than <application/mbox/-format mailboxes since it is less
painful for the original mailbox to be reconstructed after selective message
removal.
</SimPara>
</RefSect1>
<RefSect1>
<Title>See Also</Title>
<SimpleList>
<Member> &python;, &gzip;, &mutt;, &procmail;</Member>
</SimpleList>
</RefSect1>
<RefSect1>
<Title>Url</Title>
<SimPara>The <Command/archivemail/ home page is currently hosted at
<ulink type="http" url="http://archivemail.sourceforge.net">sourceforge</ulink>
</SimPara>
</RefSect1>
<RefSect1>
<Title>Author</Title>
<SimPara> This manual page was written by Paul Rodger &lt;paul at paulrodger dot
com&gt;. Updated and supplemented by Nikolaus Schulz
<email>microschulz@web.de</email></SimPara>
</RefSect1>
</RefEntry>

794
archivemail.xml Normal file
View File

@ -0,0 +1,794 @@
<?xml version='1.0'?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"file:///usr/share/xml/docbook/schema/dtd/4.2/docbookx.dtd" [
<!ENTITY lockf '<citerefentry>
<refentrytitle><emphasis role="bold">lockf</emphasis></refentrytitle>
<manvolnum>2</manvolnum></citerefentry>'>
<!ENTITY gzip '<citerefentry>
<refentrytitle><emphasis role="bold">gzip</emphasis></refentrytitle>
<manvolnum>1</manvolnum></citerefentry>'>
<!ENTITY procmail '<citerefentry>
<refentrytitle><emphasis role="bold">procmail</emphasis></refentrytitle>
<manvolnum>1</manvolnum></citerefentry>'>
<!ENTITY python '<citerefentry>
<refentrytitle><emphasis role="bold">python</emphasis></refentrytitle>
<manvolnum>1</manvolnum></citerefentry>'>
<!ENTITY crontab '<citerefentry>
<refentrytitle><emphasis role="bold">crontab</emphasis></refentrytitle>
<manvolnum>5</manvolnum></citerefentry>'>
<!ENTITY mbox '<citerefentry>
<refentrytitle><emphasis role="bold"><acronym>mbox</acronym></emphasis></refentrytitle>
<manvolnum>5</manvolnum></citerefentry>'>
]>
<refentry>
<docinfo><date>5 July 2011</date></docinfo>
<refmeta>
<refentrytitle>archivemail</refentrytitle>
<manvolnum>1</manvolnum>
<refmiscinfo class="manual">archivemail user manual</refmiscinfo>
<refmiscinfo class="source">archivemail 0.9.0</refmiscinfo>
</refmeta>
<refnamediv>
<refname>archivemail</refname>
<refpurpose>archive and compress your old email</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>archivemail</command>
<arg><option>options</option></arg>
<arg choice="req" rep="repeat"><replaceable>MAILBOX</replaceable></arg>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para>
<command>archivemail</command> is a tool for archiving and compressing old
email in mailboxes.
By default it will read the mailbox <replaceable>MAILBOX</replaceable>, moving
messages that are older than the specified number of days (180 by default) to
a &mbox;-format mailbox in the same directory that is compressed with &gzip;.
It can also just delete old email rather than archive it.
</para>
<para>
By default, <command>archivemail</command> derives the archive filename from
the mailbox name by appending an <filename>_archive</filename> suffix to the
mailbox name. For example, if you run <command>archivemail</command> on a
mailbox called <filename>exsouthrock</filename>, the archive will be created
with the filename <filename>exsouthrock_archive.gz</filename>.
This default behavior can be overridden with command line options, choosing
a custom suffix, a prefix, or a completely custom name for the archive.
</para>
<para>
<command>archivemail</command> supports reading <acronym>IMAP</acronym>,
<acronym>Maildir</acronym>, <acronym>MH</acronym> and
<acronym>mbox</acronym>-format mailboxes, but always writes
<acronym>mbox</acronym>-format archives.
</para>
<para>
Messages that are flagged important are not archived or deleted unless
explicitly requested with the <option>--include-flagged</option> option.
Also, <command>archivemail</command> can be configured not to archive unread
mail, or to only archive messages larger than a specified size.
</para>
<para>
To archive an <acronym>IMAP</acronym>-format mailbox, use the format
<replaceable>imap://username:password@server/mailbox </replaceable> to specify
the mailbox.
<command>archivemail</command> will expand wildcards in
<acronym>IMAP</acronym> mailbox names according to
<citation><acronym>RFC</acronym> 3501</citation>, which says: <quote>The
character "*" is a wildcard, and matches zero or more characters at this
position. The character "%" is similar to "*", but it does not match a
hierarchy delimiter.</quote>
You can omit the password from the <acronym>URL</acronym>; use the
<option>--pwfile</option> option to make <command>archivemail</command> read
the password from a file, or alternatively just enter it upon request.
If the <option>--pwfile</option> option is set, <command>archivemail</command>
does not look for a password in the <acronym>URL</acronym>, and the colon is
not considered a delimiter.
Substitute <replaceable>imap</replaceable> with
<replaceable>imaps</replaceable>, and <command>archivemail</command> will
establish a secure <acronym>SSL</acronym> connection.
See below for more <acronym>IMAP</acronym> peculiarities.
</para>
</refsect1>
<refsect1>
<title>Options</title>
<variablelist>
<varlistentry>
<term><option>-d <replaceable>NUM</replaceable></option></term>
<term><option>--days=<replaceable>NUM</replaceable></option></term>
<listitem><para>Archive messages older than <replaceable>NUM</replaceable>
days. The default is 180. This option is incompatible with the
<option>--date</option> option below.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-D <replaceable>DATE</replaceable></option></term>
<term><option>--date=<replaceable>DATE</replaceable></option></term>
<listitem><para>Archive messages older than <replaceable>DATE</replaceable>.
<replaceable>DATE</replaceable> can be a date string in ISO format (eg
<quote>2002-04-23</quote>), Internet format (<abbrev>eg</abbrev> <quote>23 Apr
2002</quote>) or Internet format with full month names (<abbrev>eg</abbrev>
<quote>23 April 2002</quote>). Two-digit years are not supported.
This option is incompatible with the <option>--days</option> option above.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-o <replaceable>PATH</replaceable></option></term>
<term><option>--output-dir=<replaceable>PATH</replaceable></option></term>
<listitem><para>Use the directory name <replaceable>PATH</replaceable> to
store the mailbox archives. The default is the same directory as the mailbox
to be read.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-P <replaceable>FILE</replaceable></option></term>
<term><option>--pwfile=<replaceable>FILE</replaceable></option></term>
<listitem><para>Read <acronym>IMAP</acronym> password from file
<replaceable>FILE</replaceable> instead of from the command line. Note
that this will probably not work if you are archiving folders from
more than one IMAP account.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-F <replaceable>STRING</replaceable></option></term>
<term><option>--filter-append=<replaceable>STRING</replaceable></option></term>
<listitem><para>Append <replaceable>STRING</replaceable> to the
<acronym>IMAP</acronym> filter string.
For <acronym>IMAP</acronym> wizards.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-p <replaceable>NAME</replaceable></option></term>
<term><option>--prefix=<replaceable>NAME</replaceable></option></term>
<listitem><para>Prefix <replaceable>NAME</replaceable> to the archive name.
<replaceable>NAME</replaceable> is expanded by the &python; function
<function>time.strftime()</function>, which means that you can specify special
directives in <replaceable>NAME</replaceable> to make an archive named after
the archive cut-off date.
See the discussion of the <option>--suffix</option> option for a list of valid
<function>strftime()</function> directives.
The default is not to add a prefix.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-s <replaceable>NAME</replaceable></option></term>
<term><option>--suffix=<replaceable>NAME</replaceable></option></term>
<listitem><para>
Use the suffix <replaceable>NAME</replaceable> to create the filename used for
archives. The default is <filename>_archive</filename>, unless a prefix is
specified.
</para>
<para>
Like a prefix, the suffix <replaceable>NAME</replaceable> is expanded by the
&python; function <function>time.strftime()</function> with the archive
cut-off date. <function>time.strftime()</function> understands the following
directives:
<variablelist id="strftime">
<varlistentry><term><code>%a</code></term>
<listitem><simpara>
Locale's abbreviated weekday name.
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%A</code></term>
<listitem><simpara>
Locale's full weekday name.
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%b</code></term>
<listitem><simpara>
Locale's abbreviated month name.
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%B</code></term>
<listitem><simpara>
Locale's full month name.
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%c</code></term>
<listitem><simpara>
Locale's appropriate date and time representation.
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%d</code></term>
<listitem><simpara>
Day of the month as a decimal number [01,31].
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%H</code></term>
<listitem><simpara>
Hour (24-hour clock) as a decimal number [00,23].
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%I</code></term>
<listitem><simpara>
Hour (12-hour clock) as a decimal number [01,12].
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%j</code></term>
<listitem><simpara>
Day of the year as a decimal number [001,366].
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%m</code></term>
<listitem><simpara>
Month as a decimal number [01,12].
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%M</code></term>
<listitem><simpara>
Minute as a decimal number [00,59].
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%p</code></term>
<listitem><simpara>
Locale's equivalent of either AM or PM.
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%S</code></term>
<listitem><simpara>
Second as a decimal number [00,61]. (1)
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%U</code></term>
<listitem><simpara>
Week number of the year (Sunday as the first day of the week)
as a decimal number [00,53]. All days in a new year preceding
the first Sunday are considered to be in week 0.
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%w</code></term>
<listitem><simpara>
Weekday as a decimal number [0(Sunday),6].
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%W</code></term>
<listitem><simpara>
Week number of the year (Monday as the first day of the week)
as a decimal number [00,53]. All days in a new year preceding
the first Sunday are considered to be in week 0.
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%x</code></term>
<listitem><simpara>
Locale's appropriate date representation.
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%X</code></term>
<listitem><simpara>
Locale's appropriate time representation.
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%y</code></term>
<listitem><simpara>
Year without century as a decimal number [00,99].
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%Y</code></term>
<listitem><simpara>
Year with century as a decimal number.
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%Z</code></term>
<listitem><simpara>
Time zone name (or by no characters if no time zone exists).
</simpara></listitem>
</varlistentry>
<varlistentry><term><code>%%</code></term>
<listitem><simpara>
A literal <quote>%</quote> character.
</simpara></listitem>
</varlistentry>
</variablelist>
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-a <replaceable>NAME</replaceable></option></term>
<term><option>--archive-name=<replaceable>NAME</replaceable></option></term>
<listitem><para>Use <replaceable>NAME</replaceable> as the archive name,
ignoring the name of the mailbox that is archived.
Like prefixes and suffixes, <replaceable>NAME</replaceable> is expanded by
<function>time.strftime()</function> with the archive cut-off date.
Because it hard-codes the archive name, this option cannot be used when
archiving multiple mailboxes.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-S <replaceable>NUM</replaceable></option></term>
<term><option>--size=<replaceable>NUM</replaceable></option></term>
<listitem><para>Only archive messages that are <replaceable>NUM</replaceable>
bytes or greater.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-n</option></term>
<term><option>--dry-run</option></term>
<listitem><para>
Don't write to any files -- just show what would have been done. This is
useful for testing to see how many messages would have been archived.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-u</option></term>
<term><option>--preserve-unread</option></term>
<listitem><para>
Do not archive any messages that have not yet been read.
<command>archivemail</command> determines if a message in a
<acronym>mbox</acronym>-format or <acronym>MH</acronym>-format mailbox has
been read by looking at the <literal>Status</literal> header (if it exists).
If the status header is equal to <quote><literal>RO</literal></quote> or
<quote><literal>OR</literal></quote> then <command>archivemail</command>
assumes the message has been read.
<command>archivemail</command> determines if a <acronym>maildir</acronym>
message has been read by looking at the filename.
If the filename contains an <quote><literal>S</literal></quote> after
<filename>:2,</filename> then it assumes the message has been read.
</para></listitem>
</varlistentry>
<varlistentry>
<term>
<option>--dont-mangle</option>
</term>
<listitem><para>
Do not mangle lines in message bodies beginning with
<quote><literal>From&nbsp;</literal></quote>.
When archiving a message from a mailbox not in <acronym>mbox</acronym>
format, by default <command>archivemail</command> mangles such lines by
prepending a <quote><literal>&gt;</literal></quote> to them, since mail user
agents might otherwise interpret these lines as message separators.
Messages from <acronym>mbox</acronym> folders are never mangled. See &mbox;
for more information.
</para></listitem>
</varlistentry>
<varlistentry>
<term>
<option>--delete</option>
</term>
<listitem><para>
Delete rather than archive old mail. Use this option with caution!
</para></listitem>
</varlistentry>
<varlistentry>
<term>
<option>--copy</option>
</term>
<listitem><para>
Copy rather than archive old mail.
Creates an archive, but the archived messages are not deleted from the
originating mailbox, which is left unchanged.
This is a complement to the <option>--delete</option> option, and mainly
useful for testing purposes.
Note that multiple passes will create duplicates, since messages are blindly
appended to an existing archive.
</para></listitem>
</varlistentry>
<varlistentry>
<term>
<option>--all</option>
</term>
<listitem><para>
Archive all messages, without distinction.
</para></listitem>
</varlistentry>
<varlistentry>
<term>
<option>--include-flagged</option>
</term>
<listitem><para>
Normally messages that are flagged important are not archived or deleted. If
you specify this option, these messages can be archived or deleted just like
any other message.
</para></listitem>
</varlistentry>
<varlistentry>
<term>
<option>--no-compress</option>
</term>
<listitem><para>
Do not compress any archives.
</para></listitem>
</varlistentry>
<varlistentry>
<term>
<option>--warn-duplicate</option>
</term>
<listitem><para>
Warn about duplicate <literal>Message-ID</literal>s that appear in the input
mailbox.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-v</option></term>
<term><option>--verbose</option></term>
<listitem><para>
Reports lots of extra debugging information about what is going on.
</para></listitem>
</varlistentry>
<varlistentry>
<term>
<option>--debug-imap=<replaceable>NUM</replaceable></option>
</term>
<listitem><para>
Set <acronym>IMAP</acronym> debugging level. This makes
<command>archivemail</command> dump its conversation with the
<acronym>IMAP</acronym> server and some internal <acronym>IMAP</acronym>
processing to <literal>stdout</literal>. Higher values for
<replaceable>NUM</replaceable> give more elaborate output. Set
<replaceable>NUM</replaceable> to 4 to see all exchanged
<acronym>IMAP</acronym> commands. (Actually, <replaceable>NUM</replaceable>
is just passed literally to <literal>imaplib.Debug</literal>.)
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-q</option></term>
<term><option>--quiet</option></term>
<listitem><para>
Turns on quiet mode. Do not print any statistics about how many messages were
archived. This should be used if you are running
<command>archivemail</command> from cron.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-V</option></term>
<term><option>--version</option></term>
<listitem><para>
Display the version of <command>archivemail</command> and exit.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-h</option></term>
<term><option>--help</option></term>
<listitem><para>
Display brief summary information about how to run
<command>archivemail</command>.
</para></listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>
<title>Notes</title>
<para>
<command>archivemail</command> requires &python; version 2.3 or later.
When reading an <acronym>mbox</acronym>-format mailbox,
<command>archivemail</command> will create a lockfile with the extension
<filename class="extension">.lock</filename> so that &procmail; will not
deliver to the mailbox while it is being processed. It will also create an
advisory lock on the mailbox using &lockf;. The archive is locked in the same
way when it is updated.
<command>archivemail</command> will also complain and abort if a 3rd-party
modifies the mailbox while it is being read.
</para>
<para>
<command>archivemail</command> will always attempt to preserve the last-access
and last-modify times of the input mailbox. Archive mailboxes are always
created with a mode of <literal>0600</literal>.
If <command>archivemail</command> finds a pre-existing archive mailbox it will
append rather than overwrite that archive.
<command>archivemail</command> will refuse to operate on mailboxes that are
symbolic links.
</para>
<para>
<command>archivemail</command> attempts to find the delivery date of a message
by looking for valid dates in the following headers, in order of precedence:
<literal>Delivery-date</literal>,
<literal>Received</literal>,
<literal>Resent-Date</literal> and
<literal>Date</literal>.
If it cannot find any valid date in these headers, it will use the
last-modified file timestamp on <acronym>MH</acronym> and
<acronym>Maildir</acronym> format mailboxes, or the date on the
<literal>From_</literal> line on <acronym>mbox</acronym>-format mailboxes.
</para>
<para>
When archiving mailboxes with leading dots in the name,
<command>archivemail</command> will strip the dots off the archive name, so
that the resulting archive file is not hidden.
This is not done if the <option>--prefix</option> or
<option>--archive-name</option> option is used.
Should there really be mailboxes distinguished only by leading dots in the
name, they will thus be archived to the same archive file by default.
</para>
<para>
A conversion from other formats to &mbox; will silently overwrite existing
<literal>Status</literal> and <literal>X-Status</literal> message headers.
</para>
<refsect2>
<title><acronym>IMAP</acronym></title>
<para>
When <command>archivemail</command> processes an <acronym>IMAP</acronym>
folder, all messages in that folder will have their <literal>\Recent</literal>
flag unset, and they will probably not show up as <quote>new</quote> in your
user agent later on.
There is no way around this, it's just how <acronym>IMAP</acronym> works.
This does not apply, however, if you run <command>archivemail</command> with
the options <option>--dry-run</option> or <option>--copy</option>.
</para>
<para>
<command>archivemail</command> relies on server-side searches to determine the
messages that should be archived.
When matching message dates, <acronym>IMAP</acronym> servers refer to server
internal message dates, and these may differ from both delivery time of a
message and its <literal>Date</literal> header.
Also, there exist broken servers which do not implement server side searches.
</para>
<refsect3><title><acronym>IMAP</acronym> <acronym>URL</acronym>s</title>
<para>
<command>archivemail</command>'s <acronym>IMAP</acronym>
<acronym>URL</acronym> parser was written with the <acronym>RFC</acronym> 2882
(<citetitle>Internet Message Format</citetitle>) rules for the
<token>local-part</token> of email addresses in mind.
So, rather than enforcing an <acronym>URL</acronym>-style encoding of
non-<acronym>ascii</acronym> and reserved characters, it allows you to
double-quote the username and password.
If your username or password contains the delimiter characters
<quote>@</quote> or <quote>:</quote>, just quote it like this:
<replaceable>imap://"username@bogus.com":"password"@imap.bogus.com/mailbox</replaceable>.
You can use a backslash to escape double-quotes that are part of a quoted
username or password.
Note that quoting only a substring will not work, and be aware that your shell
will probably remove unprotected quotes or backslashes.
</para>
<para>
Similarly, there is no need to percent-encode non-<acronym>ascii</acronym>
characters in <acronym>IMAP</acronym> mailbox names.
As long as your locale is configured properly, <command>archivemail</command>
should handle these without problems.
Note, however, that due to limitations of the <acronym>IMAP</acronym>
protocol, non-<acronym>ascii</acronym> characters do not mix well with
wildcards in mailbox names.
</para>
<para>
<command>archivemail</command> tries to be smart when handling mailbox paths.
In particular, it will automatically add an <acronym>IMAP</acronym>
<literal>NAMESPACE</literal> prefix to the mailbox path if necessary; and if
you are archiving a subfolder, you can use the slash as a path separator
instead of the <acronym>IMAP</acronym> server's internal representation.
</para>
</refsect3>
</refsect2>
</refsect1>
<refsect1>
<title>Examples</title>
<informalexample>
<para>
To archive all messages in the mailbox <filename>debian-user</filename> that
are older than 180 days to a compressed mailbox called
<filename>debian-user_archive.gz</filename> in the current directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail debian-user</userinput>
</screen>
</para>
</informalexample>
<informalexample>
<para>
To archive all messages in the mailbox <filename>debian-user</filename> that
are older than 180 days to a compressed mailbox called
<filename>debian-user_October_2001.gz</filename> (where the current month and
year is April, 2002) in the current directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --suffix '_%B_%Y' debian-user</userinput>
</screen>
</para>
</informalexample>
<informalexample>
<para>
To archive all messages in the mailbox <filename>cm-melb</filename> that
are older than the first of January 2002 to a compressed mailbox called
<filename>cm-melb_archive.gz</filename> in the current directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --date='1 Jan 2002' cm-melb</userinput>
</screen>
</para>
</informalexample>
<informalexample>
<para>
Exactly the same as the above example, using an <acronym>ISO</acronym> date
format instead:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --date=2002-01-01 cm-melb</userinput>
</screen>
</para>
</informalexample>
<informalexample>
<para>
To delete all messages in the mailbox <filename>spam</filename> that
are older than 30 days:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --delete --days=30 spam</userinput>
</screen>
</para>
</informalexample>
<informalexample>
<para>
To archive all read messages in the mailbox <filename>incoming</filename> that
are older than 180 days to a compressed mailbox called
<filename>incoming_archive.gz</filename> in the current directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --preserve-unread incoming</userinput>
</screen>
</para>
</informalexample>
<informalexample>
<para>
To archive all messages in the mailbox <filename>received</filename> that
are older than 180 days to an uncompressed mailbox called
<filename>received_archive</filename> in the current directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail --no-compress received</userinput>
</screen>
</para>
</informalexample>
<informalexample>
<para>
To archive all mailboxes in the directory <filename>$HOME/Mail</filename>
that are older than 90 days to compressed mailboxes in the
<filename>$HOME/Mail/Archive</filename> directory:
<screen>
<prompt>bash$ </prompt><userinput>archivemail -d90 -o $HOME/Mail/Archive $HOME/Mail/*</userinput>
</screen>
</para>
</informalexample>
<informalexample>
<para>
To archive all mails older than 180 days from the given
<acronym>IMAP</acronym> <literal>INBOX</literal> to a compressed mailbox
<filename>INBOX_archive.gz</filename> in the
<filename>$HOME/Mail/Archive</filename> directory, quoting the password and
reading it from the environment variable <envar>PASSWORD</envar>:
</para>
<!-- i'm open to suggestions how to avoid making such a super-long line here. -->
<screen>
<prompt>bash$ </prompt><userinput>archivemail -o $HOME/Mail/Archive imaps://user:'"'$PASSWORD'"'@example.org/INBOX</userinput>
</screen>
<para>
Note the protected quotes.
</para>
</informalexample>
<informalexample>
<para>
To archive all mails older than 180 days in subfolders of <filename
class="directory">foo</filename> on the given <acronym>IMAP</acronym>
server to corresponding archives in the current working directory, reading the
password from the file <filename>~/imap-pass.txt</filename>:
</para>
<screen>
<prompt>bash$ </prompt><userinput>archivemail --pwfile=~/imap-pass.txt imaps://user@example.org/foo/*</userinput>
</screen>
</informalexample>
</refsect1>
<refsect1>
<title>Tips</title>
<para>
Probably the best way to run <command>archivemail</command> is from your
&crontab; file, using the <option>--quiet</option> option.
Don't forget to try the <option>--dry-run</option> and perhaps the
<option>--copy</option> option for non-destructive testing.
</para>
</refsect1>
<refsect1>
<title>Exit Status</title>
<simpara>Normally the exit status is 0. Nonzero indicates an unexpected error.
</simpara>
</refsect1>
<refsect1>
<title>Bugs</title>
<simpara>
If an <acronym>IMAP</acronym> mailbox path contains slashes, the archive
filename will be derived from the basename of the mailbox.
If the server's folder separator differs from the Unix slash and is used in
the <acronym>IMAP</acronym> <acronym>URL</acronym>, however, the whole path
will be considered the basename of the mailbox.
<abbrev>E.g.</abbrev> the two <acronym>URL</acronym>s
<userinput>imap://user@example.com/folder/subfolder</userinput> and
<userinput>imap://user@example.com/folder.subfolder</userinput> will be
archived in <filename>subfolder_archive.gz</filename> and
<filename>folder.subfolder_archive.gz</filename>, respectively, although they
might refer to the same <acronym>IMAP</acronym> mailbox.
</simpara>
<simpara>
<command>archivemail</command> does not support reading
<acronym>MMDF</acronym> or <acronym>Babyl</acronym>-format mailboxes. In fact,
it will probably think it is reading an <acronym>mbox</acronym>-format mailbox
and cause all sorts of problems.
</simpara>
<simpara>
<command>archivemail</command> is still too slow, but if you are running from
&crontab; you won't care. Archiving <acronym>maildir</acronym>-format
mailboxes should be a lot quicker than <acronym>mbox</acronym>-format
mailboxes since it is less painful for the original mailbox to be
reconstructed after selective message removal.
</simpara>
</refsect1>
<refsect1>
<title>See Also</title>
<simplelist type="inline">
<member>&mbox;</member>
<member>&crontab;</member>
<member>&python;</member>
<member>&procmail;</member>
</simplelist>
</refsect1>
<refsect1>
<title><acronym>Url</acronym></title>
<simpara>The <command>archivemail</command> home page is currently hosted at
<ulink type="http" url="http://archivemail.sourceforge.net">sourceforge</ulink>
</simpara>
</refsect1>
<refsect1>
<title>Author</title>
<simpara> This manual page was written by Paul Rodger &lt;paul at paulrodger
dot com&gt;. Updated and supplemented by Nikolaus Schulz
<email>microschulz@web.de</email></simpara>
</refsect1>
</refentry>

View File

@ -1,40 +0,0 @@
<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
<!ENTITY dbstyle SYSTEM "/usr/share/sgml/docbook/stylesheet/dsssl/modular/html/docbook.dsl" CDATA DSSSL>
]>
<style-sheet>
<style-specification use="docbook">
<style-specification-body>
(define %css-decoration%
; Enable html element decoration with 'style=...' css?
#t)
(define %stylesheet%
; Needed if we want to use a css file
"manpage.css")
(define %shade-verbatim%
;; Should verbatim environments be shaded?
#t)
; Override $refentry-body$ from dbrfntry.dsl
; to add a hr after the refentry title h1.
(define ($refentry-body$)
(let ((id (element-id (current-node))))
(make sequence
(make element gi: "H1"
(make sequence
(make element gi: "A"
attributes: (list (list "NAME" id))
(empty-sosofo))
(element-title-sosofo (current-node))))
; Now add hr element after h1.
(make empty-element gi: "HR")
(process-children))))
</style-specification-body>
</style-specification>
<external-specification id="docbook" document="dbstyle">
</style-sheet>

10
db2html.xsl Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:import href="/usr/share/xml/docbook/stylesheet/nwalsh/html/docbook.xsl"/>
<xsl:param name="html.stylesheet">manpage.css</xsl:param>
<xsl:template name="user.header.content">
<h1>archivemail</h1>
<hr/>
</xsl:template>
</xsl:stylesheet>

29
db2man.xsl Normal file
View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:import href="/usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl"/>
<!-- Use .TP list for the variablelist describing the strtime() directives. -->
<!-- This hack aligns the indented paragraphs horizontally with their -->
<!-- labels. -->
<xsl:template match="variablelist[attribute::id='strftime']/varlistentry">
<xsl:text>.TP&#10;</xsl:text>
<xsl:for-each select="term">
<xsl:variable name="content">
<xsl:apply-templates/>
</xsl:variable>
<xsl:value-of select="normalize-space($content)"/>
<xsl:choose>
<xsl:when test="position() = last()"/> <!-- do nothing -->
<xsl:otherwise>
<!-- * if we have multiple terms in the same varlistentry, generate -->
<!-- * a separator (", " by default) -->
<xsl:value-of select="$variablelist.term.separator"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<xsl:text>&#10;</xsl:text>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>

View File

@ -33,8 +33,8 @@
<hr>
<div id="status">
<strong>Latest version: 0.7.1</strong><br>
Released on 2007-11-07
<strong>Latest version: 0.9.0</strong><br>
Released on 2011-07-09
</div>
<h2>What is it?</h2>
<p>
@ -97,10 +97,10 @@ for <span class="command">archivemail</span>.
To see what has changed in the latest version, check the <a
href="RELNOTES">release notes</a>.
If you want to have a closer look at the current development status, here's the
<a title="changelog in subversion HEAD" href=
"http://archivemail.svn.sourceforge.net/viewvc/archivemail/trunk/CHANGELOG?revision=HEAD&amp;view=markup">
CHANGELOG</a> and the <a title="TODO list in subversion HEAD" href=
"http://archivemail.svn.sourceforge.net/viewvc/archivemail/trunk/TODO?revision=HEAD&amp;view=markup">
<a title="changelog in git HEAD" href=
"http://archivemail.git.sourceforge.net/git/gitweb.cgi?p=archivemail/archivemail;a=blob;f=CHANGELOG;hb=HEAD">
CHANGELOG</a> and the <a title="TODO list in git HEAD" href=
"http://archivemail.git.sourceforge.net/git/gitweb.cgi?p=archivemail/archivemail;a=blob;f=TODO;hb=HEAD">
TODO list</a>, fresh from the repository.
<h2>Where can I get it?</h2>
@ -109,23 +109,23 @@ You can grab the latest version of <span class="command">archivemail</span>
directly from the <a
href="http://sourceforge.net/project/showfiles.php?group_id=49630">archivemail
download area</a> at Sourceforge.
There will hopefully be up-to-date binary RPM packages at the
There should be up-to-date binary RPM packages at the
<a href="http://software.opensuse.org/download/server:/mail/">OpenSUSE build
service</a> for SUSE Linux and Fedora Core 5 soon.
service</a> for SUSE Linux and Fedora Core.
Also, many Linux distributions provide packages; e.g. there is a
<a href="http://packages.debian.org/unstable/archivemail">Debian
package</a>.
<p>
<span class="command">archivemail</span> is written in Python, and hacking it is
easy and fun; you can check out the source from the subversion repository with
easy and fun; you can check out the source from the git repository with
the following command:
<div class="example">
<kbd>svn co https://archivemail.svn.sourceforge.net/svnroot/archivemail/trunk</kbd>
<kbd>git clone git://archivemail.git.sourceforge.net/gitroot/archivemail/archivemail</kbd>
</div>
<p>
See also the short <a href="http://sourceforge.net/svn/?group_id=49630">
introduction to subversion access</a> at sourceforge.
See also the short <a href="http://sourceforge.net/scm/?type=git&amp;group_id=49630">
introduction to git access</a> at sourceforge.
<!-- 2007-11-06: this site has problems, and I cannot read the mentioned article.
<h3>Articles</h3>

View File

@ -3,9 +3,13 @@ h2 {
font-variant: small-caps;
font-size: 170%;
}
.INFORMALEXAMPLE {
.informalexample {
margin-bottom: 1.2em;
}
div.INFORMALEXAMPLE .SCREEN {
div.informalexample .screen {
margin-left: 2ex;
}
a#strftime + dl dt { float: left; margin: 0.3ex 0; width: 1.5em; }
a#strftime + dl dd { float: left; margin: 0.3ex 0; margin-left: 1.2em; width: 90%; }
dt { clear: left; }

View File

@ -20,7 +20,7 @@ check_python_version()
from distutils.core import setup
setup(name="archivemail",
version="0.7.1",
version="0.9.0",
description="archive and compress old email",
license="GNU GPL",
url="http://archivemail.sourceforge.net/",
@ -29,5 +29,5 @@ setup(name="archivemail",
maintainer="Nikolaus Schulz, Peter Poeml",
maintainer_email="nikosch@users.sourceforge.net, poeml@users.sourceforge.net",
scripts=["archivemail"],
data_files=[("man/man1", ["archivemail.1"])],
data_files=[("share/man/man1", ["archivemail.1"])],
)

View File

@ -1,6 +1,4 @@
body {
font-family: "Times New Roman", serif;
font-size: 12pt;
padding: 2%;
line-height: 130%;
margin: 0;
@ -26,9 +24,6 @@ h2 {
padding: 0;
font-size: 150%;
}
pre, tt, kbd, code, pre samp {
font-family: "Courier 10 Pitch", Courier, "Courier New", monospace;
}
img {border: none;}
a {
text-decoration: underline;

1771
test_archivemail Executable file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff