3
3
* Copyright © Magento, Inc. All rights reserved.
4
4
* See COPYING.txt for license details.
5
5
*/
6
+ declare (strict_types=1 );
7
+
6
8
namespace Magento \Newsletter \Model \Queue ;
7
9
8
10
use Magento \Email \Model \AbstractTemplate ;
11
+ use Magento \Framework \Exception \MailException ;
12
+ use Magento \Framework \Mail \EmailMessageInterfaceFactory ;
13
+ use Magento \Framework \Mail \AddressConverter ;
14
+ use Magento \Framework \Mail \MessageInterface ;
15
+ use Magento \Framework \Mail \MessageInterfaceFactory ;
16
+ use Magento \Framework \Mail \MimeMessageInterfaceFactory ;
17
+ use Magento \Framework \Mail \MimePartInterfaceFactory ;
18
+ use Magento \Framework \Mail \Template \FactoryInterface ;
19
+ use Magento \Framework \Mail \Template \SenderResolverInterface ;
20
+ use Magento \Framework \Mail \TemplateInterface ;
21
+ use Magento \Framework \Mail \TransportInterfaceFactory ;
22
+ use Magento \Framework \ObjectManagerInterface ;
9
23
24
+ /**
25
+ * Class TransportBuilder
26
+ *
27
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
28
+ */
10
29
class TransportBuilder extends \Magento \Framework \Mail \Template \TransportBuilder
11
30
{
12
31
/**
@@ -16,6 +35,194 @@ class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder
16
35
*/
17
36
protected $ templateData = [];
18
37
38
+ /**
39
+ * Param that used for storing all message data until it will be used
40
+ *
41
+ * @var array
42
+ */
43
+ private $ messageData = [];
44
+
45
+ /**
46
+ * @var EmailMessageInterfaceFactory
47
+ */
48
+ private $ emailMessageInterfaceFactory ;
49
+
50
+ /**
51
+ * @var MimeMessageInterfaceFactory
52
+ */
53
+ private $ mimeMessageInterfaceFactory ;
54
+
55
+ /**
56
+ * @var MimePartInterfaceFactory
57
+ */
58
+ private $ mimePartInterfaceFactory ;
59
+
60
+ /**
61
+ * @var AddressConverter|null
62
+ */
63
+ private $ addressConverter ;
64
+
65
+ /**
66
+ * TransportBuilder constructor
67
+ *
68
+ * @param FactoryInterface $templateFactory
69
+ * @param MessageInterface $message
70
+ * @param SenderResolverInterface $senderResolver
71
+ * @param ObjectManagerInterface $objectManager
72
+ * @param TransportInterfaceFactory $mailTransportFactory
73
+ * @param MessageInterfaceFactory|null $messageFactory
74
+ * @param EmailMessageInterfaceFactory|null $emailMessageInterfaceFactory
75
+ * @param MimeMessageInterfaceFactory|null $mimeMessageInterfaceFactory
76
+ * @param MimePartInterfaceFactory|null $mimePartInterfaceFactory
77
+ * @param AddressConverter|null $addressConverter
78
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
79
+ * @SuppressWarnings(PHPMD.ExcessiveParameterList)
80
+ */
81
+ public function __construct (
82
+ FactoryInterface $ templateFactory ,
83
+ MessageInterface $ message ,
84
+ SenderResolverInterface $ senderResolver ,
85
+ ObjectManagerInterface $ objectManager ,
86
+ TransportInterfaceFactory $ mailTransportFactory ,
87
+ MessageInterfaceFactory $ messageFactory = null ,
88
+ EmailMessageInterfaceFactory $ emailMessageInterfaceFactory = null ,
89
+ MimeMessageInterfaceFactory $ mimeMessageInterfaceFactory = null ,
90
+ MimePartInterfaceFactory $ mimePartInterfaceFactory = null ,
91
+ AddressConverter $ addressConverter = null
92
+ ) {
93
+ parent ::__construct (
94
+ $ templateFactory ,
95
+ $ message ,
96
+ $ senderResolver ,
97
+ $ objectManager ,
98
+ $ mailTransportFactory ,
99
+ $ messageFactory ,
100
+ $ emailMessageInterfaceFactory ,
101
+ $ mimeMessageInterfaceFactory ,
102
+ $ mimePartInterfaceFactory ,
103
+ $ addressConverter
104
+ );
105
+ $ this ->emailMessageInterfaceFactory = $ emailMessageInterfaceFactory ?: $ this ->objectManager
106
+ ->get (EmailMessageInterfaceFactory::class);
107
+ $ this ->mimeMessageInterfaceFactory = $ mimeMessageInterfaceFactory ?: $ this ->objectManager
108
+ ->get (MimeMessageInterfaceFactory::class);
109
+ $ this ->mimePartInterfaceFactory = $ mimePartInterfaceFactory ?: $ this ->objectManager
110
+ ->get (MimePartInterfaceFactory::class);
111
+ $ this ->addressConverter = $ addressConverter ?: $ this ->objectManager
112
+ ->get (AddressConverter::class);
113
+ }
114
+
115
+ /**
116
+ * Add cc address
117
+ *
118
+ * @param array|string $address
119
+ * @param string $name
120
+ *
121
+ * @return \Magento\Framework\Mail\Template\TransportBuilder
122
+ * @throws MailException
123
+ */
124
+ public function addCc ($ address , $ name = '' )
125
+ {
126
+ $ this ->addAddressByType ('cc ' , $ address , $ name );
127
+
128
+ return $ this ;
129
+ }
130
+
131
+ /**
132
+ * Add to address
133
+ *
134
+ * @param array|string $address
135
+ * @param string $name
136
+ *
137
+ * @return $this
138
+ * @throws MailException
139
+ */
140
+ public function addTo ($ address , $ name = '' )
141
+ {
142
+ $ this ->addAddressByType ('to ' , $ address , $ name );
143
+
144
+ return $ this ;
145
+ }
146
+
147
+ /**
148
+ * Add bcc address
149
+ *
150
+ * @param array|string $address
151
+ *
152
+ * @return $this
153
+ * @throws MailException
154
+ */
155
+ public function addBcc ($ address )
156
+ {
157
+ $ this ->addAddressByType ('bcc ' , $ address );
158
+
159
+ return $ this ;
160
+ }
161
+
162
+ /**
163
+ * Set Reply-To Header
164
+ *
165
+ * @param string $email
166
+ * @param string|null $name
167
+ *
168
+ * @return $this
169
+ * @throws MailException
170
+ */
171
+ public function setReplyTo ($ email , $ name = null )
172
+ {
173
+
174
+ $ this ->addAddressByType ('replyTo ' , $ email , $ name );
175
+
176
+ return $ this ;
177
+ }
178
+
179
+ /**
180
+ * Set mail from address
181
+ *
182
+ * @param string|array $from
183
+ *
184
+ * @return $this
185
+ * @throws MailException
186
+ * @see setFromByScope()
187
+ *
188
+ * @deprecated This function sets the from address but does not provide
189
+ * a way of setting the correct from addresses based on the scope.
190
+ */
191
+ public function setFrom ($ from )
192
+ {
193
+ return $ this ->setFromByScope ($ from );
194
+ }
195
+
196
+ /**
197
+ * Set mail from address by scopeId
198
+ *
199
+ * @param string|array $from
200
+ * @param string|int $scopeId
201
+ *
202
+ * @return $this
203
+ * @throws MailException
204
+ */
205
+ public function setFromByScope ($ from , $ scopeId = null )
206
+ {
207
+ $ result = $ this ->_senderResolver ->resolve ($ from , $ scopeId );
208
+ $ this ->addAddressByType ('from ' , $ result ['email ' ], $ result ['name ' ]);
209
+
210
+ return $ this ;
211
+ }
212
+
213
+ /**
214
+ * @inheritDoc
215
+ */
216
+ protected function reset ()
217
+ {
218
+ $ this ->messageData = [];
219
+ $ this ->templateIdentifier = null ;
220
+ $ this ->templateVars = null ;
221
+ $ this ->templateOptions = null ;
222
+
223
+ return $ this ;
224
+ }
225
+
19
226
/**
20
227
* Set template data
21
228
*
@@ -25,11 +232,15 @@ class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder
25
232
public function setTemplateData ($ data )
26
233
{
27
234
$ this ->templateData = $ data ;
235
+
28
236
return $ this ;
29
237
}
30
238
31
239
/**
240
+ * Sets up template filter
241
+ *
32
242
* @param AbstractTemplate $template
243
+ *
33
244
* @return void
34
245
*/
35
246
protected function setTemplateFilter (AbstractTemplate $ template )
@@ -44,16 +255,44 @@ protected function setTemplateFilter(AbstractTemplate $template)
44
255
*/
45
256
protected function prepareMessage ()
46
257
{
47
- /** @var AbstractTemplate $template */
258
+ /** @var AbstractTemplate|TemplateInterface $template */
48
259
$ template = $ this ->getTemplate ()->setData ($ this ->templateData );
49
260
$ this ->setTemplateFilter ($ template );
261
+ $ content = $ template ->getProcessedTemplate ($ this ->templateVars );
262
+ $ this ->messageData ['subject ' ] = $ template ->getSubject ();
50
263
51
- $ this ->message ->setBodyHtml (
52
- $ template ->getProcessedTemplate ($ this ->templateVars )
53
- )->setSubject (
54
- $ template ->getSubject ()
264
+ $ mimePart = $ this ->mimePartInterfaceFactory ->create (
265
+ ['content ' => $ content ]
266
+ );
267
+ $ this ->messageData ['body ' ] = $ this ->mimeMessageInterfaceFactory ->create (
268
+ ['parts ' => [$ mimePart ]]
55
269
);
56
270
271
+ $ this ->message = $ this ->emailMessageInterfaceFactory ->create ($ this ->messageData );
272
+
57
273
return $ this ;
58
274
}
275
+
276
+ /**
277
+ * Handles possible incoming types of email (string or array)
278
+ *
279
+ * @param string $addressType
280
+ * @param string|array $email
281
+ * @param string|null $name
282
+ *
283
+ * @return void
284
+ * @throws MailException
285
+ */
286
+ private function addAddressByType (string $ addressType , $ email , ?string $ name = null ): void
287
+ {
288
+ if (is_array ($ email )) {
289
+ $ this ->messageData [$ addressType ] = array_merge (
290
+ $ this ->messageData [$ addressType ],
291
+ $ this ->addressConverter ->convertMany ($ email )
292
+ );
293
+
294
+ return ;
295
+ }
296
+ $ this ->messageData [$ addressType ][] = $ this ->addressConverter ->convert ($ email , $ name );
297
+ }
59
298
}
0 commit comments