// NewGMail returns a new GMail object which is authorized to send email. func NewGMail(clientId, clientSecret, tokenCacheFile string) (*GMail, error) { config := oauth.Config{ ClientId: clientId, ClientSecret: clientSecret, Scope: gmail.GmailComposeScope, AuthURL: "https://accounts.google.com/o/oauth2/auth", TokenURL: "https://accounts.google.com/o/oauth2/token", TokenCache: oauth.CacheFile(tokenCacheFile), RedirectURL: "urn:ietf:wg:oauth:2.0:oob", AccessType: "offline", } client, err := auth.RunFlow(&config) if err != nil { return nil, err } service, err := gmail.New(client) if err != nil { return nil, err } return &GMail{ service: service, }, nil }
// gmailMain is an example that demonstrates calling the Gmail API. // It iterates over all messages of a user that are larger // than 5MB, sorts them by size, and then interactively asks the user to // choose either to Delete, Skip, or Quit for each message. // // Example usage: // go build -o go-api-demo *.go // go-api-demo -clientid="my-clientid" -secret="my-secret" gmail func gmailMain(client *http.Client, argv []string) { if len(argv) != 0 { fmt.Fprintln(os.Stderr, "Usage: gmail") return } svc, err := gmail.New(client) if err != nil { log.Fatalf("Unable to create Gmail service: %v", err) } var total int64 msgs := []message{} pageToken := "" for { req := svc.Users.Messages.List("me").Q("larger:5M") if pageToken != "" { req.PageToken(pageToken) } r, err := req.Do() if err != nil { log.Fatalf("Unable to retrieve messages: %v", err) } log.Printf("Processing %v messages...\n", len(r.Messages)) for _, m := range r.Messages { msg, err := svc.Users.Messages.Get("me", m.Id).Do() if err != nil { log.Fatalf("Unable to retrieve message %v: %v", m.Id, err) } total += msg.SizeEstimate date := "" for _, h := range msg.Payload.Headers { if h.Name == "Date" { date = h.Value break } } msgs = append(msgs, message{ size: msg.SizeEstimate, gmailID: msg.Id, date: date, snippet: msg.Snippet, }) } if r.NextPageToken == "" { break } pageToken = r.NextPageToken } log.Printf("total: %v\n", total) sortBySize(msgs) reader := bufio.NewReader(os.Stdin) count, deleted := 0, 0 for _, m := range msgs { count++ fmt.Printf("\nMessage URL: https://mail.google.com/mail/u/0/#all/%v\n", m.gmailID) fmt.Printf("Size: %v, Date: %v, Snippet: %q\n", m.size, m.date, m.snippet) fmt.Printf("Options: (d)elete, (s)kip, (q)uit: [s] ") val := "" if val, err = reader.ReadString('\n'); err != nil { log.Fatalf("unable to scan input: %v", err) } val = strings.TrimSpace(val) switch val { case "d": // delete message if err := svc.Users.Messages.Delete("me", m.gmailID).Do(); err != nil { log.Fatalf("unable to delete message %v: %v", m.gmailID, err) } log.Printf("Deleted message %v.\n", m.gmailID) deleted++ case "q": // quit log.Printf("Done. %v messages processed, %v deleted\n", count, deleted) os.Exit(0) default: } } }