44 $this->_eventDispatcher = $dispatcher;
45 $this->_buffer = $buf;
64 $this->_domain = $domain;
86 $this->_sourceIp = $source;
104 if (!$this->_started) {
105 if ($evt = $this->_eventDispatcher->createTransportChangeEvent($this)) {
106 $this->_eventDispatcher->dispatchEvent($evt,
'beforeTransportStarted');
107 if ($evt->bubbleCancelled()) {
121 $this->_eventDispatcher->dispatchEvent($evt,
'transportStarted');
124 $this->_started =
true;
152 $failedRecipients = (array) $failedRecipients;
154 if ($evt = $this->_eventDispatcher->createSendEvent($this, $message)) {
155 $this->_eventDispatcher->dispatchEvent($evt,
'beforeSendPerformed');
156 if ($evt->bubbleCancelled()) {
163 'Cannot send message without a sender address'
168 $to = (array) $message->
getTo();
169 $cc = (array) $message->
getCc();
170 $tos = array_merge($to, $cc);
171 $bcc = (array) $message->
getBcc();
173 $message->
setBcc(array());
176 $sent += $this->
_sendTo($message, $reversePath, $tos, $failedRecipients);
177 $sent += $this->
_sendBcc($message, $reversePath, $bcc, $failedRecipients);
178 }
catch (Exception $e) {
186 if ($sent == count($to) + count($cc) + count($bcc)) {
193 $evt->setFailedRecipients($failedRecipients);
194 $this->_eventDispatcher->dispatchEvent($evt,
'sendPerformed');
207 if ($this->_started) {
208 if ($evt = $this->_eventDispatcher->createTransportChangeEvent($this)) {
209 $this->_eventDispatcher->dispatchEvent($evt,
'beforeTransportStopped');
210 if ($evt->bubbleCancelled()) {
221 $this->_buffer->terminate();
224 $this->_eventDispatcher->dispatchEvent($evt,
'transportStopped');
230 $this->_started =
false;
240 $this->_eventDispatcher->bindEventListener($plugin);
275 $failures = (array) $failures;
276 $seq = $this->_buffer->write($command);
278 if ($evt = $this->_eventDispatcher->createCommandEvent($this, $command, $codes)) {
279 $this->_eventDispatcher->dispatchEvent($evt,
'commandSent');
296 sprintf(
"HELO %s\r\n", $this->_domain), array(250)
304 sprintf(
"MAIL FROM:<%s>\r\n", $address), array(250)
312 sprintf(
"RCPT TO:<%s>\r\n", $address), array(250, 251, 252)
325 $this->_buffer->setWriteTranslations(array(
"\r\n." =>
"\r\n.."));
328 $this->_buffer->flushBuffers();
332 $this->_buffer->setWriteTranslations(array());
343 if (!empty($return)) {
345 }
elseif (!empty($sender)) {
348 $path = key($sender);
349 }
elseif (!empty($from)) {
360 if ($evt = $this->_eventDispatcher->createTransportExceptionEvent($this, $e)) {
361 $this->_eventDispatcher->dispatchEvent($evt,
'exceptionThrown');
362 if (!$evt->bubbleCancelled()) {
374 $valid = (empty($wanted) || in_array($code, $wanted));
376 if ($evt = $this->_eventDispatcher->createResponseEvent($this,
$response,
378 $this->_eventDispatcher->dispatchEvent($evt,
'responseReceived');
384 'Expected response code '.implode(
'/', $wanted).
' but got code '.
385 '"'.$code.
'", with message "'.
$response.
'"',
397 $line = $this->_buffer->readLine($seq);
399 }
while (null !== $line &&
false !== $line &&
' ' != $line{3});
413 private function _doMailTransaction($message, $reversePath, array $recipients, array &$failedRecipients)
417 foreach ($recipients as $forwardPath) {
422 $failedRecipients[] = $forwardPath;
451 foreach ($bcc as $forwardPath => $name) {
452 $message->
setBcc(array($forwardPath => $name));
454 $message, $reversePath, array($forwardPath), $failedRecipients
464 if (!empty($_SERVER[
'SERVER_NAME'])
465 && $this->
_isFqdn($_SERVER[
'SERVER_NAME'])) {
466 $this->_domain = $_SERVER[
'SERVER_NAME'];
467 }
elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
468 $this->_domain = sprintf(
'[%s]', $_SERVER[
'SERVER_ADDR']);
476 if (
false !== $dotPos = strpos($hostname,
'.')) {
477 return ($dotPos > 0) && ($dotPos != strlen($hostname) - 1);