@@ -272,6 +272,73 @@ func (c *Client) UidCopy(seqset *imap.SeqSet, dest string) error {
272272 return c .copy (true , seqset , dest )
273273}
274274
275+ func (c * Client ) move (uid bool , seqset * imap.SeqSet , dest string ) error {
276+ if c .State () != imap .SelectedState {
277+ return ErrNoMailboxSelected
278+ }
279+
280+ if ok , err := c .Support ("MOVE" ); err != nil {
281+ return err
282+ } else if ! ok {
283+ return c .moveFallback (uid , seqset , dest )
284+ }
285+
286+ var cmd imap.Commander = & commands.Move {
287+ SeqSet : seqset ,
288+ Mailbox : dest ,
289+ }
290+ if uid {
291+ cmd = & commands.Uid {Cmd : cmd }
292+ }
293+
294+ if status , err := c .Execute (cmd , nil ); err != nil {
295+ return err
296+ } else {
297+ return status .Err ()
298+ }
299+ }
300+
301+ // moveFallback uses COPY, STORE and EXPUNGE for servers which don't support
302+ // MOVE.
303+ func (c * Client ) moveFallback (uid bool , seqset * imap.SeqSet , dest string ) error {
304+ item := imap .FormatFlagsOp (imap .AddFlags , true )
305+ flags := []interface {}{imap .DeletedFlag }
306+ if uid {
307+ if err := c .UidCopy (seqset , dest ); err != nil {
308+ return err
309+ }
310+
311+ if err := c .UidStore (seqset , item , flags , nil ); err != nil {
312+ return err
313+ }
314+ } else {
315+ if err := c .Copy (seqset , dest ); err != nil {
316+ return err
317+ }
318+
319+ if err := c .Store (seqset , item , flags , nil ); err != nil {
320+ return err
321+ }
322+ }
323+
324+ return c .Expunge (nil )
325+ }
326+
327+ // Move moves the specified message(s) to the end of the specified destination
328+ // mailbox.
329+ //
330+ // If the server doesn't support the MOVE extension defined in RFC 6851,
331+ // go-imap will fallback to copy, store and expunge.
332+ func (c * Client ) Move (seqset * imap.SeqSet , dest string ) error {
333+ return c .move (false , seqset , dest )
334+ }
335+
336+ // UidMove is identical to Move, but seqset is interpreted as containing unique
337+ // identifiers instead of message sequence numbers.
338+ func (c * Client ) UidMove (seqset * imap.SeqSet , dest string ) error {
339+ return c .move (true , seqset , dest )
340+ }
341+
275342// Unselect frees server's resources associated with the selected mailbox and
276343// returns the server to the authenticated state. This command performs the same
277344// actions as Close, except that no messages are permanently removed from the
0 commit comments