Вход Регистрация
Файл: protected/extensions/yii-mail/vendors/swiftMailer/classes/Swift/Transport/MailTransport.php
Строк: 214
<?php

/*
 * This file is part of SwiftMailer.
 * (c) 2004-2009 Chris Corbyn
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

//@require 'Swift/Transport.php';
//@require 'Swift/Transport/MailInvoker.php';
//@require 'Swift/Mime/Message.php';
//@require 'Swift/Events/EventListener.php';

/**
 * Sends Messages using the mail() function.
 * 
 * It is advised that users do not use this transport if at all possible
 * since a number of plugin features cannot be used in conjunction with this
 * transport due to the internal interface in PHP itself.
 * 
 * The level of error reporting with this transport is incredibly weak, again
 * due to limitations of PHP's internal mail() function.  You'll get an
 * all-or-nothing result from sending.
 * 
 * @package Swift
 * @subpackage Transport
 * @author Chris Corbyn
 */
class Swift_Transport_MailTransport implements Swift_Transport
{

  
/** Addtional parameters to pass to mail() */
  
private $_extraParams '-f%s';
  
  
/** The event dispatcher from the plugin API */
  
private $_eventDispatcher;
  
  
/** An invoker that calls the mail() function */
  
private $_invoker;
  
  
/**
   * Create a new MailTransport with the $log.
   * @param Swift_Transport_Log $log
   */
  
public function __construct(Swift_Transport_MailInvoker $invoker,
    
Swift_Events_EventDispatcher $eventDispatcher)
  {
    
$this->_invoker $invoker;
    
$this->_eventDispatcher $eventDispatcher;
  }
  
  
/**
   * Not used.
   */
  
public function isStarted()
  {
    return 
false;
  }
  
  
/**
   * Not used.
   */
  
public function start()
  {
  }
  
  
/**
   * Not used.
   */
  
public function stop()
  {
  }
  
  
/**
   * Set the additional parameters used on the mail() function.
   * 
   * This string is formatted for sprintf() where %s is the sender address.
   * 
   * @param string $params
   */
  
public function setExtraParams($params)
  {
    
$this->_extraParams $params;
    return 
$this;
  }
  
  
/**
   * Get the additional parameters used on the mail() function.
   * 
   * This string is formatted for sprintf() where %s is the sender address.
   * 
   * @return string
   */
  
public function getExtraParams()
  {
    return 
$this->_extraParams;
  }
  
  
/**
   * Send the given Message.
   * 
   * Recipient/sender data will be retreived from the Message API.
   * The return value is the number of recipients who were accepted for delivery.
   * 
   * @param Swift_Mime_Message $message
   * @param string[] &$failedRecipients to collect failures by-reference
   * @return int
   */
  
public function send(Swift_Mime_Message $message, &$failedRecipients null)
  {
    
$failedRecipients = (array) $failedRecipients;
    
    if (
$evt $this->_eventDispatcher->createSendEvent($this$message))
    {
      
$this->_eventDispatcher->dispatchEvent($evt'beforeSendPerformed');
      if (
$evt->bubbleCancelled())
      {
        return 
0;
      }
    }
    
    
$count = (
      
count((array) $message->getTo())
      + 
count((array) $message->getCc())
      + 
count((array) $message->getBcc())
      );
    
    
$toHeader $message->getHeaders()->get('To');
    
$subjectHeader $message->getHeaders()->get('Subject');
    
    
$to $toHeader->getFieldBody();
    
$subject $subjectHeader->getFieldBody();
    
    
$reversePath $this->_getReversePath($message);
    
    
//Remove headers that would otherwise be duplicated
    
$message->getHeaders()->remove('To');
    
$message->getHeaders()->remove('Subject');
    
    
$messageStr $message->toString();
    
    
$message->getHeaders()->set($toHeader);
    
$message->getHeaders()->set($subjectHeader);
    
    
//Separate headers from body
    
if (false !== $endHeaders strpos($messageStr"rnrn"))
    {
      
$headers substr($messageStr0$endHeaders) . "rn"//Keep last EOL
      
$body substr($messageStr$endHeaders 4);
    }
    else
    {
      
$headers $messageStr "rn";
      
$body '';
    }
    
    unset(
$messageStr);
    
    if (
"rn" != PHP_EOL//Non-windows (not using SMTP)
    
{
      
$headers str_replace("rn"PHP_EOL$headers);
      
$body str_replace("rn"PHP_EOL$body);
    }
    else 
//Windows, using SMTP
    
{
      
$headers str_replace("rn.""rn.."$headers);
      
$body str_replace("rn.""rn.."$body);
    }
    
    if (
$this->_invoker->mail($to$subject$body$headers,
      
sprintf($this->_extraParams$reversePath)))
    {
      if (
$evt)
      {
        
$evt->setResult(Swift_Events_SendEvent::RESULT_SUCCESS);
        
$evt->setFailedRecipients($failedRecipients);
        
$this->_eventDispatcher->dispatchEvent($evt'sendPerformed');
      }
    }
    else
    {
      
$failedRecipients array_merge(
        
$failedRecipients,
        
array_keys((array) $message->getTo()),
        
array_keys((array) $message->getCc()),
        
array_keys((array) $message->getBcc())
        );
      
      if (
$evt)
      {
        
$evt->setResult(Swift_Events_SendEvent::RESULT_FAILED);
        
$evt->setFailedRecipients($failedRecipients);
        
$this->_eventDispatcher->dispatchEvent($evt'sendPerformed');
      }
      
      
$message->generateId();
      
      
$count 0;
    }
    
    return 
$count;
  }
  
  
/**
   * Register a plugin.
   * 
   * @param Swift_Events_EventListener $plugin
   */
  
public function registerPlugin(Swift_Events_EventListener $plugin)
  {
    
$this->_eventDispatcher->bindEventListener($plugin);
  }
  
  
// -- Private methods
  
  /** Determine the best-use reverse path for this message */
  
private function _getReversePath(Swift_Mime_Message $message)
  {
    
$return $message->getReturnPath();
    
$sender $message->getSender();
    
$from $message->getFrom();
    
$path null;
    if (!empty(
$return))
    {
      
$path $return;
    }
    elseif (!empty(
$sender))
    {
      
$keys array_keys($sender);
      
$path array_shift($keys);
    }
    elseif (!empty(
$from))
    {
      
$keys array_keys($from);
      
$path array_shift($keys);
    }
    return 
$path;
  }
  
}
Онлайн: 2
Реклама