mirror of
https://github.com/golang/go
synced 2024-11-19 21:34:45 -07:00
net/smtp: return error from SendMail when required AUTH not available
Return an error if an Auth is passed to SendMail but the server does not support authentication. Fixes #22145 Change-Id: I49a37259c47bbe5145e30fa8a2d05444e60cb378 Reviewed-on: https://go-review.googlesource.com/79776 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
e4bde05104
commit
701fa1c5ed
@ -343,10 +343,11 @@ func SendMail(addr string, a Auth, from string, to []string, msg []byte) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if a != nil && c.ext != nil {
|
if a != nil && c.ext != nil {
|
||||||
if _, ok := c.ext["AUTH"]; ok {
|
if _, ok := c.ext["AUTH"]; !ok {
|
||||||
if err = c.Auth(a); err != nil {
|
return errors.New("smtp: server doesn't support AUTH")
|
||||||
return err
|
}
|
||||||
}
|
if err = c.Auth(a); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err = c.Mail(from); err != nil {
|
if err = c.Mail(from); err != nil {
|
||||||
|
@ -15,6 +15,7 @@ import (
|
|||||||
"net/textproto"
|
"net/textproto"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -635,6 +636,50 @@ SendMail is working for me.
|
|||||||
QUIT
|
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(), PlainAuth("", "user", "pass", "smtp.google.com"), "test@example.com", []string{"other@example.com"}, []byte(strings.Replace(`From: test@example.com
|
||||||
|
To: other@example.com
|
||||||
|
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) {
|
func TestAuthFailed(t *testing.T) {
|
||||||
server := strings.Join(strings.Split(authFailedServer, "\n"), "\r\n")
|
server := strings.Join(strings.Split(authFailedServer, "\n"), "\r\n")
|
||||||
client := strings.Join(strings.Split(authFailedClient, "\n"), "\r\n")
|
client := strings.Join(strings.Split(authFailedClient, "\n"), "\r\n")
|
||||||
@ -830,14 +875,9 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func sendMail(hostPort string) error {
|
func sendMail(hostPort string) error {
|
||||||
host, _, err := net.SplitHostPort(hostPort)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
auth := PlainAuth("", "", "", host)
|
|
||||||
from := "joe1@example.com"
|
from := "joe1@example.com"
|
||||||
to := []string{"joe2@example.com"}
|
to := []string{"joe2@example.com"}
|
||||||
return SendMail(hostPort, auth, from, to, []byte("Subject: test\n\nhowdy!"))
|
return SendMail(hostPort, nil, from, to, []byte("Subject: test\n\nhowdy!"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// (copied from net/http/httptest)
|
// (copied from net/http/httptest)
|
||||||
|
Loading…
Reference in New Issue
Block a user