func ResetConnection(conn *imap.Client, readOnly bool) error { // dont check for error because its possible it's already closed. conn.Close(!readOnly) _, err := imap.Wait(conn.Select("INBOX", readOnly)) if err != nil { return err } return nil }
func GetUIDs(mbox string, client *imap.Client) ([]uint32, error) { uids := make([]uint32, 0) cmd, err := client.Select(mbox, true) if err != nil { return uids, err } //== Get UIDS of all messages cmd, err = imap.Wait(client.UIDSearch("", "ALL")) if err != nil { return uids, err } for idx := range cmd.Data { for _, uid := range cmd.Data[idx].SearchResults() { uids = append(uids, uid) } } return uids, nil }
func GetMessage(folder, uid string, client *imap.Client) (messag *Message, e error) { cmd, err := client.Select(folder, true) if err != nil { return nil, err } uidlist, _ := imap.NewSeqSet(uid) //uidlist.Add(uid) fmt.Println("get_mess", folder, uid) mess := new(Message) mess.Folder = folder cmd, err = imap.Wait(client.UIDFetch(uidlist, "FLAGS", "INTERNALDATE", "RFC822.SIZE", "RFC822")) // "RFC822.HEADER", "BODY.PEEK[TEXT]") ) if err != nil { return mess, err } fmt.Println(len(cmd.Data), cmd.Data) rsp := cmd.Data[0] minfo := rsp.MessageInfo() mess.Uid = minfo.UID msg, _ := mail.ReadMessage(bytes.NewReader(imap.AsBytes(minfo.Attrs["RFC822"]))) mime, mime_err := enmime.ParseMIMEBody(msg) for flag, boo := range minfo.Flags { if flag == "\\Seen" && boo { mess.Seen = true } if flag == "\\Flagged" && boo { mess.Flagged = true } } /* bites := imap.AsBytes(minfo.Attrs["RFC822"]) msg, msg_err := mail.ReadMessage(bytes.NewReader(bites)) if msg_err != nil { return mess, msg_err } */ //fmt.Println(msg.Header.Get("Content-type")) //fmt.Println(msg.Header.Get("To")) //fmt.Println(msg.Header.Get("Delivered-To")) // From from, fro_err := mail.ParseAddress(msg.Header.Get("From")) if fro_err != nil { fmt.Println("address ettot") } else { mess.FromName = from.Name mess.FromEmail = from.Address } //for i, m := range minfo.Attrs { //fmt.Println(i,m) //} // Date dat := imap.AsDateTime(minfo.Attrs["INTERNALDATE"]) mess.Date = dat.Format("2006-01-02 15:04:05") mess.Subject = msg.Header.Get("Subject") mess.ContentType = msg.Header.Get("Content-Type") //fmt.Println("body=", cmd.Data[0].String) //bodyb := imap.AsBytes(minfo.Attrs["BODY[TEXT]"]) //bb := bytes.NewReader(bytes.NewReader(header + bodyb)) //fmt.Println("bodyb=", string(msg.Body)) //fmt.Printf("----\n%v\n", mime.Html == nil) //mess.Body = mime.Text if mime_err != nil { fmt.Println("err=", mime_err, mime) } //*/ //fmt.Println("body=", body) mess.BodyText = mime.Text mess.BodyHtml = mime.Html //imap.AsString(minfo.Attrs["RFC822"]) return mess, nil }
func ExampleClient() { // // Note: most of error handling code is omitted for brevity // var ( c *imap.Client cmd *imap.Command rsp *imap.Response ) // Connect to the server c, _ = imap.Dial("imap.example.com") // Remember to log out and close the connection when finished defer c.Logout(30 * time.Second) // Print server greeting (first response in the unilateral server data queue) fmt.Println("Server says hello:", c.Data[0].Info) c.Data = nil // Enable encryption, if supported by the server if c.Caps["STARTTLS"] { c.StartTLS(nil) } // Authenticate if c.State() == imap.Login { c.Login("*****@*****.**", "mysupersecretpassword") } // List all top-level mailboxes, wait for the command to finish cmd, _ = imap.Wait(c.List("", "%")) // Print mailbox information fmt.Println("\nTop-level mailboxes:") for _, rsp = range cmd.Data { fmt.Println("|--", rsp.MailboxInfo()) } // Check for new unilateral server data responses for _, rsp = range c.Data { fmt.Println("Server data:", rsp) } c.Data = nil // Open a mailbox (synchronous command - no need for imap.Wait) c.Select("INBOX", true) fmt.Print("\nMailbox status:\n", c.Mailbox) // Fetch the headers of the 10 most recent messages set, _ := imap.NewSeqSet("") if c.Mailbox.Messages >= 10 { set.AddRange(c.Mailbox.Messages-9, c.Mailbox.Messages) } else { set.Add("1:*") } cmd, _ = c.Fetch(set, "RFC822.HEADER") // Process responses while the command is running fmt.Println("\nMost recent messages:") for cmd.InProgress() { // Wait for the next response (no timeout) c.Recv(-1) // Process command data for _, rsp = range cmd.Data { header := imap.AsBytes(rsp.MessageInfo().Attrs["RFC822.HEADER"]) if msg, _ := mail.ReadMessage(bytes.NewReader(header)); msg != nil { fmt.Println("|--", msg.Header.Get("Subject")) } } cmd.Data = nil // Process unilateral server data for _, rsp = range c.Data { fmt.Println("Server data:", rsp) } c.Data = nil } // Check command completion status if rsp, err := cmd.Result(imap.OK); err != nil { if err == imap.ErrAborted { fmt.Println("Fetch command aborted") } else { fmt.Println("Fetch error:", rsp.Info) } } }