Compare commits
317 Commits
Author | SHA1 | Date |
---|---|---|
![]() |
e1a6028332 | |
![]() |
4346bc5815 | |
![]() |
e3f0440305 | |
![]() |
22d4393cb6 | |
![]() |
09e460555e | |
![]() |
87084b69f0 | |
![]() |
e3f5289e13 | |
![]() |
483a58879f | |
![]() |
1fa57aa577 | |
![]() |
6cb9ba9122 | |
![]() |
14e0929ba2 | |
![]() |
14e5cd6eb1 | |
![]() |
eb07611fae | |
![]() |
f9f9eacd88 | |
![]() |
947be25f82 | |
![]() |
88653766db | |
![]() |
6b0fefc45f | |
![]() |
f6046b9d69 | |
![]() |
39e6a532d0 | |
![]() |
8173caa81d | |
![]() |
4f8171341d | |
![]() |
0e1aace796 | |
![]() |
8190e4807e | |
![]() |
0437ec3e8b | |
![]() |
c2106bdda1 | |
![]() |
f6be896b1f | |
![]() |
ea0d95e121 | |
![]() |
7ee2555cc2 | |
![]() |
393f08bb2e | |
![]() |
ad4c4b9642 | |
![]() |
a08cde18fb | |
![]() |
77a2856e48 | |
![]() |
45f82b7218 | |
![]() |
eb8bc7a4ec | |
![]() |
b7091e90ea | |
![]() |
945c4bb28e | |
![]() |
40a5e6a9f9 | |
![]() |
5d5408dcd2 | |
![]() |
5fb60dd522 | |
![]() |
8d01846e3f | |
![]() |
f08403c99b | |
![]() |
910b507a2d | |
![]() |
ca80e185e6 | |
![]() |
3a6e4072b0 | |
![]() |
3a9a5cd4b8 | |
![]() |
04bf8eaa23 | |
![]() |
0921a1c91a | |
![]() |
40ba265fde | |
![]() |
f1f34ca46e | |
![]() |
67f23e1af4 | |
![]() |
b6bc92c34f | |
![]() |
f22fe4decd | |
![]() |
d99b4b4414 | |
![]() |
e9446e2fc4 | |
![]() |
eadedf27d0 | |
![]() |
71485f2469 | |
![]() |
db8eb62c16 | |
![]() |
6813e21d54 | |
![]() |
1c412524f2 | |
![]() |
03932a8cb2 | |
![]() |
280113982f | |
![]() |
a102b5baf9 | |
![]() |
b47cc46fbf | |
![]() |
febd030e14 | |
![]() |
a04226580b | |
![]() |
89cff1807c | |
![]() |
0eddfe7357 | |
![]() |
af3bb16a4c | |
![]() |
368f312e2d | |
![]() |
2ce89ef508 | |
![]() |
7058290c2e | |
![]() |
0dfae37e04 | |
![]() |
78c4c6e3da | |
![]() |
d845ab862e | |
![]() |
584918b265 | |
![]() |
9ff7774aba | |
![]() |
e5ee9b98c1 | |
![]() |
7269c32734 | |
![]() |
80b3483439 | |
![]() |
2d15728c2d | |
![]() |
dcf849afeb | |
![]() |
573f2b9358 | |
![]() |
4fb833176e | |
![]() |
2b7baaf294 | |
![]() |
0f2b04ff89 | |
![]() |
b9b2174c45 | |
![]() |
86471d12a4 | |
![]() |
da595427ff | |
![]() |
1db28f2b04 | |
![]() |
40f9a4c049 | |
![]() |
f031573071 | |
![]() |
11103e2de2 | |
![]() |
d706409c59 | |
![]() |
d726589414 | |
![]() |
c6e462fef0 | |
![]() |
84f42ead36 | |
![]() |
512130df02 | |
![]() |
03bfb88d30 | |
![]() |
41da26b655 | |
![]() |
6d2e23ac80 | |
![]() |
8ec8a00ffa | |
![]() |
0ca3f6ceee | |
![]() |
bf99c6b69d | |
![]() |
232b2256c2 | |
![]() |
573cbbce91 | |
![]() |
e9d2284a07 | |
![]() |
8476dcd18f | |
![]() |
8f58deef5c | |
![]() |
f80e709f7e | |
![]() |
8c6f4b99c1 | |
![]() |
9d9f13a440 | |
![]() |
54821151e4 | |
![]() |
a7414319c9 | |
![]() |
b37b3d627e | |
![]() |
d6a161cd9e | |
![]() |
df680c19be | |
![]() |
37f96c1c84 | |
![]() |
a78af4c0ff | |
![]() |
ba8928d279 | |
![]() |
223e2f9802 | |
![]() |
aee4df2fcf | |
![]() |
2e0f3cd3aa | |
![]() |
79bcf86860 | |
![]() |
a3276f8c68 | |
![]() |
cd07a2663e | |
![]() |
bd85cffe37 | |
![]() |
9574c4f41c | |
![]() |
c6cb0b4612 | |
![]() |
415e055a6e | |
![]() |
622c0105ea | |
![]() |
775952ec98 | |
![]() |
681fd0c527 | |
![]() |
e5b6397dd5 | |
![]() |
78b4923832 | |
![]() |
37816fd659 | |
![]() |
bfff00e395 | |
![]() |
07219ff14b | |
![]() |
26ab4611ec | |
![]() |
efe02ea32a | |
![]() |
bc5c3d5e45 | |
![]() |
a9215463c4 | |
![]() |
f43cbb106d | |
![]() |
2719645f2c | |
![]() |
9ac3a68228 | |
![]() |
c0f0ad33d7 | |
![]() |
22e23d9d38 | |
![]() |
f6f7903f58 | |
![]() |
afa61f8597 | |
![]() |
704d5a961e | |
![]() |
6abf732d2e | |
![]() |
533628c2fc | |
![]() |
1fcd5b7292 | |
![]() |
77481169d8 | |
![]() |
ce02aba226 | |
![]() |
8e5c870057 | |
![]() |
4584dffe14 | |
![]() |
5178c956bc | |
![]() |
d9ffaf4a3b | |
![]() |
ead112daba | |
![]() |
0ae7edab86 | |
![]() |
8cc36126ec | |
![]() |
f1784f3093 | |
![]() |
e0c75a1001 | |
![]() |
5db3d2fe63 | |
![]() |
c19a9873b0 | |
![]() |
796f60f8c8 | |
![]() |
c4841fe4cd | |
![]() |
4b64da911e | |
![]() |
adf6515746 | |
![]() |
9439e1fa8a | |
![]() |
11ebc2e011 | |
![]() |
5b72c8287c | |
![]() |
d5cb3dad61 | |
![]() |
8596d68092 | |
![]() |
f47de26676 | |
![]() |
fbb00e08f4 | |
![]() |
1e5cb090e7 | |
![]() |
bcb01613d0 | |
![]() |
d57987be04 | |
![]() |
2d608bffe7 | |
![]() |
5f929f6697 | |
![]() |
54fbaf5844 | |
![]() |
61d0e803c6 | |
![]() |
372b45d7b0 | |
![]() |
75e3ae94a9 | |
![]() |
373695a64d | |
![]() |
204893eeab | |
![]() |
5abff64e5a | |
![]() |
4bbc0216ef | |
![]() |
b10c66aa35 | |
![]() |
9e8649cb92 | |
![]() |
ab0f6dbf98 | |
![]() |
fe773d4822 | |
![]() |
3fd26dcb45 | |
![]() |
f582fd75c9 | |
![]() |
3f5f591728 | |
![]() |
be4aabc20f | |
![]() |
74c871644e | |
![]() |
c0552fcd06 | |
![]() |
3e0288e21b | |
![]() |
b40da3124a | |
![]() |
aae08fe3fb | |
![]() |
59e9715021 | |
![]() |
e25367fcb8 | |
![]() |
c5002cdefb | |
![]() |
c97b10f253 | |
![]() |
b2f94206b1 | |
![]() |
dfec62850e | |
![]() |
3ee105d766 | |
![]() |
a1641450ed | |
![]() |
bcb00dbbed | |
![]() |
3240b24d9f | |
![]() |
0eba452d93 | |
![]() |
130a5ef117 | |
![]() |
82e3be1987 | |
![]() |
6ea7c7d810 | |
![]() |
9e70e576af | |
![]() |
1d89f59b53 | |
![]() |
6d2d1fba44 | |
![]() |
9b7768e073 | |
![]() |
d566d6c8f3 | |
![]() |
b40728e740 | |
![]() |
8e73e315e4 | |
![]() |
b07a4cfbf3 | |
![]() |
256492039a | |
![]() |
f3719df4d2 | |
![]() |
0e9ae1d91b | |
![]() |
1493a22f38 | |
![]() |
255a475978 | |
![]() |
c67a75c2f7 | |
![]() |
8abd70093f | |
![]() |
ef97390118 | |
![]() |
32ecf02025 | |
![]() |
faa68b2048 | |
![]() |
8de4715e5c | |
![]() |
58f67ff286 | |
![]() |
0278901ba1 | |
![]() |
cb48d392fa | |
![]() |
46f9aa44a9 | |
![]() |
810dea1bf5 | |
![]() |
3d8a1bda89 | |
![]() |
89e6683334 | |
![]() |
c7d074abde | |
![]() |
d79da0ae99 | |
![]() |
c5f194f3ec | |
![]() |
e872f2211e | |
![]() |
bea6ef6390 | |
![]() |
86f1fec50d | |
![]() |
e9a11944f1 | |
![]() |
7a2e1b7c69 | |
![]() |
f9965b8e23 | |
![]() |
b3dc8a006e | |
![]() |
dcd37f6466 | |
![]() |
9549c3e29d | |
![]() |
0b40278a78 | |
![]() |
a221f62f52 | |
![]() |
697c22daac | |
![]() |
700bce69b4 | |
![]() |
daed56f0c5 | |
![]() |
a8e76ead22 | |
![]() |
93015a6d84 | |
![]() |
99cfab1f4e | |
![]() |
2dbd3c1940 | |
![]() |
e78b33e115 | |
![]() |
bd2f65d0af | |
![]() |
5eb4cf3cf6 | |
![]() |
e491da3a11 | |
![]() |
0a666a10a6 | |
![]() |
7ae1b7bb3f | |
![]() |
ee45d946ed | |
![]() |
06d158c576 | |
![]() |
157db85b7f | |
![]() |
39f1d23993 | |
![]() |
3c0939a3ef | |
![]() |
f4c6017d32 | |
![]() |
ae5e5f63a1 | |
![]() |
334d1ef9f1 | |
![]() |
031c6aea7c | |
![]() |
3354e35ec9 | |
![]() |
a121b1c1d3 | |
![]() |
eb2b4a64f9 | |
![]() |
4c04117de8 | |
![]() |
d0a209fa7a | |
![]() |
d631079250 | |
![]() |
b682b26398 | |
![]() |
6198341eef | |
![]() |
88ef628f20 | |
![]() |
a0994e6a57 | |
![]() |
539894ced4 | |
![]() |
800a957b59 | |
![]() |
27ca6547c5 | |
![]() |
b8b64804c9 | |
![]() |
ab28001c84 | |
![]() |
931c2118f3 | |
![]() |
a6ff806d2a | |
![]() |
6895571d3b | |
![]() |
a8fd65eb5a | |
![]() |
f302156d41 | |
![]() |
874f325330 | |
![]() |
74922b1beb | |
![]() |
dbe3c9ce4b | |
![]() |
140596178c | |
![]() |
8d5b36dc3a | |
![]() |
dc023db895 | |
![]() |
8f47290956 | |
![]() |
75506d9be2 | |
![]() |
83ac69d0f8 | |
![]() |
933aa18259 | |
![]() |
e00581acb2 | |
![]() |
adfb7a63d7 | |
![]() |
07aca153f6 | |
![]() |
a91b2064cb | |
![]() |
05c599028e | |
![]() |
64d87da307 | |
![]() |
60f119d64a | |
![]() |
9d08aca3b9 | |
![]() |
799f4affcd |
|
@ -1,5 +0,0 @@
|
|||
archivemail.1
|
||||
archivemail.html
|
||||
build
|
||||
dist
|
||||
*.pyc
|
|
@ -0,0 +1,3 @@
|
|||
/archivemail.1
|
||||
/archivemail.html
|
||||
/MANIFEST
|
195
CHANGELOG
195
CHANGELOG
|
@ -1,3 +1,198 @@
|
|||
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.
|
||||
Closes: #1670422
|
||||
* 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.
|
||||
Closes: #1640878
|
||||
* Invalid messages/files in Maildirs caused archivemail to silently stop
|
||||
processing mails and claim it's all done. Now skip these and go ahead.
|
||||
(Thanks Elan Ruusamäe for tracking this down.) Closes: #1783369.
|
||||
(The Debian package has a different fix for this problem since 0.6.1-4,
|
||||
closing Debian bugs #255944 and #305902.)
|
||||
* Fixed IMAP message flag conversion which was completely broken. (Thanks
|
||||
Christian Brabandt) Closes: Debian bug #434807
|
||||
* New option --copy: archive mail, but don't delete it from the mailbox.
|
||||
This is mainly useful for testing purposes, and complements --delete.
|
||||
Closes: #981865, #988803, #1764851, Debian bug #434798
|
||||
* If running as root, only switch the effective uid and gid back if we have
|
||||
actually switched them before. Closes: #1762907
|
||||
* The automatic seteuid feature of archivemail is insecure and thus
|
||||
deprecated; it will be removed from later versions.
|
||||
* Expand tilde in argument of long option --pwfile. (Thanks Christian
|
||||
Brabandt) Closes: Debian bug #434813
|
||||
* archivemail now accepts --days=0
|
||||
* Fixed crash if --warn-duplicate is used with IMAP (Thanks Christian
|
||||
Brabandt) Closes: Debian bug #434786 (the Debian package already has a fix)
|
||||
* 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.
|
||||
* 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. Closes: #1826757, Debian bug #368112
|
||||
|
||||
Version 0.7.0 - 2 November 2006
|
||||
* Fixed long options --filter-append and --pwfile to accept their arguments.
|
||||
Closes: #1555935
|
||||
* Fixed From_ line generation to actually look for the 'Return-path' and
|
||||
'From' headers. Closes: #1555797
|
||||
* Fixed IMAP authentication/URL parsing, which wasn't working at all in
|
||||
v0.6.2. Require username encoded in URL, but be flexible with the password:
|
||||
handle both --pwfile and URL-encoded password, and fallback to querying the
|
||||
user if neither is present. Closes: #1555951
|
||||
* Convert on-the-wire CRLF to native EOL when saving messages from an IMAP
|
||||
folder. Closes: #1555803
|
||||
* Updated man page. This also addresses #1555951
|
||||
* Fixed unittest failure by updating --suffix testcase. Based on analysis by
|
||||
Peter Poeml. Thanks, Peter.
|
||||
* Fixed invalid IMAP filter string for large messages (--size option).
|
||||
(Thanks to the anonymous bug reporter) Closes: #863813
|
||||
* Fixed IMAP --dry-run so it doesn't download all messages that would be
|
||||
archived.
|
||||
* Fixed IMAP --delete which didn't work at all. (Thanks Anand)
|
||||
Closes: Debian bug #203282
|
||||
* Terminate each message in newly written mbox with an empty line if the
|
||||
message source is not an mbox-format folder. (Thanks Chung-chieh Shan)
|
||||
Closes: Debian bug #250410
|
||||
* Mangle From_ in message body if the message source is not an mbox-format
|
||||
folder. (Thanks Chung-chieh Shan) Closes: Debian bug #250402
|
||||
* Added new option --dont-mangle to turn off From_ mangling.
|
||||
* Bumped Python dependency to version 2.3.
|
||||
* Fixed unittest TestMboxExclusiveLock which failed on Solaris. (Thanks Paul
|
||||
Rodger) Closes: #904652
|
||||
* Fixed unsafe creation of temporary files in the test suite.
|
||||
This addresses Debian bug #385253, and reading the BTS log, it seems this
|
||||
issue was assigned CVE-2006-4245, although I cannot find any further
|
||||
reference to that CVE. Note that the bug was initially reported to affect
|
||||
archivemail itself, too. This is not correct. (Thanks Joey Hess)
|
||||
Closes: Debian bug #385253
|
||||
* Fixed cleanup of temporary files after test suite failures.
|
||||
* Fixed dotlocking race condition.
|
||||
* Stats are now working with IMAP.
|
||||
* Stats now report the total size of a mailbox and of the archived messages
|
||||
therefrom.
|
||||
* Always barf if the archive destination directory is world-writable.
|
||||
* Distributing man page with the tarball again and fixed distutils setup.
|
||||
Closes: #1574720 (Thanks Grant Goodyear)
|
||||
* Improved IMAP error reporting
|
||||
|
||||
Version 0.6.2 - 27 June 2006
|
||||
* add -F/--filter-append option to append an arbitrary string to the IMAP
|
||||
filter string
|
||||
* don't delete more than a certain number of messages at a time. The max
|
||||
command len is limited. Fixes bug 942403 (Archiving large IMAP folders fails)
|
||||
* IMAP: try CRAM-MD5 login first, if that fails fallback to plain login
|
||||
* add SSL support per imaps URL (after patch by Tobias Gruetzmacher)
|
||||
* add -P/--pwfile option to supply the IMAP password, so it does not end up in
|
||||
the shell history
|
||||
* Fix SyntaxWarning: assignment to None (bug #843890)
|
||||
* Use the archive cut date rather than the actual time with the --suffix
|
||||
option. (Thanks Manuel Estrada Sainz)
|
||||
|
||||
Version 0.6.1 - 31 October 2002
|
||||
* Removed a test rule that we could archive messages older than the
|
||||
Unix epoch. Newer versions of python now give an overflow error calling
|
||||
mktime() on dates < 1970 instead of returning a negative number.
|
||||
|
||||
Version 0.6.0 - 3 October 2002
|
||||
* Added IMAP mailbox support. (Thanks Mark Roach)
|
||||
|
|
7
FAQ
7
FAQ
|
@ -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?
|
||||
-------------------------------------------------------------------------
|
||||
|
|
12
MANIFEST
12
MANIFEST
|
@ -1,12 +0,0 @@
|
|||
CHANGELOG
|
||||
COPYING
|
||||
FAQ
|
||||
MANIFEST
|
||||
README
|
||||
TODO
|
||||
archivemail
|
||||
archivemail.1
|
||||
archivemail.sgml
|
||||
examples/archivemail_all
|
||||
setup.py
|
||||
test_archivemail.py
|
|
@ -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
|
50
Makefile
50
Makefile
|
@ -1,49 +1,43 @@
|
|||
|
||||
VERSION=0.6.0
|
||||
VERSION=$(shell python setup.py --version)
|
||||
VERSION_TAG=v$(subst .,_,$(VERSION))
|
||||
TARFILE=archivemail-$(VERSION).tar.gz
|
||||
|
||||
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
|
||||
rm -f $(HTDOCS).tgz
|
||||
|
||||
|
||||
sdist: clobber doc
|
||||
cp archivemail.py archivemail
|
||||
fakeroot python setup.py sdist
|
||||
rm archivemail
|
||||
|
||||
bdist_rpm: clobber doc
|
||||
cp archivemail.py archivemail
|
||||
fakeroot python setup.py bdist_rpm
|
||||
rm archivemail
|
||||
python setup.py sdist
|
||||
|
||||
tag:
|
||||
cvs tag -F current
|
||||
cvs tag -F $(VERSION_TAG)
|
||||
|
||||
upload:
|
||||
(cd dist && lftp -c 'open upload.sf.net && cd incoming && put $(TARFILE)')
|
||||
git tag -a $(VERSION_TAG)
|
||||
|
||||
doc: archivemail.1 archivemail.html
|
||||
|
||||
archivemail.1: archivemail.sgml
|
||||
docbook2man archivemail.sgml
|
||||
chmod 644 archivemail.1
|
||||
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.html: archivemail.sgml
|
||||
jade -t sgml \
|
||||
-d /usr/lib/sgml/stylesheet/dsssl/docbook/nwalsh/html/docbook.dsl \
|
||||
-o archivemail.html \
|
||||
archivemail.sgml
|
||||
mv r1.html archivemail.html
|
||||
chmod 644 archivemail.html
|
||||
archivemail.1: archivemail.xml db2man.xsl
|
||||
xsltproc db2man.xsl archivemail.xml
|
||||
|
||||
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
|
||||
|
|
|
@ -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. ;)
|
||||
|
35
README
35
README
|
@ -25,36 +25,17 @@ by an absolute date or only archive unread messages.
|
|||
|
||||
REQUIREMENTS:
|
||||
|
||||
archivemail requires python version 2.0 or later, with the optional 'zlib'
|
||||
module, although the zlib module comes with most python installations. If you
|
||||
are compiling your own version of python < version 2.2, make sure you
|
||||
uncomment the 'zlib' moduile in Modules/Setup in the python source directory.
|
||||
|
||||
You can check to see if your version of python has the 'zlib' module by
|
||||
trying this:
|
||||
|
||||
flare:~$ python
|
||||
Python 2.1 (#1, Apr 26 2002, 11:22:45)
|
||||
[GCC 2.95.2 20000220 (Debian GNU/Linux)] on linux2
|
||||
Type "copyright", "credits" or "license" for more information.
|
||||
>>> import zlib
|
||||
>>>
|
||||
|
||||
If you get an ImportError, then the zlib python module has not been installed.
|
||||
Try upgrading your python distribution.
|
||||
archivemail requires python version 2.3. It also uses some optional python
|
||||
modules, but these should be pretty much standard; if you get an ImportError
|
||||
nonetheless, please report it, thanks. (For contact addresses see below.)
|
||||
|
||||
Python is available from http://www.python.org/
|
||||
|
||||
If you want to run the bundled test script, you will need python version 2.1
|
||||
or later, because we use the PyUnit 'unittest' module. Sorry.
|
||||
|
||||
|
||||
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
|
||||
|
@ -72,7 +53,11 @@ cron.
|
|||
The archivemail website is at: http://archivemail.sourceforge.net/
|
||||
|
||||
If you have any feedback or bug reports about archivemail, you are very
|
||||
welcome to email me.
|
||||
welcome to email the maintainers; as of November 2006, these are:
|
||||
|
||||
Nikolaus Schulz <microschulz@web.de>
|
||||
Peter Poeml <poeml@suse.de>
|
||||
|
||||
|
||||
-- Paul Rodger <paul at paulrodger dot com>
|
||||
-- Paul Rodger <paul at paulrodger dot com>, archivemail author
|
||||
Updated by: Nikolaus Schulz, maintainer
|
||||
|
|
122
TODO
122
TODO
|
@ -1,23 +1,103 @@
|
|||
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.
|
||||
|
||||
Goals for next minor release
|
||||
-------------------------------------
|
||||
* 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)
|
||||
* 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)
|
||||
Gracefully close IMAP connection upon unexptected error (currently archivemail
|
||||
just terminates).
|
||||
|
||||
Longer Term goals:
|
||||
------------------
|
||||
* Add an option to not cut threads.
|
||||
* Add MMDF mailbox support
|
||||
* Add Babyl mailbox support
|
||||
* Add option to archive depending on mailbox size threshold
|
||||
- is this a good idea?
|
||||
* Add option to archive depending on number of messages
|
||||
- is this a good idea?
|
||||
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
|
||||
are mapped like this:
|
||||
|
||||
IMAP URL | resulting mbox_archive
|
||||
------------+------------------------
|
||||
test.box | test.box_archive.gz
|
||||
test/box | box_archive.gz
|
||||
|
||||
|
||||
Implement --include-draft. But before, think about it again. (This is feature
|
||||
request #1569305.)
|
||||
|
||||
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"). 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?
|
||||
|
||||
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.
|
||||
|
||||
Reject patch #1036022 "Added option to inverse date compare" after cooling down
|
||||
because the patch is both stupid (copy+paste code) and broken. Don't see why
|
||||
anyone should want this/we should support it.
|
||||
If this is reasonable *at all*, I think we'd better go for all the complexity
|
||||
to honour _two_ cut off dates (see Debian bug "#184124: archivemail: -D and -d
|
||||
should not be incompatible", which is a comparably half-baken thought). </rant>
|
||||
|
||||
Add --debug or -vv switch, and move the printing of diagnostic info for each
|
||||
message to --debug.
|
||||
|
||||
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.
|
||||
|
||||
Be a nicer citizen with respect to mailbox locking.
|
||||
|
||||
Perhaps prune/shorten IMAP mailbox URLs in messages?
|
||||
They may be quite long and may contain the sensitive password.
|
||||
Also shows up in the process list...
|
||||
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.
|
||||
|
||||
Check all items below, which are from the original author. :-)
|
||||
|
||||
.archivemailrc support
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
Add an option to not cut threads.
|
||||
|
||||
Add MMDF mailbox support
|
||||
|
||||
Add Babyl mailbox support
|
||||
|
||||
Add option to archive depending on mailbox size threshold
|
||||
- is this a good idea?
|
||||
|
||||
Add option to archive depending on number of messages
|
||||
- is this a good idea?
|
||||
|
|
File diff suppressed because it is too large
Load Diff
1298
archivemail.py
1298
archivemail.py
File diff suppressed because it is too large
Load Diff
488
archivemail.sgml
488
archivemail.sgml
|
@ -1,488 +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>">
|
||||
]>
|
||||
|
||||
<RefEntry>
|
||||
|
||||
<DocInfo><Date>12 April 2002</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>
|
||||
<Command/archivemail/ is a tool written in &python; for archiving and
|
||||
compressing old email in mailboxes.
|
||||
</Para>
|
||||
|
||||
<Para>
|
||||
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
|
||||
<application/mbox/-format mailbox in the same directory that is compressed
|
||||
with &gzip;.
|
||||
</Para>
|
||||
|
||||
<Para>
|
||||
<Command/archivemail/ supports reading <application/IMAP/,
|
||||
<application/Maildir/, <application/MH/ and <application/mbox/-format
|
||||
mailboxes, but it will always write archive files to <application/mbox/-format
|
||||
mailboxes that are compressed with &gzip;.
|
||||
</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.
|
||||
</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>
|
||||
|
||||
<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 current
|
||||
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>--delete</Option>
|
||||
</Term>
|
||||
<ListItem><Para>
|
||||
Delete rather than archive old mail. Use this option with caution!
|
||||
</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 using &gzip;.
|
||||
</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.0 or later.
|
||||
</Para>
|
||||
|
||||
<Para>
|
||||
To archive an <application/IMAP/-format mailbox, use the the format
|
||||
<command>imap://username:password@server/mailbox</command> to specify the
|
||||
mailbox.
|
||||
</Para>
|
||||
|
||||
<Para>
|
||||
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/.
|
||||
</Para>
|
||||
|
||||
<Para>
|
||||
If <Command/archivemail/ finds a pre-existing archive mailbox it
|
||||
will append rather than overwrite that archive.
|
||||
</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>
|
||||
<Command/archivemail/ will refuse to operate on mailboxes that are symbolic
|
||||
links or create tempfiles or archives in world-writable directories.
|
||||
</Para>
|
||||
|
||||
</RefSect1>
|
||||
|
||||
<RefSect1>
|
||||
<Title>Examples</Title>
|
||||
|
||||
<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>
|
||||
|
||||
<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_April_2002.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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
</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.
|
||||
</Para>
|
||||
|
||||
<Para>
|
||||
Don't forget to try the <Option>--dry-run</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>
|
||||
There is no support yet for reading <application/MMDF/ or
|
||||
<application/Babyl/-format mailboxes. In fact, <Command/archivemail/ 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>Paul Rodger <paul at paulrodger dot com></SimPara>
|
||||
</RefSect1>
|
||||
|
||||
</RefEntry>
|
|
@ -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 </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>></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 <paul at paulrodger
|
||||
dot com>. Updated and supplemented by Nikolaus Schulz
|
||||
<email>microschulz@web.de</email></simpara>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
|
@ -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>
|
|
@ -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 </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> </xsl:text>
|
||||
<xsl:apply-templates/>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
|
@ -0,0 +1,192 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-type"
|
||||
content="text/html;charset=us-ascii">
|
||||
<title>archivemail – a tool for archiving and compressing old email</title>
|
||||
<link title="archivemail style" rel=stylesheet href="style.css"
|
||||
type="text/css">
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
.command {font-weight: bold;}
|
||||
.example {
|
||||
/*background-color: #e0e0e0;*/
|
||||
padding: 0 2em;
|
||||
}
|
||||
#status {
|
||||
float: right;
|
||||
width: 10em
|
||||
margin-left: 4em;
|
||||
margin-top: 1.3em;
|
||||
padding: 3ex;
|
||||
border: 1px solid #777777;
|
||||
line-height: 160%;
|
||||
}
|
||||
/*span.mail {text-decoration: underline;}*/
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>archivemail</h1>
|
||||
|
||||
<hr>
|
||||
<div id="status">
|
||||
<strong>Latest version: 0.9.0</strong><br>
|
||||
Released on 2011-07-09
|
||||
</div>
|
||||
<h2>What is it?</h2>
|
||||
<p>
|
||||
<span class="command">archivemail</span> is a tool for archiving and compressing
|
||||
old email in mailboxes.
|
||||
It moves messages older than the specified number of
|
||||
days to a separate <a title="mbox(5) man page"
|
||||
href="http://www.qmail.org/man/man5/mbox.html">mbox format</a> mailbox that is
|
||||
compressed with <span class="command">gzip</span>.
|
||||
It can also just delete old email rather than archive it.
|
||||
|
||||
<h2>What can it do for me?</h2>
|
||||
<p>
|
||||
Maybe some of your mailboxes are quite large (eg, over 10,000 messages) and
|
||||
they are taking a while to load in your mail reader. Perhaps they are taking
|
||||
up too much space on your disk. Archiving old messages to a separate,
|
||||
compressed mailbox will mean:
|
||||
<ol>
|
||||
<li>Your mail reader will get a huge performance boost loading and reading
|
||||
your mail.
|
||||
<li>You will be taking up less disk space, since old mail will be compressed.
|
||||
(Mail usually compresses quite nicely.)
|
||||
<li>You won't be confronted with semi-obsolete mail all the time.
|
||||
</ol>
|
||||
<p>
|
||||
You can also use <span class="command">archivemail</span> as a simple backup
|
||||
tool.
|
||||
|
||||
<h2>Features overview</h2>
|
||||
<ul>
|
||||
<li>Supports archiving
|
||||
<a title="about IMAP" href="http://www.imap.org/">IMAP</a>,
|
||||
<a title="mbox(5) man page" href="http://www.qmail.org/man/man5/mbox.html">mbox</a>,
|
||||
<a title="MH FAQ" href="http://www.faqs.org/faqs/mail/mh-faq/">MH</a> and
|
||||
<a title="maildir(5) man page"
|
||||
href="http://www.qmail.org/man/man5/maildir.html">Maildir</a> format
|
||||
mailboxes.
|
||||
<li>Old mail can be either archived or just deleted.
|
||||
<li>The age in days that is considered old is configurable – it defaults
|
||||
to 180 days.
|
||||
You can also set an absolute limit date.
|
||||
<li>Messages that are flagged important are not archived or deleted unless
|
||||
explicitely requested.
|
||||
<!--<li>You can specify an option so that unread mail is never archived.-->
|
||||
<li>Can be configured to preserve unread mail.
|
||||
<li>Can be configured to only archive messages over a given byte size.
|
||||
<li>Stores the compressed archive mailboxes in a directory of
|
||||
your choice, with an extension of your choice.
|
||||
<li>Easy read-only testing, not touching your valuable data.
|
||||
<li>Supports IMAPS/SSL.
|
||||
<li>When archiving IMAP mailboxes, the message selection can be refined by
|
||||
extending the underlying IMAP <code>SEARCH</code> command with arbitrary
|
||||
search keys (you will have to cope with the raw IMAP protocol, though).
|
||||
</ul>
|
||||
|
||||
<h2>Documentation</h2>
|
||||
<p>
|
||||
The <a href="manpage.html">archivemail manpage</a> is the primary documentation
|
||||
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 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>
|
||||
<p>
|
||||
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 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.
|
||||
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 git repository with
|
||||
the following command:
|
||||
<div class="example">
|
||||
<kbd>git clone git://archivemail.git.sourceforge.net/gitroot/archivemail/archivemail</kbd>
|
||||
</div>
|
||||
<p>
|
||||
See also the short <a href="http://sourceforge.net/scm/?type=git&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>
|
||||
<p>
|
||||
Emmanuel Seyman wrote an
|
||||
<a href="http://muttfr.org/gen.php3/2002/11/20/108,1,0,0,1.php3">article
|
||||
about archivemail</a> for <a href="http://www.muttfr.org/">muttfr.org</a>, a
|
||||
French website about <a href="http://www.mutt.org/">mutt</a>.
|
||||
-->
|
||||
|
||||
<h2>Getting involved</h2>
|
||||
<ul>
|
||||
<li>Visit the <a
|
||||
href="http://sourceforge.net/tracker/?group_id=49630">archivemail
|
||||
tracker</a> to browse and/or submit bug reports and feature requests.
|
||||
<li>You can subscribe to the <a
|
||||
href="http://lists.sourceforge.net/lists/listinfo/archivemail-user">archivemail-user
|
||||
mailing list</a>.
|
||||
This is a low traffic, subscribers-only list.
|
||||
<li>Check out the <a href="http://sourceforge.net/projects/archivemail/">project page
|
||||
for archivemail</a> at Sourceforge for a general overview.
|
||||
</ul>
|
||||
|
||||
<h2>Requirements</h2>
|
||||
<p>
|
||||
<span class="command">archivemail</span> requires Python 2.3 or newer.
|
||||
It also uses some optional python modules, but these should be pretty much
|
||||
standard; if you get an ImportError nonetheless, please
|
||||
<a title="jump to the archivemail tracker"
|
||||
href="http://sourceforge.net/tracker/?group_id=49630">report it</a>, thanks.
|
||||
|
||||
<h2>License</h2>
|
||||
<p>
|
||||
This software is licensed under the terms of the
|
||||
<a href="http://www.gnu.org/licenses/licenses.html#GPL">GNU GPL</a>, either
|
||||
version 2 of the license, or any later version.
|
||||
|
||||
<h2>Credits</h2>
|
||||
<p>
|
||||
<span class="command">archivemail</span> was written by Paul Rodger
|
||||
<code><paul <em>at</em> paulrodger <em>dot</em>
|
||||
com></code>
|
||||
and is currently maintained by Peter Poeml <code><poeml
|
||||
<em>at</em> suse <em>dot</em> de></code>, Nikolaus Schulz <code><a href=
|
||||
"mailto:microschulz@web.de"><microschulz@web.de></a></code>
|
||||
and Brandon Knitter.
|
||||
|
||||
<hr>
|
||||
<p>
|
||||
<!-- sourceforge logo start -->
|
||||
<a href="http://sourceforge.net">
|
||||
<!-- white: -->
|
||||
<img src="http://sflogo.sourceforge.net/sflogo.php?group_id=49630&type=2"
|
||||
width="125" height="37"
|
||||
alt="SourceForge.net Logo">
|
||||
<!-- blue:
|
||||
<img src="http://sflogo.sourceforge.net/sflogo.php?group_id=49630&type=4"
|
||||
width="125" height="37"
|
||||
alt="SourceForge.net Logo">
|
||||
-->
|
||||
</a>
|
||||
<!-- sourceforge logo end -->
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,15 @@
|
|||
@import "style.css";
|
||||
h2 {
|
||||
font-variant: small-caps;
|
||||
font-size: 170%;
|
||||
}
|
||||
.informalexample {
|
||||
margin-bottom: 1.2em;
|
||||
}
|
||||
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; }
|
9
setup.py
9
setup.py
|
@ -15,16 +15,19 @@ Your version of python is: %s""" % sys.version
|
|||
print too_old_error
|
||||
sys.exit(1)
|
||||
|
||||
check_python_version() # define & run this early - 'distutils.core' is new
|
||||
# define & run this early - 'distutils.core' requires Python >= 2.0
|
||||
check_python_version()
|
||||
from distutils.core import setup
|
||||
|
||||
setup(name="archivemail",
|
||||
version="0.6.0",
|
||||
version="0.9.0",
|
||||
description="archive and compress old email",
|
||||
license="GNU GPL",
|
||||
url="http://archivemail.sourceforge.net/",
|
||||
author="Paul Rodger",
|
||||
author_email="paul@paulrodger.com",
|
||||
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"])],
|
||||
)
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
body {
|
||||
padding: 2%;
|
||||
line-height: 130%;
|
||||
margin: 0;
|
||||
/*color: #036;*/
|
||||
}
|
||||
h1 {
|
||||
font-size: 220%;
|
||||
font-weight: bold;
|
||||
padding: 0 0 0.4em 0.1em;
|
||||
/*margin: 0 0 0.5em 0; */
|
||||
margin: 0;
|
||||
/*border-bottom: 2px solid black;*/
|
||||
}
|
||||
hr {
|
||||
border: 1px #b8b8b8 solid;
|
||||
}
|
||||
h1 + hr {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1.7em;
|
||||
}
|
||||
h2 {
|
||||
margin: 1em 0 0.8em 0;
|
||||
padding: 0;
|
||||
font-size: 150%;
|
||||
}
|
||||
img {border: none;}
|
||||
a {
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:link {
|
||||
/*color: #0073c7;*/
|
||||
color: blue;
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
a:visited {
|
||||
/*color: #5A88B5;*/
|
||||
color: #844084;
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
/*
|
||||
a:hover,
|
||||
a:active {
|
||||
color: #0073c7;
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
1374
test_archivemail.py
1374
test_archivemail.py
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue