Skip to content

Commit

Permalink
client: return error from SendMail when required AUTH not available
Browse files Browse the repository at this point in the history
Return an error if an Auth is passed to SendMail but the server does not support authentication.
  • Loading branch information
johnnyluo authored and emersion committed Jan 16, 2019
1 parent 36cff68 commit cf6a22e
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 7 deletions.
9 changes: 5 additions & 4 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -379,10 +379,11 @@ func SendMail(addr string, a sasl.Client, from string, to []string, r io.Reader)
}
}
if a != nil && c.ext != nil {
if _, ok := c.ext["AUTH"]; ok {
if err = c.Auth(a); err != nil {
return err
}
if _, ok := c.ext["AUTH"]; !ok {
return errors.New("smtp: server doesn't support AUTH")
}
if err = c.Auth(a); err != nil {
return err
}
}
if err = c.Mail(from); err != nil {
Expand Down
49 changes: 46 additions & 3 deletions client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"net"
"net/textproto"
"strings"
"sync"
"testing"
"time"

Expand Down Expand Up @@ -376,7 +377,7 @@ var helloServer = []string{
"250 Reset ok\n",
"221 Goodbye\n",
"250 Sender ok\n",
"250 ok\n"
"250 ok\n",
}

var baseHelloClient = `EHLO customhost
Expand Down Expand Up @@ -498,6 +499,49 @@ SendMail is working for me.
QUIT
`

func TestSendMailWithAuth(t *testing.T) {
l, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
t.Fatalf("Unable to to create listener: %v", err)
}
defer l.Close()
wg := sync.WaitGroup{}
var done = make(chan struct{})
go func() {
defer wg.Done()
conn, err := l.Accept()
if err != nil {
t.Errorf("Accept error: %v", err)
return
}
defer conn.Close()

tc := textproto.NewConn(conn)
tc.PrintfLine("220 hello world")
msg, err := tc.ReadLine()
if msg == "EHLO localhost" {
tc.PrintfLine("250 mx.google.com at your service")
}
// for this test case, there should have no more traffic
<-done
}()
wg.Add(1)

err = SendMail(l.Addr().String(), sasl.NewPlainClient("", "user", "pass"), "[email protected]", []string{"[email protected]"}, strings.NewReader(strings.Replace(`From: [email protected]
To: [email protected]
Subject: SendMail test
SendMail is working for me.
`, "\n", "\r\n", -1)))
if err == nil {
t.Error("SendMail: Server doesn't support AUTH, expected to get an error, but got none ")
}
if err.Error() != "smtp: server doesn't support AUTH" {
t.Errorf("Expected: smtp: server doesn't support AUTH, got: %s", err)
}
close(done)
wg.Wait()
}

func TestAuthFailed(t *testing.T) {
server := strings.Join(strings.Split(authFailedServer, "\n"), "\r\n")
client := strings.Join(strings.Split(authFailedClient, "\n"), "\r\n")
Expand Down Expand Up @@ -690,10 +734,9 @@ func init() {
}

func sendMail(hostPort string) error {
auth := sasl.NewPlainClient("", "", "")
from := "[email protected]"
to := []string{"[email protected]"}
return SendMail(hostPort, auth, from, to, strings.NewReader("Subject: test\n\nhowdy!"))
return SendMail(hostPort, nil, from, to, strings.NewReader("Subject: test\n\nhowdy!"))
}

// (copied from net/http/httptest)
Expand Down

0 comments on commit cf6a22e

Please sign in to comment.