Skip to content

Commit dc9d07b

Browse files
committed
fix email send error when usage 465 port
1 parent 5f4fd26 commit dc9d07b

File tree

1 file changed

+86
-28
lines changed

1 file changed

+86
-28
lines changed

pkg/message/email_message.go

+86-28
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ import (
1313
"k8s.io/apimachinery/pkg/types"
1414
"k8s.io/klog/v2"
1515
"mime"
16+
"net"
1617
"net/smtp"
1718
"sigs.k8s.io/controller-runtime/pkg/client"
19+
"strings"
1820
"time"
1921
)
2022

@@ -37,20 +39,8 @@ func (e *EmailMessageHandler) HandleMessageEvent(event *conf.MessageEvent) {
3739
klog.Error("failed to vail params", err)
3840
return
3941
}
40-
var secret corev1.Secret
41-
err := e.Client.Get(context.TODO(), types.NamespacedName{
42-
Namespace: constant.DefaultNamespace,
43-
Name: e.SecretKey,
44-
}, &secret)
4542

46-
if err != nil {
47-
klog.Error("failed to get secret", err)
48-
return
49-
}
50-
51-
auth := smtp.PlainAuth("", string(secret.Data["username"]), string(secret.Data["password"]), e.Address)
52-
err = e.SendMsg(auth, event)
53-
if err != nil {
43+
if err := e.SendMsg(event); err != nil {
5444
klog.Error("failed to send email, err: ", err)
5545
return
5646
}
@@ -70,8 +60,23 @@ func (e *EmailMessageHandler) setMsg(me *conf.MessageEvent, to string) []byte {
7060
return buffer.Bytes()
7161
}
7262

73-
func (e *EmailMessageHandler) SendMsg(a smtp.Auth, eve *conf.MessageEvent) error {
74-
dial, err := smtp.Dial(fmt.Sprintf("%s:%d", e.Address, e.Port))
63+
func (e *EmailMessageHandler) SendMsg(eve *conf.MessageEvent) error {
64+
65+
var conn net.Conn
66+
var err error
67+
68+
if e.Port == 465 {
69+
tlsConfig := &tls.Config{InsecureSkipVerify: true}
70+
conn, err = tls.Dial("tcp", fmt.Sprintf("%s:%d", e.Address, e.Port), tlsConfig)
71+
} else {
72+
d := net.Dialer{}
73+
conn, err = d.Dial("tcp", fmt.Sprintf("%s:%d", e.Address, e.Port))
74+
}
75+
76+
if err != nil {
77+
return err
78+
}
79+
dial, err := smtp.NewClient(conn, e.Address)
7580
if err != nil {
7681
return err
7782
}
@@ -80,22 +85,26 @@ func (e *EmailMessageHandler) SendMsg(a smtp.Auth, eve *conf.MessageEvent) error
8085
if err != nil {
8186
return err
8287
}
83-
if ok, _ := dial.Extension("STARTTLS"); ok {
84-
config := &tls.Config{ServerName: e.Address}
85-
if err = dial.StartTLS(config); err != nil {
86-
return err
87-
}
88+
//if ok, _ := dial.Extension("STARTTLS"); ok {
89+
// config := &tls.Config{ServerName: e.Address}
90+
// if err = dial.StartTLS(config); err != nil {
91+
// return err
92+
// }
93+
//}
94+
95+
ok, param := dial.Extension("AUTH")
96+
if !ok {
97+
return errors.New("smtp: server doesn't support AUTH")
98+
}
99+
auth, err := e.auth(param)
100+
if err != nil {
101+
return err
88102
}
89103

90-
if a != nil {
91-
auth, _ := dial.Extension("AUTH")
92-
if !auth {
93-
return errors.New("smtp: server doesn't support AUTH")
94-
}
95-
if err = dial.Auth(a); err != nil {
96-
return err
97-
}
104+
if err = dial.Auth(auth); err != nil {
105+
return err
98106
}
107+
99108
if err = dial.Mail(e.Fo); err != nil {
100109
return err
101110
}
@@ -141,3 +150,52 @@ func (e *EmailMessageHandler) Vail() error {
141150

142151
return nil
143152
}
153+
154+
type mailAuth struct {
155+
username, password string
156+
}
157+
158+
func (e *EmailMessageHandler) auth(authType string) (smtp.Auth, error) {
159+
var secret corev1.Secret
160+
err := e.Client.Get(context.TODO(), types.NamespacedName{
161+
Namespace: constant.DefaultNamespace,
162+
Name: e.SecretKey,
163+
}, &secret)
164+
if err != nil {
165+
return nil, err
166+
}
167+
168+
for _, t := range strings.Split(authType, " ") {
169+
switch t {
170+
case "PLAIN":
171+
return smtp.PlainAuth("", string(secret.Data["username"]), string(secret.Data["password"]), e.Address), nil
172+
//case "LOGIN":
173+
// return MailAuth(string(secret.Data["username"]), string(secret.Data["password"])), nil
174+
}
175+
}
176+
177+
return nil, fmt.Errorf("unknown auth mechanism: %s", authType)
178+
}
179+
180+
func MailAuth(username, password string) smtp.Auth {
181+
return &mailAuth{username, password}
182+
}
183+
184+
func (a *mailAuth) Start(_ *smtp.ServerInfo) (string, []byte, error) {
185+
resp := []byte(a.username + "\x00" + a.password)
186+
return "LOGIN", resp, nil
187+
}
188+
189+
func (a *mailAuth) Next(fromServer []byte, more bool) ([]byte, error) {
190+
if more {
191+
switch strings.ToLower(string(fromServer)) {
192+
case "username:":
193+
return []byte(a.username), nil
194+
case "password:":
195+
return []byte(a.password), nil
196+
default:
197+
return nil, fmt.Errorf("unexpected server challenge")
198+
}
199+
}
200+
return nil, nil
201+
}

0 commit comments

Comments
 (0)