From 5495a0838dbb4b14f04b782fc0586979dacab64b Mon Sep 17 00:00:00 2001 From: taknb2nch Date: Sat, 15 Feb 2014 16:58:57 +0900 Subject: [PATCH] =?UTF-8?q?ReceiveMail=E9=96=A2=E6=95=B0=E3=81=AE=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=80=82=E3=83=86=E3=82=B9=E3=83=88=E3=81=AE=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=80=81=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pop3.go | 65 +++++++++++++++++++++++++++++++++++++++++++++++ pop3_test.go | 4 +++ pop3proto_test.go | 4 +-- 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/pop3.go b/pop3.go index 8e11823..4c6ca6d 100644 --- a/pop3.go +++ b/pop3.go @@ -9,6 +9,10 @@ import ( "strings" ) +var ( + EOF = errors.New("skip the all mail remaining") +) + // MessageInfo has Number, Size, and Uid fields, // and used as a return value of ListAll and UidlAll. // When used as the return value of the method ListAll, @@ -196,6 +200,67 @@ func (c *Client) Quit() error { return c.cmdSimple("QUIT") } +// ReceiveMail connects to the server at addr, +// and authenticates with user and pass, +// and calling receiveFn for each mail. +func ReceiveMail(addr, user, pass string, receiveFn ReceiveMailFunc) error { + c, err := Dial(addr) + + if err != nil { + return err + } + + defer func() { + c.Quit() + c.Close() + }() + + if err = c.User(user); err != nil { + return err + } + + if err = c.Pass(pass); err != nil { + return err + } + + var mis []MessageInfo + + if mis, err = c.UidlAll(); err != nil { + return err + } + + for _, mi := range mis { + var data string + + data, err = c.Retr(mi.Number) + + del, err := receiveFn(mi.Number, mi.Uid, data, err) + + if err != nil && err != EOF { + return err + } + + if del { + if err = c.Dele(mi.Number); err != nil { + return err + } + } + + if err == EOF { + break + } + } + + return nil +} + +// ReceiveMailFunc is the type of the function called for each mail. +// Its arguments are mail's number, uid, data, and mail receiving error. +// if this function returns false value, the mail will be deleted, +// if its returns EOF, skip the all mail of remaining. +// (after deleting mail, if necessary) +type ReceiveMailFunc func(number int, uid, data string, err error) (bool, error) + func (c *Client) cmdSimple(format string, args ...interface{}) error { var err error diff --git a/pop3_test.go b/pop3_test.go index 0e6858e..7ea8d07 100644 --- a/pop3_test.go +++ b/pop3_test.go @@ -300,3 +300,7 @@ func (f faker) RemoteAddr() net.Addr { return nil } func (f faker) SetDeadline(time.Time) error { return nil } func (f faker) SetReadDeadline(time.Time) error { return nil } func (f faker) SetWriteDeadline(time.Time) error { return nil } + +func TestReceiveMail(t *testing.T) { + t.Skipf("sorry this test has not implemented.") +} diff --git a/pop3proto_test.go b/pop3proto_test.go index 65d2ae2..835c02c 100644 --- a/pop3proto_test.go +++ b/pop3proto_test.go @@ -67,13 +67,13 @@ func TestReadResponse(t *testing.T) { r = reader("message\n") s, err = r.ReadResponse() - if s != "" || err == nil || err.Error() != "レスポンスのフォーマットが不正です。: message" { + if s != "" || err == nil || err.Error() != "invalid response format: message" { t.Fatalf("%v, %v", s, err) } r = reader("* message\n") s, err = r.ReadResponse() - if s != "" || err == nil || err.Error() != "レスポンスの内容が不明です。: * message" { + if s != "" || err == nil || err.Error() != "unknown response: * message" { t.Fatalf("%v, %v", s, err) } }