@@ -13,8 +13,10 @@ import (
13
13
"k8s.io/apimachinery/pkg/types"
14
14
"k8s.io/klog/v2"
15
15
"mime"
16
+ "net"
16
17
"net/smtp"
17
18
"sigs.k8s.io/controller-runtime/pkg/client"
19
+ "strings"
18
20
"time"
19
21
)
20
22
@@ -37,20 +39,8 @@ func (e *EmailMessageHandler) HandleMessageEvent(event *conf.MessageEvent) {
37
39
klog .Error ("failed to vail params" , err )
38
40
return
39
41
}
40
- var secret corev1.Secret
41
- err := e .Client .Get (context .TODO (), types.NamespacedName {
42
- Namespace : constant .DefaultNamespace ,
43
- Name : e .SecretKey ,
44
- }, & secret )
45
42
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 {
54
44
klog .Error ("failed to send email, err: " , err )
55
45
return
56
46
}
@@ -70,8 +60,23 @@ func (e *EmailMessageHandler) setMsg(me *conf.MessageEvent, to string) []byte {
70
60
return buffer .Bytes ()
71
61
}
72
62
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 )
75
80
if err != nil {
76
81
return err
77
82
}
@@ -80,22 +85,26 @@ func (e *EmailMessageHandler) SendMsg(a smtp.Auth, eve *conf.MessageEvent) error
80
85
if err != nil {
81
86
return err
82
87
}
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
88
102
}
89
103
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
98
106
}
107
+
99
108
if err = dial .Mail (e .Fo ); err != nil {
100
109
return err
101
110
}
@@ -141,3 +150,52 @@ func (e *EmailMessageHandler) Vail() error {
141
150
142
151
return nil
143
152
}
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