/Front_End/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/MailTransport.php

https://gitlab.com/Sigpot/AirSpot · PHP · 257 lines · 139 code · 34 blank · 84 comment · 18 complexity · dd1078357a3751d169585a2d9df4dcc1 MD5 · raw file

  1. <?php
  2. /*
  3. * This file is part of SwiftMailer.
  4. * (c) 2004-2009 Chris Corbyn
  5. *
  6. * For the full copyright and license information, please view the LICENSE
  7. * file that was distributed with this source code.
  8. */
  9. /**
  10. * Sends Messages using the mail() function.
  11. *
  12. * It is advised that users do not use this transport if at all possible
  13. * since a number of plugin features cannot be used in conjunction with this
  14. * transport due to the internal interface in PHP itself.
  15. *
  16. * The level of error reporting with this transport is incredibly weak, again
  17. * due to limitations of PHP's internal mail() function. You'll get an
  18. * all-or-nothing result from sending.
  19. *
  20. * @author Chris Corbyn
  21. */
  22. class Swift_Transport_MailTransport implements Swift_Transport
  23. {
  24. /** Additional parameters to pass to mail() */
  25. private $_extraParams = '-f%s';
  26. /** The event dispatcher from the plugin API */
  27. private $_eventDispatcher;
  28. /** An invoker that calls the mail() function */
  29. private $_invoker;
  30. /**
  31. * Create a new MailTransport with the $log.
  32. *
  33. * @param Swift_Transport_MailInvoker $invoker
  34. * @param Swift_Events_EventDispatcher $eventDispatcher
  35. */
  36. public function __construct(Swift_Transport_MailInvoker $invoker, Swift_Events_EventDispatcher $eventDispatcher)
  37. {
  38. $this->_invoker = $invoker;
  39. $this->_eventDispatcher = $eventDispatcher;
  40. }
  41. /**
  42. * Not used.
  43. */
  44. public function isStarted()
  45. {
  46. return false;
  47. }
  48. /**
  49. * Not used.
  50. */
  51. public function start()
  52. {
  53. }
  54. /**
  55. * Not used.
  56. */
  57. public function stop()
  58. {
  59. }
  60. /**
  61. * Set the additional parameters used on the mail() function.
  62. *
  63. * This string is formatted for sprintf() where %s is the sender address.
  64. *
  65. * @param string $params
  66. *
  67. * @return Swift_Transport_MailTransport
  68. */
  69. public function setExtraParams($params)
  70. {
  71. $this->_extraParams = $params;
  72. return $this;
  73. }
  74. /**
  75. * Get the additional parameters used on the mail() function.
  76. *
  77. * This string is formatted for sprintf() where %s is the sender address.
  78. *
  79. * @return string
  80. */
  81. public function getExtraParams()
  82. {
  83. return $this->_extraParams;
  84. }
  85. /**
  86. * Send the given Message.
  87. *
  88. * Recipient/sender data will be retrieved from the Message API.
  89. * The return value is the number of recipients who were accepted for delivery.
  90. *
  91. * @param Swift_Mime_Message $message
  92. * @param string[] $failedRecipients An array of failures by-reference
  93. *
  94. * @return int
  95. */
  96. public function send(Swift_Mime_Message $message, &$failedRecipients = null)
  97. {
  98. $failedRecipients = (array) $failedRecipients;
  99. if ($evt = $this->_eventDispatcher->createSendEvent($this, $message)) {
  100. $this->_eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed');
  101. if ($evt->bubbleCancelled()) {
  102. return 0;
  103. }
  104. }
  105. $count = (
  106. count((array) $message->getTo())
  107. + count((array) $message->getCc())
  108. + count((array) $message->getBcc())
  109. );
  110. $toHeader = $message->getHeaders()->get('To');
  111. $subjectHeader = $message->getHeaders()->get('Subject');
  112. if (0 === $count) {
  113. $this->_throwException(new Swift_TransportException('Cannot send message without a recipient'));
  114. }
  115. $to = $toHeader ? $toHeader->getFieldBody() : '';
  116. $subject = $subjectHeader ? $subjectHeader->getFieldBody() : '';
  117. $reversePath = $this->_getReversePath($message);
  118. // Remove headers that would otherwise be duplicated
  119. $message->getHeaders()->remove('To');
  120. $message->getHeaders()->remove('Subject');
  121. $messageStr = $message->toString();
  122. if ($toHeader) {
  123. $message->getHeaders()->set($toHeader);
  124. }
  125. $message->getHeaders()->set($subjectHeader);
  126. // Separate headers from body
  127. if (false !== $endHeaders = strpos($messageStr, "\r\n\r\n")) {
  128. $headers = substr($messageStr, 0, $endHeaders)."\r\n"; //Keep last EOL
  129. $body = substr($messageStr, $endHeaders + 4);
  130. } else {
  131. $headers = $messageStr."\r\n";
  132. $body = '';
  133. }
  134. unset($messageStr);
  135. if ("\r\n" != PHP_EOL) {
  136. // Non-windows (not using SMTP)
  137. $headers = str_replace("\r\n", PHP_EOL, $headers);
  138. $subject = str_replace("\r\n", PHP_EOL, $subject);
  139. $body = str_replace("\r\n", PHP_EOL, $body);
  140. } else {
  141. // Windows, using SMTP
  142. $headers = str_replace("\r\n.", "\r\n..", $headers);
  143. $subject = str_replace("\r\n.", "\r\n..", $subject);
  144. $body = str_replace("\r\n.", "\r\n..", $body);
  145. }
  146. if ($this->_invoker->mail($to, $subject, $body, $headers, $this->_formatExtraParams($this->_extraParams, $reversePath))) {
  147. if ($evt) {
  148. $evt->setResult(Swift_Events_SendEvent::RESULT_SUCCESS);
  149. $evt->setFailedRecipients($failedRecipients);
  150. $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed');
  151. }
  152. } else {
  153. $failedRecipients = array_merge(
  154. $failedRecipients,
  155. array_keys((array) $message->getTo()),
  156. array_keys((array) $message->getCc()),
  157. array_keys((array) $message->getBcc())
  158. );
  159. if ($evt) {
  160. $evt->setResult(Swift_Events_SendEvent::RESULT_FAILED);
  161. $evt->setFailedRecipients($failedRecipients);
  162. $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed');
  163. }
  164. $message->generateId();
  165. $count = 0;
  166. }
  167. return $count;
  168. }
  169. /**
  170. * Register a plugin.
  171. *
  172. * @param Swift_Events_EventListener $plugin
  173. */
  174. public function registerPlugin(Swift_Events_EventListener $plugin)
  175. {
  176. $this->_eventDispatcher->bindEventListener($plugin);
  177. }
  178. /** Throw a TransportException, first sending it to any listeners */
  179. protected function _throwException(Swift_TransportException $e)
  180. {
  181. if ($evt = $this->_eventDispatcher->createTransportExceptionEvent($this, $e)) {
  182. $this->_eventDispatcher->dispatchEvent($evt, 'exceptionThrown');
  183. if (!$evt->bubbleCancelled()) {
  184. throw $e;
  185. }
  186. } else {
  187. throw $e;
  188. }
  189. }
  190. /** Determine the best-use reverse path for this message */
  191. private function _getReversePath(Swift_Mime_Message $message)
  192. {
  193. $return = $message->getReturnPath();
  194. $sender = $message->getSender();
  195. $from = $message->getFrom();
  196. $path = null;
  197. if (!empty($return)) {
  198. $path = $return;
  199. } elseif (!empty($sender)) {
  200. $keys = array_keys($sender);
  201. $path = array_shift($keys);
  202. } elseif (!empty($from)) {
  203. $keys = array_keys($from);
  204. $path = array_shift($keys);
  205. }
  206. return $path;
  207. }
  208. /**
  209. * Return php mail extra params to use for invoker->mail.
  210. *
  211. * @param $extraParams
  212. * @param $reversePath
  213. *
  214. * @return string|null
  215. */
  216. private function _formatExtraParams($extraParams, $reversePath)
  217. {
  218. if (false !== strpos($extraParams, '-f%s')) {
  219. $extraParams = empty($reversePath) ? str_replace('-f%s', '', $extraParams) : sprintf($extraParams, escapeshellarg($reversePath));
  220. }
  221. return !empty($extraParams) ? $extraParams : null;
  222. }
  223. }