88use Swift_Mime_Attachment ;
99use Swift_Mime_SimpleMessage ;
1010use Swift_Transport ;
11+ use Swift_Events_EventDispatcher ;
12+ use Swift_Events_SendEvent ;
1113use Psr \Log \LoggerInterface ;
1214
1315class SendGridTransport implements Swift_Transport
@@ -58,27 +60,65 @@ class SendGridTransport implements Swift_Transport
5860 */
5961 private $ httpClientOptions ;
6062
61- public function __construct ($ sendGridApiKey , $ sendGridCategories )
63+ /** Connection status */
64+ protected $ started = false ;
65+
66+ /**
67+ * @var Swift_Events_EventDispatcher
68+ */
69+ private $ eventDispatcher ;
70+
71+ public function __construct (Swift_Events_EventDispatcher $ eventDispatcher , $ sendGridApiKey , $ sendGridCategories )
6272 {
73+ $ this ->eventDispatcher = $ eventDispatcher ;
6374 $ this ->sendGridApiKey = $ sendGridApiKey ;
6475 $ this ->sendGridCategories = $ sendGridCategories ;
6576 $ this ->httpClientOptions = [];
6677 }
6778
6879 public function isStarted ()
6980 {
70- //Not used
71- return true ;
81+ return $ this ->started ;
7282 }
7383
7484 public function start ()
7585 {
76- //Not used
86+ if (!$ this ->started ) {
87+ if ($ evt = $ this ->eventDispatcher ->createTransportChangeEvent ($ this )) {
88+ $ this ->eventDispatcher ->dispatchEvent ($ evt , 'beforeTransportStarted ' );
89+ if ($ evt ->bubbleCancelled ()) {
90+ return ;
91+ }
92+ }
93+
94+ //noop (transport does not need initialization)
95+
96+ if ($ evt ) {
97+ $ this ->eventDispatcher ->dispatchEvent ($ evt , 'transportStarted ' );
98+ }
99+
100+ $ this ->started = true ;
101+ }
77102 }
78103
79104 public function stop ()
80105 {
81- //Not used
106+ if ($ this ->started ) {
107+ if ($ evt = $ this ->eventDispatcher ->createTransportChangeEvent ($ this )) {
108+ $ this ->eventDispatcher ->dispatchEvent ($ evt , 'beforeTransportStopped ' );
109+ if ($ evt ->bubbleCancelled ()) {
110+ return ;
111+ }
112+ }
113+
114+ //noop (transport does not need to termintated)
115+
116+ if ($ evt ) {
117+ $ this ->eventDispatcher ->dispatchEvent ($ evt , 'transportStopped ' );
118+ }
119+ }
120+
121+ $ this ->started = false ;
82122 }
83123
84124 public function setLogger (LoggerInterface $ logger )
@@ -96,6 +136,13 @@ public function setLogger(LoggerInterface $logger)
96136 */
97137 public function send (Swift_Mime_SimpleMessage $ message , &$ failedRecipients = null )
98138 {
139+ if ($ evt = $ this ->eventDispatcher ->createSendEvent ($ this , $ message )) {
140+ $ this ->eventDispatcher ->dispatchEvent ($ evt , 'beforeSendPerformed ' );
141+ if ($ evt ->bubbleCancelled ()) {
142+ return 0 ;
143+ }
144+ }
145+
99146 // prepare fake data.
100147 $ sent = 0 ;
101148 $ prepareFailedRecipients = [];
@@ -193,6 +240,18 @@ public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = nul
193240 $ sent = 0 ;
194241 }
195242
243+ if ($ evt ) {
244+ if ($ sent == count ($ toArr ) + count ($ ccArr ) + count ($ bccArr )) {
245+ $ evt ->setResult (Swift_Events_SendEvent::RESULT_SUCCESS );
246+ } elseif ($ sent > 0 ) {
247+ $ evt ->setResult (Swift_Events_SendEvent::RESULT_TENTATIVE );
248+ } else {
249+ $ evt ->setResult (Swift_Events_SendEvent::RESULT_FAILED );
250+ }
251+ $ evt ->setFailedRecipients ($ failedRecipients );
252+ $ this ->eventDispatcher ->dispatchEvent ($ evt , 'sendPerformed ' );
253+ }
254+
196255 return $ sent ;
197256 }
198257
@@ -201,9 +260,12 @@ public function ping()
201260 return true ;
202261 }
203262
263+ /**
264+ * @param Swift_Events_EventListener $plugin
265+ */
204266 public function registerPlugin (Swift_Events_EventListener $ plugin )
205267 {
206- // unused
268+ $ this -> eventDispatcher -> bindEventListener ( $ plugin );
207269 }
208270
209271 /**
0 commit comments