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