Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

141 linhas
3.2 KiB

  1. // Copyright 2014 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package main
  5. import (
  6. "bufio"
  7. "fmt"
  8. "log"
  9. "net/http"
  10. "os"
  11. "sort"
  12. "strings"
  13. gmail "google.golang.org/api/gmail/v1"
  14. )
  15. func init() {
  16. registerDemo("gmail", gmail.MailGoogleComScope, gmailMain)
  17. }
  18. type message struct {
  19. size int64
  20. gmailID string
  21. date string // retrieved from message header
  22. snippet string
  23. }
  24. // gmailMain is an example that demonstrates calling the Gmail API.
  25. // It iterates over all messages of a user that are larger
  26. // than 5MB, sorts them by size, and then interactively asks the user to
  27. // choose either to Delete, Skip, or Quit for each message.
  28. //
  29. // Example usage:
  30. // go build -o go-api-demo *.go
  31. // go-api-demo -clientid="my-clientid" -secret="my-secret" gmail
  32. func gmailMain(client *http.Client, argv []string) {
  33. if len(argv) != 0 {
  34. fmt.Fprintln(os.Stderr, "Usage: gmail")
  35. return
  36. }
  37. svc, err := gmail.New(client)
  38. if err != nil {
  39. log.Fatalf("Unable to create Gmail service: %v", err)
  40. }
  41. var total int64
  42. msgs := []message{}
  43. pageToken := ""
  44. for {
  45. req := svc.Users.Messages.List("me").Q("larger:5M")
  46. if pageToken != "" {
  47. req.PageToken(pageToken)
  48. }
  49. r, err := req.Do()
  50. if err != nil {
  51. log.Fatalf("Unable to retrieve messages: %v", err)
  52. }
  53. log.Printf("Processing %v messages...\n", len(r.Messages))
  54. for _, m := range r.Messages {
  55. msg, err := svc.Users.Messages.Get("me", m.Id).Do()
  56. if err != nil {
  57. log.Fatalf("Unable to retrieve message %v: %v", m.Id, err)
  58. }
  59. total += msg.SizeEstimate
  60. date := ""
  61. for _, h := range msg.Payload.Headers {
  62. if h.Name == "Date" {
  63. date = h.Value
  64. break
  65. }
  66. }
  67. msgs = append(msgs, message{
  68. size: msg.SizeEstimate,
  69. gmailID: msg.Id,
  70. date: date,
  71. snippet: msg.Snippet,
  72. })
  73. }
  74. if r.NextPageToken == "" {
  75. break
  76. }
  77. pageToken = r.NextPageToken
  78. }
  79. log.Printf("total: %v\n", total)
  80. sortBySize(msgs)
  81. reader := bufio.NewReader(os.Stdin)
  82. count, deleted := 0, 0
  83. for _, m := range msgs {
  84. count++
  85. fmt.Printf("\nMessage URL: https://mail.google.com/mail/u/0/#all/%v\n", m.gmailID)
  86. fmt.Printf("Size: %v, Date: %v, Snippet: %q\n", m.size, m.date, m.snippet)
  87. fmt.Printf("Options: (d)elete, (s)kip, (q)uit: [s] ")
  88. val := ""
  89. if val, err = reader.ReadString('\n'); err != nil {
  90. log.Fatalf("unable to scan input: %v", err)
  91. }
  92. val = strings.TrimSpace(val)
  93. switch val {
  94. case "d": // delete message
  95. if err := svc.Users.Messages.Delete("me", m.gmailID).Do(); err != nil {
  96. log.Fatalf("unable to delete message %v: %v", m.gmailID, err)
  97. }
  98. log.Printf("Deleted message %v.\n", m.gmailID)
  99. deleted++
  100. case "q": // quit
  101. log.Printf("Done. %v messages processed, %v deleted\n", count, deleted)
  102. os.Exit(0)
  103. default:
  104. }
  105. }
  106. }
  107. type messageSorter struct {
  108. msg []message
  109. less func(i, j message) bool
  110. }
  111. func sortBySize(msg []message) {
  112. sort.Sort(messageSorter{msg, func(i, j message) bool {
  113. return i.size > j.size
  114. }})
  115. }
  116. func (s messageSorter) Len() int {
  117. return len(s.msg)
  118. }
  119. func (s messageSorter) Swap(i, j int) {
  120. s.msg[i], s.msg[j] = s.msg[j], s.msg[i]
  121. }
  122. func (s messageSorter) Less(i, j int) bool {
  123. return s.less(s.msg[i], s.msg[j])
  124. }