github.com/jordwest/imap-server@v0.0.0-20200627020849-1cf758ba359f/conn/command_append.go (about) 1 package conn 2 3 import ( 4 "strconv" 5 6 "github.com/jordwest/imap-server/types" 7 ) 8 9 const ( 10 appendArgMailbox int = 0 11 appendArgFlags int = 1 12 appendArgDate int = 2 13 appendArgLength int = 3 14 ) 15 16 // Add a new message to a mailbox 17 func cmdAppend(args commandArgs, c *Conn) { 18 if !c.assertAuthenticated(args.ID()) { 19 return 20 } 21 22 mailboxName := args.Arg(appendArgMailbox) 23 mailbox, err := c.User.MailboxByName(mailboxName) 24 if err != nil { 25 c.writeResponse(args.ID(), "NO could not get mailbox") 26 return 27 } 28 29 length, err := strconv.ParseUint(args.Arg(appendArgLength), 10, 64) 30 if err != nil || length == 0 { 31 c.writeResponse(args.ID(), "BAD invalid length for message literal") 32 return 33 } 34 35 flagString := args.Arg(appendArgFlags) 36 flags := types.Flags(0) 37 if flagString != "" { 38 flags = types.FlagsFromString(flagString) 39 } 40 41 // Tell client to send the mail message 42 c.writeResponse("+", "go ahead, feed me your message") 43 44 // Read in the whole message 45 messageData, err := c.ReadFixedLength(int(length)) 46 if err != nil { 47 return 48 } 49 50 msg := mailbox.NewMessage() 51 rawMsg, err := types.MessageFromBytes(messageData) 52 if err != nil { 53 c.writeResponse(args.ID(), "NO "+err.Error()) 54 return 55 } 56 msg = msg.SetHeaders(rawMsg.Headers) 57 msg = msg.SetBody(rawMsg.Body) 58 msg = msg.OverwriteFlags(flags) 59 60 msg, err = msg.Save() 61 if err != nil { 62 c.writeResponse(args.ID(), "NO "+err.Error()) 63 return 64 } 65 66 c.writeResponse(args.ID(), "OK APPEND completed") 67 }