diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..3168871 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module github.com/taoshihan1991/imaptool + +go 1.14 + +require github.com/emersion/go-imap v1.0.4 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..4959b4b --- /dev/null +++ b/go.sum @@ -0,0 +1,15 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emersion/go-imap v1.0.4 h1:uiCAIHM6Z5Jwkma1zdNDWWXxSCqb+/xHBkHflD7XBro= +github.com/emersion/go-imap v1.0.4/go.mod h1:yKASt+C3ZiDAiCSssxg9caIckWF/JG7ZQTO7GAmvicU= +github.com/emersion/go-message v0.11.1/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY= +github.com/emersion/go-sasl v0.0.0-20191210011802-430746ea8b9b h1:uhWtEWBHgop1rqEk2klKaxPAkVDCXexai6hSuRQ7Nvs= +github.com/emersion/go-sasl v0.0.0-20191210011802-430746ea8b9b/go.mod h1:G/dpzLu16WtQpBfQ/z3LYiYJn3ZhKSGWn83fyoyQe/k= +github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U= +github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/imaptool.exe b/imaptool.exe new file mode 100644 index 0000000..b2a924f Binary files /dev/null and b/imaptool.exe differ diff --git a/imaptool.go b/imaptool.go index 2d231a7..d068e5a 100644 --- a/imaptool.go +++ b/imaptool.go @@ -1,11 +1,78 @@ package main import ( - "fmt" + "log" - "github.com/taoshihan1991/imaptool/tools" + "github.com/emersion/go-imap/client" + "github.com/emersion/go-imap" ) func main() { - fmt.Printf(tools.Reverse("!taoshihan ,olleH")) -} + log.Println("正在连接服务器...") + + // 连接到服务器 + c, err := client.DialTLS("imap.sina.net:993", nil) + if err != nil { + log.Fatal(err) + } + log.Println("连接成功") + + // 不要忘了退出 + defer c.Logout() + + // 登陆 + if err := c.Login("shihan2@appdev.sinanet.com", "tsh_xxx"); err != nil { + log.Fatal(err) + } + log.Println("成功登陆") + + // 列邮箱 + mailboxes := make(chan *imap.MailboxInfo, 10) + done := make(chan error, 1) + go func () { + done <- c.List("", "*", mailboxes) + }() + + log.Println("邮箱:") + for m := range mailboxes { + log.Println("* " + m.Name) + } + + if err := <-done; err != nil { + log.Fatal(err) + } + + // Select INBOX + mbox, err := c.Select("INBOX", false) + if err != nil { + log.Fatal(err) + } + log.Println("INBOX的Flags标记:", mbox.Flags) + + // 获取最新的 4 封信 + from := uint32(1) + to := mbox.Messages + if mbox.Messages > 3 { + // 我们在这使用无符号整型, 这是再获取from的id + from = mbox.Messages - 3 + } + seqset := new(imap.SeqSet) + seqset.AddRange(from, to) + + messages := make(chan *imap.Message, 10) + done = make(chan error, 1) + go func() { + done <- c.Fetch(seqset, []imap.FetchItem{imap.FetchEnvelope}, messages) + }() + + log.Println("最新的 4 封信:") + for msg := range messages { + log.Println("* " + msg.Envelope.Subject) + } + + if err := <-done; err != nil { + log.Fatal(err) + } + + log.Println("结束!") +} \ No newline at end of file diff --git a/tools/reverse_test.go b/tools/reverse_test.go new file mode 100644 index 0000000..1d2703e --- /dev/null +++ b/tools/reverse_test.go @@ -0,0 +1,19 @@ +package tools + +import "testing" + +func TestReverse(t *testing.T) { + cases := []struct { + in, want string + }{ + {"Hello, world", "dlrow ,olleH"}, + {"Hello, 世界", "界世 ,olleH"}, + {"", ""}, + } + for _, c := range cases { + got := Reverse(c.in) + if got != c.want { + t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want) + } + } +}