[OT-ish] Want command line program to selectively delete emails

Sean Greenslade sean at seangreenslade.com
Sun Sep 17 17:11:55 UTC 2023


On Mon, Aug 07, 2023 at 01:57:04AM +1000, Nemo Thorx wrote:
> Quoting Ed Blackman from 04 Aug (a Friday in 2023) at 1434 hours...
> > Any suggestions for a command line program to select emails for
> > deletion based on command line options?  I specifically want one that
> > can remove emails that were received more than X days ago, but can
> > also express "but don't delete if they're flagged".
> 
> <snip>
> 
> > I could call mutt (see, kinda OT!) with "-e" to tag, delete, sync, and
> > quit, but that seems fiddly and heavyweight.
> 
> But if it's being run from cron overnight or something, are you ever
> going to notice? 
> 
> > I could give up on using the message headers to determine the message
> > date, learn how filenames are constructed in Maildir (to read the
> > flags) and use a shell script built around "find".
> 
> I'm reasonably confident that all filenames (before the ':') are only
> convention (I convert an nntp spool to maildir and name them according
> to my own naming convention which everything (well, mutt and dovecot)
> then honours), and mtime is unused by anything and/or not to be trusted. 
> 
> So honetsly, I'd suggest mutt's -e, since it gives you mutt's pattern
> matching which is much more powerful than archivemail (admittedly,
> I only used that for trivial stuff and only many years ago) and likely
> more than anything else available. 
> 
> eg, instead of just "received more than X days ago and not flagged",
> mutt can let you select/ignore whole threads based on those parameters,
> and others alike. eg, I once had archiving setup on a folder-hook thus: 
> 
> folder-hook !(Maildir$|archive|search|mfolder|.r.) 'push "<sort-reverse>t<tag-pattern>~m 600- !~(~m -600) !~(~r <32d) !~(~N) !~(~F) !~D<enter><tag-prefix-cond><save-message>^.archive<enter><enter><end-cond><sort-mailbox>t<collapse-all>"'
> 
> To decode that: sort reverse threaded, select all messages after the
> first 600, but not if it's part of a thread within the first 600, not if
> it's in a thread with messages received in the last 32 days, not if it's
> in a thread with messages marked 'New' or 'Flagged', and not if it's
> a message already marked delete. Then save to the archive mailbox and
> established my desired sorting and thread collapse visibility. 
> 
> Basically - I wanted a thread-preserving archiving mechanism, and mutt's
> thread-aware pattern matching gave it to me. (I didn't include sync in
> that setup, preferring at the time to let that occur with mailbox
> closing)
> 
> In a delete scenario as you're seeking, I'd suggest a multi-step process
> which first archives threads you've contributed to - and only then
> deleting old ignorable threads. 
> 
> Sure It's fiddly - which is your argument against using mutt.
> 
> ...But it's powerful - which is my argument for using mutt!
> 
> Aside - I used folder-hook before because I didn't know of the "-e"
> option, and I stopped using it because I found I was often using mutt as
> a mailbox debug tool, and this was just getting in the way. I can see
> myself going down the rabbithole and reimplementing my old archiver now
> (where "now" is "sometime in the next few months, maybe" :)

Another very late reply to this thread, but I happen to have implemented
almost exactly the concept you're describing. It's a python3 script that
deletes whole threads that meet the criteria:
- All messages are markes as read
- No messages in the thread are unread
- No messages in the thread are flagged (starred)
- All messages in the thread are older than N days

It's been several years since I've looked at this code (which in my mind
is a good thing, since that means it hasn't broken), so definitely give
it a read-over to see if it's suitable for your purposes. In my case, I
run it directly on the mail server via a systemd service and timer.

https://seangreenslade.com/source-code/scripts/list-thread-pruner/listthreadpruner-v0.1.py

Happy to answer any questions about the code if anyone is curious or
wants to use it.

--Sean



More information about the Mutt-users mailing list