@@ -35,70 +35,76 @@ func (c *Connector) run() {
35
35
// устанавливает соединение к почтовому сервису
36
36
func (c * Connector ) connect (event * ConnectionEvent ) {
37
37
logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d try find connection" , c .id , event .Message .Id )
38
- goto receiveConnect
39
38
40
- receiveConnect:
41
- event .TryCount ++
42
- var targetClient * common.SmtpClient
39
+ for {
40
+ event .TryCount ++
41
+ var targetClient * common.SmtpClient
43
42
44
- // смотрим все mx сервера почтового сервиса
45
- for _ , mxServer := range event .server .mxServers {
46
- logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d try receive connection for %s" , c .id , event .Message .Id , mxServer .hostname )
43
+ // смотрим все mx сервера почтового сервиса
44
+ for _ , mxServer := range event .server .mxServers {
45
+ logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d try receive connection for %s" , c .id , event .Message .Id , mxServer .hostname )
47
46
48
- // пробуем получить клиента
49
- var ok bool
50
- event .Queue , ok = mxServer .queues [event .address ]
51
- if ! ok {
52
- event .Queue = common .NewLimitQueue ()
53
- }
47
+ // пробуем получить клиента
48
+ var ok bool
49
+ event .Queue , ok = mxServer .queues [event .address ]
50
+ if ! ok {
51
+ event .Queue = common .NewLimitQueue ()
52
+ }
54
53
55
- client := event .Queue .Pop ()
56
- if client != nil {
57
- targetClient = client .(* common.SmtpClient )
58
- logger .By (event .Message .HostnameFrom ).Debug ("connector%d-%d found free smtp client#%d" , c .id , event .Message .Id , targetClient .Id )
59
- }
54
+ client := event .Queue .Pop ()
55
+ if client != nil {
56
+ targetClient = client .(* common.SmtpClient )
57
+ logger .By (event .Message .HostnameFrom ).Debug ("connector%d-%d found free smtp client#%d" , c .id , event .Message .Id , targetClient .Id )
58
+ }
60
59
61
- // создаем новое соединение к почтовому сервису
62
- // если не удалось найти клиента
63
- // или клиент разорвал соединение
64
- if (targetClient == nil && ! event .Queue .HasLimit ()) ||
65
- (targetClient != nil && targetClient .Status == common .DisconnectedSmtpClientStatus ) {
66
- logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d can't find free smtp client for %s" , c .id , event .Message .Id , mxServer .hostname )
67
- c .createSmtpClient (mxServer , event , & targetClient )
68
- }
60
+ // создаем новое соединение к почтовому сервису
61
+ // если не удалось найти клиента
62
+ // или клиент разорвал соединение
63
+ if (targetClient == nil && ! event .Queue .HasLimit ()) ||
64
+ (targetClient != nil && targetClient .Status == common .DisconnectedSmtpClientStatus ) {
65
+ logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d can't find free smtp client for %s" , c .id , event .Message .Id , mxServer .hostname )
66
+ c .createSmtpClient (mxServer , event , & targetClient )
67
+ if targetClient == nil {
68
+ logger .By (event .Message .HostnameFrom ).Warn ("connector#%d-%d client created byt not assigned" , c .id , event .Message .Id )
69
+ continue
70
+ }
71
+ }
69
72
70
- if targetClient != nil {
71
- break
73
+ if targetClient == nil {
74
+ logger .By (event .Message .HostnameFrom ).Warn ("connector#%d-%d client is not created" , c .id , event .Message .Id )
75
+ continue
76
+ }
72
77
}
73
- }
74
78
75
- // если клиент не создан, значит мы создали максимум соединений к почтовому сервису
76
- if targetClient == nil {
77
- // приостановим работу горутины
78
- goto waitConnect
79
- } else {
80
- targetClient .Wakeup ()
81
- event .Client = targetClient
82
- // передаем событие отправителю
83
- next := event .Iterator .Next ()
84
- if next != nil {
85
- next .(common.SendingService ).Event (event .SendEvent )
79
+ // если клиент не создан, значит мы создали максимум соединений к почтовому сервису
80
+ if targetClient == nil {
81
+ // приостановим работу горутины
82
+ logger .By (event .Message .HostnameFrom ).Warn ("connector#%d-%d no free smtp client" , c .id , event .Message .Id )
83
+
84
+ if event .TryCount >= common .MaxTryConnectionCount {
85
+ mailer .ReturnMail (
86
+ event .SendEvent ,
87
+ errors .New (fmt .Sprintf ("connector#%d can't connect to %s" , c .id , event .Message .HostnameTo )),
88
+ )
89
+ break
90
+ }
91
+
92
+ logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d can't find free connections, wait..." , c .id , event .Message .Id )
93
+ time .Sleep (common .App .Timeout ().Sleep )
94
+ continue
95
+ } else {
96
+ logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d next event" , c .id , event .Message .Id )
97
+ targetClient .Wakeup ()
98
+ event .Client = targetClient
99
+ // передаем событие отправителю
100
+ next := event .Iterator .Next ()
101
+ if next != nil {
102
+ next .(common.SendingService ).Event (event .SendEvent )
103
+ }
86
104
}
87
- }
88
- return
89
105
90
- waitConnect:
91
- if event .TryCount >= common .MaxTryConnectionCount {
92
- mailer .ReturnMail (
93
- event .SendEvent ,
94
- errors .New (fmt .Sprintf ("connector#%d can't connect to %s" , c .id , event .Message .HostnameTo )),
95
- )
96
- } else {
97
- logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d can't find free connections, wait..." , c .id , event .Message .Id )
98
- time .Sleep (common .App .Timeout ().Sleep )
99
- goto receiveConnect
106
+ return
100
107
}
101
- return
102
108
}
103
109
104
110
// создает соединение к почтовому сервису
@@ -138,6 +144,7 @@ func (c *Connector) createSmtpClient(mxServer *MxServer, event *ConnectionEvent,
138
144
logger .By (event .Message .HostnameFrom ).WarnWithErr (err , "can't set connection deadline to %s" , time .Now ().Add (common .App .Timeout ().Hello ))
139
145
}
140
146
147
+ logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d create client to %s" , c .id , event .Message .Id , mxServer .hostname )
141
148
client , err := smtp .NewClient (connection , mxServer .hostname )
142
149
if err != nil {
143
150
// если не удалось создать клиента,
@@ -152,7 +159,7 @@ func (c *Connector) createSmtpClient(mxServer *MxServer, event *ConnectionEvent,
152
159
return
153
160
}
154
161
155
- logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d create client to %s" , c .id , event .Message .Id , mxServer . hostname )
162
+ logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d send command HELLO: %s" , c .id , event .Message .Id , event . Message . HostnameFrom )
156
163
err = client .Hello (service .getHostname (event .Message .HostnameFrom ))
157
164
if err != nil {
158
165
if err := client .Quit (); err != nil {
@@ -163,7 +170,6 @@ func (c *Connector) createSmtpClient(mxServer *MxServer, event *ConnectionEvent,
163
170
return
164
171
}
165
172
166
- logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d send command HELLO: %s" , c .id , event .Message .Id , event .Message .HostnameFrom )
167
173
// проверяем доступно ли TLS
168
174
if mxServer .useTLS {
169
175
mxServer .useTLS , _ = client .Extension ("STARTTLS" )
@@ -224,8 +230,22 @@ func (c *Connector) initSmtpClient(mxServer *MxServer, event *ConnectionEvent, p
224
230
smtpClient .Worker = client
225
231
smtpClient .ModifyDate = time .Now ()
226
232
if isNil {
227
- logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d create smtp client#%d for %s" , c .id , event .Message .Id , smtpClient .Id , mxServer .hostname )
233
+ logger .By (event .Message .HostnameFrom ).Debug (
234
+ "connector#%d-%d create smtp client#%d for %s status: %d" ,
235
+ c .id ,
236
+ event .Message .Id ,
237
+ smtpClient .Id ,
238
+ mxServer .hostname ,
239
+ smtpClient .Status ,
240
+ )
228
241
} else {
229
- logger .By (event .Message .HostnameFrom ).Debug ("connector#%d-%d reopen smtp client#%d for %s" , c .id , event .Message .Id , smtpClient .Id , mxServer .hostname )
242
+ logger .By (event .Message .HostnameFrom ).Debug (
243
+ "connector#%d-%d reopen smtp client#%d for %s status: %d" ,
244
+ c .id ,
245
+ event .Message .Id ,
246
+ smtpClient .Id ,
247
+ mxServer .hostname ,
248
+ smtpClient .Status ,
249
+ )
230
250
}
231
251
}
0 commit comments