TYPO3  7.6
Transport/MailTransport.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of SwiftMailer.
5  * (c) 2004-2009 Chris Corbyn
6  *
7  * For the full copyright and license information, please view the LICENSE
8  * file that was distributed with this source code.
9  */
10 
25 {
27  private $_extraParams = '-f%s';
28 
31 
33  private $_invoker;
34 
41  public function __construct(Swift_Transport_MailInvoker $invoker, Swift_Events_EventDispatcher $eventDispatcher)
42  {
43  $this->_invoker = $invoker;
44  $this->_eventDispatcher = $eventDispatcher;
45  }
46 
50  public function isStarted()
51  {
52  return false;
53  }
54 
58  public function start()
59  {
60  }
61 
65  public function stop()
66  {
67  }
68 
78  public function setExtraParams($params)
79  {
80  $this->_extraParams = $params;
81 
82  return $this;
83  }
84 
92  public function getExtraParams()
93  {
94  return $this->_extraParams;
95  }
96 
108  public function send(Swift_Mime_Message $message, &$failedRecipients = null)
109  {
110  $failedRecipients = (array) $failedRecipients;
111 
112  if ($evt = $this->_eventDispatcher->createSendEvent($this, $message)) {
113  $this->_eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed');
114  if ($evt->bubbleCancelled()) {
115  return 0;
116  }
117  }
118 
119  $count = (
120  count((array) $message->getTo())
121  + count((array) $message->getCc())
122  + count((array) $message->getBcc())
123  );
124 
125  $toHeader = $message->getHeaders()->get('To');
126  $subjectHeader = $message->getHeaders()->get('Subject');
127 
128  if (!$toHeader) {
129  $this->_throwException(new Swift_TransportException('Cannot send message without a recipient'));
130  }
131  $to = $toHeader->getFieldBody();
132  $subject = $subjectHeader ? $subjectHeader->getFieldBody() : '';
133 
134  $reversePath = $this->_getReversePath($message);
135 
136  // Remove headers that would otherwise be duplicated
137  $message->getHeaders()->remove('To');
138  $message->getHeaders()->remove('Subject');
139 
140  $messageStr = $message->toString();
141 
142  $message->getHeaders()->set($toHeader);
143  $message->getHeaders()->set($subjectHeader);
144 
145  // Separate headers from body
146  if (false !== $endHeaders = strpos($messageStr, "\r\n\r\n")) {
147  $headers = substr($messageStr, 0, $endHeaders)."\r\n"; //Keep last EOL
148  $body = substr($messageStr, $endHeaders + 4);
149  } else {
150  $headers = $messageStr."\r\n";
151  $body = '';
152  }
153 
154  unset($messageStr);
155 
156  if ("\r\n" != PHP_EOL) {
157  // Non-windows (not using SMTP)
158  $headers = str_replace("\r\n", PHP_EOL, $headers);
159  $body = str_replace("\r\n", PHP_EOL, $body);
160  } else {
161  // Windows, using SMTP
162  $headers = str_replace("\r\n.", "\r\n..", $headers);
163  $body = str_replace("\r\n.", "\r\n..", $body);
164  }
165 
166  if ($this->_invoker->mail($to, $subject, $body, $headers,
167  sprintf($this->_extraParams, $reversePath))) {
168  if ($evt) {
170  $evt->setFailedRecipients($failedRecipients);
171  $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed');
172  }
173  } else {
174  $failedRecipients = array_merge(
175  $failedRecipients,
176  array_keys((array) $message->getTo()),
177  array_keys((array) $message->getCc()),
178  array_keys((array) $message->getBcc())
179  );
180 
181  if ($evt) {
182  $evt->setResult(Swift_Events_SendEvent::RESULT_FAILED);
183  $evt->setFailedRecipients($failedRecipients);
184  $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed');
185  }
186 
187  $message->generateId();
188 
189  $count = 0;
190  }
191 
192  return $count;
193  }
194 
201  {
202  $this->_eventDispatcher->bindEventListener($plugin);
203  }
204 
207  {
208  if ($evt = $this->_eventDispatcher->createTransportExceptionEvent($this, $e)) {
209  $this->_eventDispatcher->dispatchEvent($evt, 'exceptionThrown');
210  if (!$evt->bubbleCancelled()) {
211  throw $e;
212  }
213  } else {
214  throw $e;
215  }
216  }
217 
219  private function _getReversePath(Swift_Mime_Message $message)
220  {
221  $return = $message->getReturnPath();
222  $sender = $message->getSender();
223  $from = $message->getFrom();
224  $path = null;
225  if (!empty($return)) {
226  $path = $return;
227  } elseif (!empty($sender)) {
228  $keys = array_keys($sender);
229  $path = array_shift($keys);
230  } elseif (!empty($from)) {
231  $keys = array_keys($from);
232  $path = array_shift($keys);
233  }
234 
235  return $path;
236  }
237 }