From a9d33696434ee060614778d4c34b2bf7498f04d1 Mon Sep 17 00:00:00 2001 From: ale <ale@incal.net> Date: Tue, 6 Dec 2022 17:56:14 +0000 Subject: [PATCH] Add a move-to-trash option for GMail compat --- imap_clean.go | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/imap_clean.go b/imap_clean.go index 84be9b7..6c54b0a 100644 --- a/imap_clean.go +++ b/imap_clean.go @@ -27,6 +27,7 @@ var ( folder = flag.String("folder", "INBOX", "remote IMAP folder") verbose = flag.Bool("verbose", false, "print additional debug messages") batchSize = flag.Int("batch-size", 100, "deletion batch size") + moveToTrash = flag.Bool("move-to-gmail-trash", false, "move messages to Trash folder before deleting them (GMail workaround)") ) func vlog(fmt string, args ...interface{}) { @@ -106,6 +107,28 @@ func uidBatch(c *client.Client, uids []uint32, f func([]uint32) error) error { return nil } +func actuallyDelete(c *client.Client, uids *imap.SeqSet) error { + // Do the GMail move-to-Trash dance. + if *moveToTrash { + if err := c.UidStore( + uids, + "+X-GM-LABELS", + []interface{}{"\\Trash"}, + nil, + ); err != nil { + return err + } + } + + // Just set the \\Deleted flag as one normally would. + return c.UidStore( + uids, + imap.FormatFlagsOp(imap.AddFlags, true), + []interface{}{imap.DeletedFlag}, + nil, + ) +} + func main() { log.SetFlags(0) flag.Parse() @@ -146,12 +169,7 @@ func main() { } vlog("deleting %d messages...", len(uids)) - return c.UidStore( - set, - imap.FormatFlagsOp(imap.AddFlags, true), - []interface{}{imap.DeletedFlag}, - nil, - ) + return actuallyDelete(c, set) }) if err != nil { log.Fatalf("delete error: %v", err) -- GitLab