| // Copyright 2014 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "bufio" |
| "fmt" |
| "log" |
| "net/http" |
| "os" |
| "sort" |
| "strings" |
| |
| gmail "google.golang.org/api/gmail/v1" |
| ) |
| |
| func init() { |
| registerDemo("gmail", gmail.MailGoogleComScope, gmailMain) |
| } |
| |
| type message struct { |
| size int64 |
| gmailID string |
| date string // retrieved from message header |
| snippet string |
| } |
| |
| // 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: |
| } |
| } |
| } |
| |
| type messageSorter struct { |
| msg []message |
| less func(i, j message) bool |
| } |
| |
| func sortBySize(msg []message) { |
| sort.Sort(messageSorter{msg, func(i, j message) bool { |
| return i.size > j.size |
| }}) |
| } |
| |
| func (s messageSorter) Len() int { |
| return len(s.msg) |
| } |
| |
| func (s messageSorter) Swap(i, j int) { |
| s.msg[i], s.msg[j] = s.msg[j], s.msg[i] |
| } |
| |
| func (s messageSorter) Less(i, j int) bool { |
| return s.less(s.msg[i], s.msg[j]) |
| } |