Merge branch 'feature-add-function'

This commit is contained in:
taknb2nch
2014-02-15 16:59:44 +09:00
3 changed files with 71 additions and 2 deletions

65
pop3.go
View File

@@ -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

View File

@@ -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.")
}

View File

@@ -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)
}
}