func (i *ImapSession) Append(folder string, extraCopies []string, msg io.Reader) error { c := i.client mbox := folder buf := new(bytes.Buffer) buf.ReadFrom(msg) now := time.Now() cmd, err := imap.Wait(c.Append(mbox, nil, &now, imap.NewLiteral(buf.Bytes()))) if err != nil { fmt.Println(err) return err } rsp, err := cmd.Result(imap.OK) if err != nil { fmt.Println(err) return err } uid := imap.AsNumber(rsp.Fields[len(rsp.Fields)-1]) set, _ := imap.NewSeqSet("") set.AddNum(uid) imapMust(imap.Wait(c.Select(mbox, false))) for _, mb := range extraCopies { if i.isGmail { imapMust(imap.Wait(c.UIDStore(set, "X-GM-LABELS", imap.NewFlagSet(mb)))) } else { imapMust(c.UIDCopy(set, mb)) } } return nil }
func TestLiteral(T *testing.T) { t := mock.Server(T, `S: * PREAUTH [CAPABILITY IMAP4rev1] Server ready`, ) c, err := t.Dial() t.Join(err) flags := imap.NewFlagSet(`\Seen`) lines := []string{ "Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)", "From: Fred Foobar <*****@*****.**>", "Subject: afternoon meeting", "To: [email protected]", "Message-Id: <*****@*****.**>", "MIME-Version: 1.0", "Content-Type: TEXT/PLAIN; CHARSET=US-ASCII", "", "Hello Joe, do you think we can meet at 3:30 tomorrow?", "", } msg := []byte(strings.Join(lines, "\r\n")) lit := imap.NewLiteral(msg) // Embedded literal t.Script( `C: A1 APPEND "saved-messages" (\Seen) {310}`, `S: + Ready for literal data`, `C: `+lines[0], `C: `+lines[1], `C: `+lines[2], `C: `+lines[3], `C: `+lines[4], `C: `+lines[5], `C: `+lines[6], `C: `+lines[7], `C: `+lines[8], `C: `+lines[9], `S: A1 OK APPEND completed`, ) _, err = imap.Wait(c.Append("saved-messages", flags, nil, lit)) t.Join(err) // Recv action literal t.Script( `C: A2 APPEND "saved-messages" (\Seen) {310}`, `S: + Ready for literal data`, mock.Recv(msg), `C: `, `S: A2 OK APPEND completed`, ) _, err = imap.Wait(c.Append("saved-messages", flags, nil, lit)) t.Join(err) // Embedded and Send action literals from the server t.Script( `C: A3 LIST "" "*"`, `S: * LIST (\Noselect) "/" {3}`, `S: foo`, `S: * LIST () "/" {7}`, mock.Send("foo/bar"), `S: `, `S: A3 OK LIST completed`, ) _, err = imap.Wait(c.List("", "*")) t.Join(err) }
func AppendMessage(conn *imap.Client, messageData MessageData) error { _, err := imap.Wait(conn.Append("INBOX", imap.NewFlagSet("UnSeen"), &messageData.InternalDate, imap.NewLiteral(messageData.Body))) return err }
func main() { imap.DefaultLogger = log.New(os.Stdout, "", 0) imap.DefaultLogMask = imap.LogConn | imap.LogRaw c := Dial(Addr) defer func() { ReportOK(c.Logout(30 * time.Second)) }() if c.Caps["STARTTLS"] { ReportOK(c.StartTLS(nil)) } if c.Caps["ID"] { ReportOK(c.ID("name", "goimap")) } ReportOK(c.Noop()) ReportOK(Login(c, User, Pass)) if c.Caps["QUOTA"] { ReportOK(c.GetQuotaRoot("INBOX")) } cmd := ReportOK(c.List("", "")) delim := cmd.Data[0].MailboxInfo().Delim mbox := MBox + delim + "Demo1" if cmd, err := imap.Wait(c.Create(mbox)); err != nil { if rsp, ok := err.(imap.ResponseError); ok && rsp.Status == imap.NO { ReportOK(c.Delete(mbox)) } ReportOK(c.Create(mbox)) } else { ReportOK(cmd, err) } ReportOK(c.List("", MBox)) ReportOK(c.List("", mbox)) ReportOK(c.Rename(mbox, mbox+"2")) ReportOK(c.Rename(mbox+"2", mbox)) ReportOK(c.Subscribe(mbox)) ReportOK(c.Unsubscribe(mbox)) ReportOK(c.Status(mbox)) ReportOK(c.Delete(mbox)) ReportOK(c.Create(mbox)) ReportOK(c.Select(mbox, true)) ReportOK(c.Close(false)) msg := []byte(strings.Replace(Msg[1:], "\n", "\r\n", -1)) ReportOK(c.Append(mbox, nil, nil, imap.NewLiteral(msg))) ReportOK(c.Select(mbox, false)) ReportOK(c.Check()) fmt.Println(c.Mailbox) cmd = ReportOK(c.UIDSearch("SUBJECT", c.Quote("GoIMAP"))) set, _ := imap.NewSeqSet("") set.AddNum(cmd.Data[0].SearchResults()...) ReportOK(c.Fetch(set, "FLAGS", "INTERNALDATE", "RFC822.SIZE", "BODY[]")) ReportOK(c.UIDStore(set, "+FLAGS.SILENT", imap.NewFlagSet(`\Deleted`))) ReportOK(c.Expunge(nil)) ReportOK(c.UIDSearch("SUBJECT", c.Quote("GoIMAP"))) fmt.Println(c.Mailbox) ReportOK(c.Close(true)) ReportOK(c.Delete(mbox)) }