SMTP, help!

Swift Mailer is a fantastic library for sending email with php. Discuss this library or ask any questions about it here.

Moderators: Chris Corbyn, General Moderators

padlets
Forum Newbie
Posts: 8
Joined: Fri Apr 27, 2007 6:00 pm

SMTP, help!

Post by padlets »

Weirdan | Please use

Code: Select all

,

Code: Select all

and [syntax="..."] tags where appropriate when posting code. Your post has been edited to reflect how we'd like it posted. Please read:  [url=http://forums.devnetwork.net/viewtopic.php?t=21171]Posting Code in the Forums[/url] to learn how to do it too.[/color]


In my site mail() is disabled so i use the smtp mod but i the a problem.
when a user try register, the user get a messege that his successfuly register but the user don't
get any email to confirm his account.
I use TorrentTrader 1.06
please help!

that is the mod:

Code: Select all

//mod
//This sets up our connection object
$connection = new Swift_Connection_SMTP('smtp.gmail.com', Swift_Connection_SMTP::PORT_SECURE, Swift_Connection_SMTP::ENC_TLS); 

//The mailer will now establish a connection with the server
$connection->setUsername("XXXXX@gmail.com"); 
$connection->setPassword("XXXXX"); 
$mailer = new Swift($connection);

//Sends a simple email
$mailer->send(
$arr["email"],
"$SITENAME <$SITEEMAIL>",
"Your account details", 
"$body"
);
    
//Closes cleanly... works without this but it's not as polite.
$mailer->close();
//end mod

Weirdan | Please use

Code: Select all

,

Code: Select all

and [syntax="..."] tags where appropriate when posting code. Your post has been edited to reflect how we'd like it posted. Please read:  [url=http://forums.devnetwork.net/viewtopic.php?t=21171]Posting Code in the Forums[/url] to learn how to do it too.[/color]
User avatar
Chris Corbyn
Breakbeat Nuttzer
Posts: 13098
Joined: Wed Mar 24, 2004 7:57 am
Location: Melbourne, Australia

Post by Chris Corbyn »

You're using a mixture of version 2 code and version 3 code for the Swift Mailer stuff. Read the documentation rather than any examples you have found on other websites:

http://www.swiftmailer.org/wikidocs/
padlets
Forum Newbie
Posts: 8
Joined: Fri Apr 27, 2007 6:00 pm

Post by padlets »

can you tell me which part of the code is virsion 2?
i can't find the problem.
User avatar
Chris Corbyn
Breakbeat Nuttzer
Posts: 13098
Joined: Wed Mar 24, 2004 7:57 am
Location: Melbourne, Australia

Post by Chris Corbyn »

Code: Select all

//Sends a simple email 
$mailer->send( 
$arr["email"], 
"$SITENAME <$SITEEMAIL>", 
"Your account details", 
"$body" 
); 
    
//Closes cleanly... works without this but it's not as polite. 
$mailer->close(); 
//end mod
Should be:

Code: Select all

//Sends a simple email 
$mailer->send( 
  new Swift_Message("Your account details", $body),
  new Swift_Address($arr["email"]), 
 new Swift_Address($SITEEMAIL, $SITENAME)
); 

//Closes cleanly... works without this but it's not as polite. 
$mailer->disconnect(); 
//end mod
I'd also check the return value of send() to make sure it's TRUE ;)
padlets
Forum Newbie
Posts: 8
Joined: Fri Apr 27, 2007 6:00 pm

Post by padlets »

i get error:
Fatal error: Class 'Swift_Message' not found in /home/zendurl/public_html/directory/itorrent/account-signup.php on line 115

Code: Select all

//Sends a simple email 
$mailer->send( 
  new Swift_Message("Your account details", $body),  //line 115
  new Swift_Address($arr["email"]), 
 new Swift_Address($SITEEMAIL, $SITENAME) 
); 

//Closes cleanly... works without this but it's not as polite. 
$mailer->disconnect(); 
//end mod
User avatar
Chris Corbyn
Breakbeat Nuttzer
Posts: 13098
Joined: Wed Mar 24, 2004 7:57 am
Location: Melbourne, Australia

Post by Chris Corbyn »

Where did you download Swift Mailer from and how have you installed it? What version do you have?
padlets
Forum Newbie
Posts: 8
Joined: Fri Apr 27, 2007 6:00 pm

Post by padlets »

I download it from the Swift site and i upload the lib dir to my site.
Swift-3.1.5-php5
User avatar
Chris Corbyn
Breakbeat Nuttzer
Posts: 13098
Joined: Wed Mar 24, 2004 7:57 am
Location: Melbourne, Australia

Post by Chris Corbyn »

Did you include Swift.php?

Debug:

Code: Select all

print_r(get_declared_classes());
padlets
Forum Newbie
Posts: 8
Joined: Fri Apr 27, 2007 6:00 pm

Post by padlets »

i only add this code:

Code: Select all

require('lib/Swift.php');
require('lib/Swift/Connection/SMTP.php');
Do i need to add print_r(get_declared_classes()); too?
User avatar
John Cartwright
Site Admin
Posts: 11470
Joined: Tue Dec 23, 2003 2:10 am
Location: Toronto
Contact:

Post by John Cartwright »

No, thats just to see if all the classes were loaded.
padlets
Forum Newbie
Posts: 8
Joined: Fri Apr 27, 2007 6:00 pm

Post by padlets »

all the classes were loaded.
So what i need to do?
User avatar
Chris Corbyn
Breakbeat Nuttzer
Posts: 13098
Joined: Wed Mar 24, 2004 7:57 am
Location: Melbourne, Australia

Post by Chris Corbyn »

padlets wrote:all the classes were loaded.
So what i need to do?
Obviously they weren't or wouldn't be getting this error, which is why I need to see the result of get_declared_classes().
padlets
Forum Newbie
Posts: 8
Joined: Fri Apr 27, 2007 6:00 pm

Post by padlets »

Code: Select all

Array ( [0] => stdClass [1] => Exception [2] => ErrorException [3] => XMLWriter [4] => LibXMLError [5] => DOMException [6] => DOMStringList [7] => DOMNameList [8] => DOMImplementationList [9] => DOMImplementationSource [10] => DOMImplementation [11] => DOMNode [12] => DOMNameSpaceNode [13] => DOMDocumentFragment [14] => DOMDocument [15] => DOMNodeList [16] => DOMNamedNodeMap [17] => DOMCharacterData [18] => DOMAttr [19] => DOMElement [20] => DOMText [21] => DOMComment [22] => DOMTypeinfo [23] => DOMUserDataHandler [24] => DOMDomError [25] => DOMErrorHandler [26] => DOMLocator [27] => DOMConfiguration [28] => DOMCdataSection [29] => DOMDocumentType [30] => DOMNotation [31] => DOMEntity [32] => DOMEntityReference [33] => DOMProcessingInstruction [34] => DOMStringExtend [35] => DOMXPath [36] => XMLReader [37] => SimpleXMLElement [38] => RecursiveIteratorIterator [39] => IteratorIterator [40] => FilterIterator [41] => RecursiveFilterIterator [42] => ParentIterator [43] => LimitIterator [44] => CachingIterator [45] => RecursiveCachingIterator [46] => NoRewindIterator [47] => AppendIterator [48] => InfiniteIterator [49] => RegexIterator [50] => RecursiveRegexIterator [51] => EmptyIterator [52] => ArrayObject [53] => ArrayIterator [54] => RecursiveArrayIterator [55] => SplFileInfo [56] => DirectoryIterator [57] => RecursiveDirectoryIterator [58] => SplFileObject [59] => SplTempFileObject [60] => SimpleXMLIterator [61] => LogicException [62] => BadFunctionCallException [63] => BadMethodCallException [64] => DomainException [65] => InvalidArgumentException [66] => LengthException [67] => OutOfRangeException [68] => RuntimeException [69] => OutOfBoundsException [70] => OverflowException [71] => RangeException [72] => UnderflowException [73] => UnexpectedValueException [74] => SplObjectStorage [75] => PDOException [76] => PDO [77] => PDOStatement [78] => PDORow [79] => SQLiteDatabase [80] => SQLiteResult [81] => SQLiteUnbuffered [82] => SQLiteException [83] => __PHP_Incomplete_Class [84] => php_user_filter [85] => Directory [86] => ReflectionException [87] => Reflection [88] => ReflectionFunctionAbstract [89] => ReflectionFunction [90] => ReflectionParameter [91] => ReflectionMethod [92] => ReflectionClass [93] => ReflectionObject [94] => ReflectionProperty [95] => ReflectionExtension [96] => mysqli_sql_exception [97] => mysqli_driver [98] => mysqli [99] => mysqli_warning [100] => mysqli_result [101] => mysqli_stmt [102] => SWFShape [103] => SWFFill [104] => SWFGradient [105] => SWFBitmap [106] => SWFText [107] => SWFTextField [108] => SWFFont [109] => SWFDisplayItem [110] => SWFMovie [111] => SWFButton [112] => SWFAction [113] => SWFMorph [114] => SWFSprite [115] => SWFSound [116] => SWFFontChar [117] => SWFSoundInstance [118] => SWFVideoStream [119] => DateTime [120] => DateTimeZone [121] => DateTimeZone [122] => DateTime [123] => SWFVideoStream [124] => SWFSoundInstance [125] => SWFFontChar [126] => SWFSound [127] => SWFSprite [128] => SWFMorph [129] => SWFAction [130] => SWFButton [131] => SWFMovie [132] => SWFDisplayItem [133] => SWFFont [134] => SWFTextField [135] => SWFText [136] => SWFBitmap [137] => SWFGradient [138] => SWFFill [139] => SWFShape [140] => mysqli_stmt [141] => mysqli_result [142] => mysqli_warning [143] => mysqli [144] => mysqli_driver [145] => mysqli_sql_exception [146] => ReflectionExtension [147] => ReflectionProperty [148] => ReflectionObject [149] => ReflectionClass [150] => ReflectionMethod [151] => ReflectionParameter [152] => ReflectionFunction [153] => ReflectionFunctionAbstract [154] => Reflection [155] => ReflectionException [156] => Directory [157] => php_user_filter [158] => __PHP_Incomplete_Class [159] => SQLiteException [160] => SQLiteUnbuffered [161] => SQLiteResult [162] => SQLiteDatabase [163] => PDORow [164] => PDOStatement [165] => PDO [166] => PDOException [167] => SplObjectStorage [168] => UnexpectedValueException [169] => UnderflowException [170] => RangeException [171] => OverflowException [172] => OutOfBoundsException [173] => RuntimeException [174] => OutOfRangeException [175] => LengthException [176] => InvalidArgumentException [177] => DomainException [178] => BadMethodCallException [179] => BadFunctionCallException [180] => LogicException [181] => SimpleXMLIterator [182] => SplTempFileObject [183] => SplFileObject [184] => RecursiveDirectoryIterator [185] => DirectoryIterator [186] => SplFileInfo [187] => RecursiveArrayIterator [188] => ArrayIterator [189] => ArrayObject [190] => EmptyIterator [191] => RecursiveRegexIterator [192] => RegexIterator [193] => InfiniteIterator [194] => AppendIterator [195] => NoRewindIterator [196] => RecursiveCachingIterator [197] => CachingIterator [198] => LimitIterator [199] => ParentIterator [200] => RecursiveFilterIterator [201] => FilterIterator [202] => IteratorIterator [203] => RecursiveIteratorIterator [204] => SimpleXMLElement [205] => XMLReader [206] => DOMXPath [207] => DOMStringExtend [208] => DOMProcessingInstruction [209] => DOMEntityReference [210] => DOMEntity [211] => DOMNotation [212] => DOMDocumentType [213] => DOMCdataSection [214] => DOMConfiguration [215] => DOMLocator [216] => DOMErrorHandler [217] => DOMDomError [218] => DOMUserDataHandler [219] => DOMTypeinfo [220] => DOMComment [221] => DOMText [222] => DOMElement [223] => DOMAttr [224] => DOMCharacterData [225] => DOMNamedNodeMap [226] => DOMNodeList [227] => DOMDocument [228] => DOMDocumentFragment [229] => DOMNameSpaceNode [230] => DOMNode [231] => DOMImplementation [232] => DOMImplementationSource [233] => DOMImplementationList [234] => DOMNameList [235] => DOMStringList [236] => DOMException [237] => LibXMLError [238] => XMLWriter [239] => ErrorException [240] => Exception [241] => stdClass [242] => Swift [243] => Swift_ClassLoader [244] => Swift_Connection_Exception [245] => Swift_ConnectionBase [246] => Swift_Connection_SMTP ) 
Fatal error: Class 'Swift_Message' not found in /home/zendurl/public_html/directory/itorrent/account-signup.php on line 116
User avatar
Chris Corbyn
Breakbeat Nuttzer
Posts: 13098
Joined: Wed Mar 24, 2004 7:57 am
Location: Melbourne, Australia

Post by Chris Corbyn »

Did you ever use Swift before? It appears that Swift.php has not loaded the correct file... myabe it's loading the Swift.php from version 2? What does this show?

Code: Select all

require('lib/Swift.php'); 
require('lib/Swift/Connection/SMTP.php');
highlight_file('lib/Swift.php');
This would be an extremely critical error if the issue was in the Swift codebase and others have used this version without problems. I have just looked at the code for my own sanity and there's no way Swift.php from version 3 of the library could be loaded without Swift_Message exisiting and not generate errors.
padlets
Forum Newbie
Posts: 8
Joined: Fri Apr 27, 2007 6:00 pm

Post by padlets »

I think that the Swift file was version 2 (the file in my site was 40k and in my pc was 10k) so i upload the file agian and i try to signup and i have the same problem that i had in the beginning.
And i never use Swift before.

print_r(get_declared_classes());

Code: Select all

Array ( [0] => stdClass [1] => Exception [2] => ErrorException [3] => XMLWriter [4] => LibXMLError [5] => DOMException [6] => DOMStringList [7] => DOMNameList [8] => DOMImplementationList [9] => DOMImplementationSource [10] => DOMImplementation [11] => DOMNode [12] => DOMNameSpaceNode [13] => DOMDocumentFragment [14] => DOMDocument [15] => DOMNodeList [16] => DOMNamedNodeMap [17] => DOMCharacterData [18] => DOMAttr [19] => DOMElement [20] => DOMText [21] => DOMComment [22] => DOMTypeinfo [23] => DOMUserDataHandler [24] => DOMDomError [25] => DOMErrorHandler [26] => DOMLocator [27] => DOMConfiguration [28] => DOMCdataSection [29] => DOMDocumentType [30] => DOMNotation [31] => DOMEntity [32] => DOMEntityReference [33] => DOMProcessingInstruction [34] => DOMStringExtend [35] => DOMXPath [36] => XMLReader [37] => SimpleXMLElement [38] => RecursiveIteratorIterator [39] => IteratorIterator [40] => FilterIterator [41] => RecursiveFilterIterator [42] => ParentIterator [43] => LimitIterator [44] => CachingIterator [45] => RecursiveCachingIterator [46] => NoRewindIterator [47] => AppendIterator [48] => InfiniteIterator [49] => RegexIterator [50] => RecursiveRegexIterator [51] => EmptyIterator [52] => ArrayObject [53] => ArrayIterator [54] => RecursiveArrayIterator [55] => SplFileInfo [56] => DirectoryIterator [57] => RecursiveDirectoryIterator [58] => SplFileObject [59] => SplTempFileObject [60] => SimpleXMLIterator [61] => LogicException [62] => BadFunctionCallException [63] => BadMethodCallException [64] => DomainException [65] => InvalidArgumentException [66] => LengthException [67] => OutOfRangeException [68] => RuntimeException [69] => OutOfBoundsException [70] => OverflowException [71] => RangeException [72] => UnderflowException [73] => UnexpectedValueException [74] => SplObjectStorage [75] => PDOException [76] => PDO [77] => PDOStatement [78] => PDORow [79] => SQLiteDatabase [80] => SQLiteResult [81] => SQLiteUnbuffered [82] => SQLiteException [83] => __PHP_Incomplete_Class [84] => php_user_filter [85] => Directory [86] => ReflectionException [87] => Reflection [88] => ReflectionFunctionAbstract [89] => ReflectionFunction [90] => ReflectionParameter [91] => ReflectionMethod [92] => ReflectionClass [93] => ReflectionObject [94] => ReflectionProperty [95] => ReflectionExtension [96] => mysqli_sql_exception [97] => mysqli_driver [98] => mysqli [99] => mysqli_warning [100] => mysqli_result [101] => mysqli_stmt [102] => SWFShape [103] => SWFFill [104] => SWFGradient [105] => SWFBitmap [106] => SWFText [107] => SWFTextField [108] => SWFFont [109] => SWFDisplayItem [110] => SWFMovie [111] => SWFButton [112] => SWFAction [113] => SWFMorph [114] => SWFSprite [115] => SWFSound [116] => SWFFontChar [117] => SWFSoundInstance [118] => SWFVideoStream [119] => DateTime [120] => DateTimeZone [121] => DateTimeZone [122] => DateTime [123] => SWFVideoStream [124] => SWFSoundInstance [125] => SWFFontChar [126] => SWFSound [127] => SWFSprite [128] => SWFMorph [129] => SWFAction [130] => SWFButton [131] => SWFMovie [132] => SWFDisplayItem [133] => SWFFont [134] => SWFTextField [135] => SWFText [136] => SWFBitmap [137] => SWFGradient [138] => SWFFill [139] => SWFShape [140] => mysqli_stmt [141] => mysqli_result [142] => mysqli_warning [143] => mysqli [144] => mysqli_driver [145] => mysqli_sql_exception [146] => ReflectionExtension [147] => ReflectionProperty [148] => ReflectionObject [149] => ReflectionClass [150] => ReflectionMethod [151] => ReflectionParameter [152] => ReflectionFunction [153] => ReflectionFunctionAbstract [154] => Reflection [155] => ReflectionException [156] => Directory [157] => php_user_filter [158] => __PHP_Incomplete_Class [159] => SQLiteException [160] => SQLiteUnbuffered [161] => SQLiteResult [162] => SQLiteDatabase [163] => PDORow [164] => PDOStatement [165] => PDO [166] => PDOException [167] => SplObjectStorage [168] => UnexpectedValueException [169] => UnderflowException [170] => RangeException [171] => OverflowException [172] => OutOfBoundsException [173] => RuntimeException [174] => OutOfRangeException [175] => LengthException [176] => InvalidArgumentException [177] => DomainException [178] => BadMethodCallException [179] => BadFunctionCallException [180] => LogicException [181] => SimpleXMLIterator [182] => SplTempFileObject [183] => SplFileObject [184] => RecursiveDirectoryIterator [185] => DirectoryIterator [186] => SplFileInfo [187] => RecursiveArrayIterator [188] => ArrayIterator [189] => ArrayObject [190] => EmptyIterator [191] => RecursiveRegexIterator [192] => RegexIterator [193] => InfiniteIterator [194] => AppendIterator [195] => NoRewindIterator [196] => RecursiveCachingIterator [197] => CachingIterator [198] => LimitIterator [199] => ParentIterator [200] => RecursiveFilterIterator [201] => FilterIterator [202] => IteratorIterator [203] => RecursiveIteratorIterator [204] => SimpleXMLElement [205] => XMLReader [206] => DOMXPath [207] => DOMStringExtend [208] => DOMProcessingInstruction [209] => DOMEntityReference [210] => DOMEntity [211] => DOMNotation [212] => DOMDocumentType [213] => DOMCdataSection [214] => DOMConfiguration [215] => DOMLocator [216] => DOMErrorHandler [217] => DOMDomError [218] => DOMUserDataHandler [219] => DOMTypeinfo [220] => DOMComment [221] => DOMText [222] => DOMElement [223] => DOMAttr [224] => DOMCharacterData [225] => DOMNamedNodeMap [226] => DOMNodeList [227] => DOMDocument [228] => DOMDocumentFragment [229] => DOMNameSpaceNode [230] => DOMNode [231] => DOMImplementation [232] => DOMImplementationSource [233] => DOMImplementationList [234] => DOMNameList [235] => DOMStringList [236] => DOMException [237] => LibXMLError [238] => XMLWriter [239] => ErrorException [240] => Exception [241] => stdClass [242] => Swift [243] => Swift_ClassLoader [244] => Swift_Connection_Exception [245] => Swift_ConnectionBase [246] => Swift_BadResponseException [247] => Swift_Cache [248] => Swift_CacheFactory [249] => Swift_AddressContainer [250] => Swift_Address [251] => Swift_Message_Mime [252] => Swift_File [253] => Swift_FileException [254] => Swift_Message_MimeException [255] => Swift_Message_Attachment [256] => Swift_Message_EmbeddedFile [257] => Swift_Message_Image [258] => Swift_Message_Part [259] => Swift_Message [260] => Swift_RecipientList [261] => Swift_Events [262] => Swift_Connection_SMTP )
highlight_file('lib/Swift.php');

Code: Select all

<?php

/**
 * Swift Mailer Core Component.
 * Please read the LICENSE file
 * @copyright Chris Corbyn <chris@w3style.co.uk>
 * @author Chris Corbyn <chris@w3style.co.uk>
 * @package Swift
 * @version 3.1.5
 * @license GNU Lesser General Public License
 */

require_once dirname(__FILE__) . "/Swift/ClassLoader.php";
Swift_ClassLoader::load("Swift_ConnectionBase");
Swift_ClassLoader::load("Swift_BadResponseException");
Swift_ClassLoader::load("Swift_Cache");
Swift_ClassLoader::load("Swift_CacheFactory");
Swift_ClassLoader::load("Swift_Message");
Swift_ClassLoader::load("Swift_RecipientList");
Swift_ClassLoader::load("Swift_Events");
Swift_ClassLoader::load("Swift_Events_Listener");

/**
 * Swift is the central component in the Swift library.
 * @package Swift
 * @author Chris Corbyn <chris@w3style.co.uk>
 * @version 3.1.5
 */
class Swift
{
  /**
   * Constant to flag Swift not to try and connect upon instantiation
   */
  const NO_START = 2;
  /**
   * Constant to tell Swift not to perform the standard SMTP handshake upon connect
   */
  const NO_HANDSHAKE = 4;
  /**
   * Constant to ask Swift to start logging
   */
  const ENABLE_LOGGING = 8;
  /**
   * Constant to prevent postConnect() being run in the connection
   */
  const NO_POST_CONNECT = 16;
  /**
   * The connection object currently active
   * @var Swift_Connection
   */
  public $connection = null;
  /**
   * The logger object
   * @var Swift_Log
   */
  public $log = null;
  /**
   * The domain name of this server (should technically be a FQDN)
   * @var string
   */
  protected $domain = null;
  /**
   * Flags to change the behaviour of Swift
   * @var int
   */
  protected $options;
  /**
   * Loaded plugins, separated into containers according to roles
   * @var array
   */
  protected $listeners = array();
  
  /**
   * Constructor
   * @param Swift_Connection The connection object to deal with I/O
   * @param string The domain name of this server (the client) as a FQDN
   * @param int Optional flags
   * @throws Swift_Connection_Exception If a connection cannot be established or the connection is behaving incorrectly
   */
  public function __construct(Swift_Connection $conn, $domain=false, $options=null)
  {
    $this->initializeEventListenerContainer();
    $this->setOptions($options);
    Swift_ClassLoader::load("Swift_Log_DefaultLog");
    $this->setLogger(new Swift_Log_DefaultLog());
    
    if ($this->hasOption(self::ENABLE_LOGGING)) $this->log->enable();
    
    if (!$domain) $domain = !empty($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : "SwiftUser";
    
    $this->setDomain($domain);
    $this->connection = $conn;
    
    if ($conn && !$this->hasOption(self::NO_START))
    {
      if ($this->log->isEnabled()) $this->log->add("Trying to connect...", Swift_Log_Base::NORMAL);
      $this->connect();
    }
  }
  /**
   * Populate the listeners array with the defined listeners ready for plugins
   */
  protected function initializeEventListenerContainer()
  {
    Swift_ClassLoader::load("Swift_Events_ListenerMapper");
    foreach (Swift_Events_ListenerMapper::getMap() as $interface => $method)
    {
      if (!isset($this->listeners[$interface]))
        $this->listeners[$interface] = array();
    }
  }
  /**
   * Add a new plugin to Swift
   * Plugins must implement one or more event listeners
   * @param Swift_Events_Listener The plugin to load
   */
  public function attachPlugin(Swift_Events_Listener $plugin, $id)
  {
    foreach (array_keys($this->listeners) as $key)
    {
      $listener = "Swift_Events_" . $key;
      Swift_ClassLoader::load($listener);
      if ($plugin instanceof $listener) $this->listeners[$key][$id] = $plugin;
    }
  }
  /**
   * Get an attached plugin if it exists
   * @param string The id of the plugin
   * @return Swift_Event_Listener
   */
  public function getPlugin($id)
  {
    foreach ($this->listeners as $type => $arr)
    {
      if (isset($arr[$id])) return $this->listeners[$type][$id];
    }
    return null; //If none found
  }
  /**
   * Remove a plugin attached under the ID of $id
   * @param string The ID of the plugin
   */
  public function removePlugin($id)
  {
    foreach ($this->listeners as $type => $arr)
    {
      if (isset($arr[$id]))
      {
        $this->listeners[$type][$id] = null;
        unset($this->listeners[$type][$id]);
      }
    }
  }
  /**
   * Send a new type of event to all objects which are listening for it
   * @param Swift_Events The event to send
   * @param string The type of event
   */
  public function notifyListeners($e, $type)
  {
    Swift_ClassLoader::load("Swift_Events_ListenerMapper");
    if (!empty($this->listeners[$type]) && $notifyMethod = Swift_Events_ListenerMapper::getNotifyMethod($type))
    {
      $e->setSwift($this);
      foreach ($this->listeners[$type] as $k => $listener)
      {
        $listener->$notifyMethod($e);
      }
    }
    else $e = null;
  }
  /**
   * Set the logger to use
   * @param Swift_Log The instantiated logger
   */
  public function setLogger(Swift_Log $logger)
  {
    $this->log = $logger;
  }
  /**
   * Check if an option flag has been set
   * @param string Option name
   * @return boolean
   */
  public function hasOption($option)
  {
    return ($this->options & $option);
  }
  /**
   * Adjust the options flags
   * E.g. $obj->setOptions(Swift::NO_START | Swift::NO_HANDSHAKE)
   * @param int The bits to set
   */
  public function setOptions($options)
  {
    $this->options = (int) $options;
  }
  /**
   * Get the current options set (as bits)
   * @return int
   */
  public function getOptions()
  {
    return (int) $this->options;
  }
  /**
   * Set the FQDN of this server as it will identify itself
   * @param string The FQDN of the server
   */
  public function setDomain($name)
  {
    $this->domain = (string) $name;
  }
  /**
   * Attempt to establish a connection with the service
   * @throws Swift_Connection_Exception If the connection cannot be established or behaves oddly
   */
  public function connect()
  {
    $this->connection->start();
    $greeting = $this->command("", 220);
    if (!$this->hasOption(self::NO_HANDSHAKE))
    {
      $this->handshake($greeting);
    }
    Swift_ClassLoader::load("Swift_Events_ConnectEvent");
    $this->notifyListeners(new Swift_Events_ConnectEvent($this->connection), "ConnectListener");
  }
  /**
   * Disconnect from the MTA
   * @throws Swift_Connection_Exception If the connection will not stop
   */
  public function disconnect()
  {
    $this->command("QUIT");
    $this->connection->stop();
    Swift_ClassLoader::load("Swift_Events_DisconnectEvent");
    $this->notifyListeners(new Swift_Events_DisconnectEvent($this->connection), "DisconnectListener");
  }
  /**
   * Throws an exception if the response code wanted does not match the one returned
   * @param Swift_Event_ResponseEvent The full response from the service
   * @param int The 3 digit response code wanted
   * @throws Swift_BadResponseException If the code does not match
   */
  protected function assertCorrectResponse(Swift_Events_ResponseEvent $response, $codes)
  {
    $codes = (array)$codes;
    if (!in_array($response->getCode(), $codes))
    {
      $error = "Expected response code(s) [" . implode(", ", $codes) . "] but got response [" . $response->getString() . "]";
      if ($this->log->isEnabled()) $this->log->add($error, Swift_Log_Base::ERROR);
      throw new Swift_BadResponseException($error);
    }
  }
  /**
   * Have a polite greeting with the server and work out what it's capable of
   * @param Swift_Events_ResponseEvent The initial service line respoonse
   * @throws Swift_Connection_Exception If conversation is not going very well
   */
  protected function handshake(Swift_Events_ResponseEvent $greeting)
  {
    if (strpos($greeting->getString(), "ESMTP")) $this->setConnectionExtensions($this->command("EHLO " . $this->domain, 250));
    else $this->command("HELO " . $this->domain, 250);
    //Connection might want to do something like authenticate now
    if (!$this->hasOption(self::NO_POST_CONNECT)) $this->connection->postConnect($this);
  }
  /**
   * Set the extensions which the service reports in the connection object
   * @param Swift_Events_ResponseEvent The list of extensions as reported by the service
   */
  protected function setConnectionExtensions(Swift_Events_ResponseEvent $list)
  {
    $le = (strpos($list->getString(), "\r\n") !== false) ? "\r\n" : "\n";
    $list = explode($le, $list->getString());
    for ($i = 1, $len = count($list); $i < $len; $i++)
    {
      $extension = substr($list[$i], 4);
      $attributes = split("[ =]", $extension);
      $this->connection->setExtension($attributes[0], (isset($attributes[1]) ? array_slice($attributes, 1) : array()));
    }
  }
  /**
   * Execute a command against the service and get the response
   * @param string The command to execute (leave off any CRLF!!!)
   * @param int The code to check for in the response, if any. -1 indicates that no response is wanted.
   * @return Swift_Events_ResponseEvent The server's response (could be multiple lines)
   * @throws Swift_Connection_Exception If a code was expected but does not match the one returned
   */
  public function command($command, $code=null)
  {
    Swift_ClassLoader::load("Swift_Events_CommandEvent");
    if ($command !== "")
    {
      $command_event = new Swift_Events_CommandEvent($command, $code);
      $command = null; //For memory reasons
      $this->notifyListeners($command_event, "BeforeCommandListener");
      if ($this->log->isEnabled() && $code != -1) $this->log->add($command_event->getString(), Swift_Log_Base::COMMAND);
      $end = ($code != -1) ? "\r\n" : null;
      $this->connection->write($command_event->getString(), $end);
      $this->notifyListeners($command_event, "CommandListener");
    }
    
    if ($code == -1) return null;
    
    Swift_ClassLoader::load("Swift_Events_ResponseEvent");
    $response_event = new Swift_Events_ResponseEvent($this->connection->read());
    $this->notifyListeners($response_event, "ResponseListener");
    if ($this->log->isEnabled()) $this->log->add($response_event->getString(), Swift_Log_Base::RESPONSE);
    if ($command !== "" && $command_event->getCode() !== null)
      $this->assertCorrectResponse($response_event, $command_event->getCode());
    return $response_event;
  }
  /**
   * Reset a conversation which has gone badly
   * @throws Swift_Connection_Exception If the service refuses to reset
   */
  public function reset()
  {
    $this->command("RSET", 250);
  }
  /**
   * Send a message to any number of recipients
   * @param Swift_Message The message to send.  This does not need to (and shouldn't really) have any of the recipient headers set.
   * @param mixed The recipients to send to.  Can be a string, Swift_Address or Swift_RecipientList. Note that all addresses apart from Bcc recipients will appear in the message headers
   * @param mixed The address to send the message from.  Can either be a string or an instance of Swift_Address.
   * @return int The number of successful recipients
   * @throws Swift_Connection_Exception If sending fails for any reason.
   */
  public function send(Swift_Message $message, $recipients, $from)
  {
    Swift_ClassLoader::load("Swift_Message_Encoder");
    if (is_string($recipients) && preg_match("/^" . Swift_Message_Encoder::CHEAP_ADDRESS_RE . "\$/", $recipients))
    {
      $recipients = new Swift_Address($recipients);
    }
    elseif (!($recipients instanceof Swift_AddressContainer))
      throw new Exception("The recipients parameter must either be a valid string email address, ".
      "an instance of Swift_RecipientList or an instance of Swift_Address.");
      
    if (is_string($from) && preg_match("/^" . Swift_Message_Encoder::CHEAP_ADDRESS_RE . "\$/", $from))
    {
      $from = new Swift_Address($from);
    }
    elseif (!($from instanceof Swift_Address))
      throw new Exception("The sender parameter must either be a valid string email address or ".
      "an instance of Swift_Address.");
    
    $log_active = $this->log->isEnabled();
    
    if (!$message->getEncoding() && !$this->connection->hasExtension("8BITMIME"))
    {
      $message->setEncoding("QP", true, true);
    }
    
    $list = $recipients;
    if ($recipients instanceof Swift_Address)
    {
      $list = new Swift_RecipientList();
      $list->addTo($recipients);
    }
    
    Swift_ClassLoader::load("Swift_Events_SendEvent");
    $send_event = new Swift_Events_SendEvent($message, $list, $from, 0);
    
    $this->notifyListeners($send_event, "BeforeSendListener");
    
    $to = $cc = array();
    if (!($has_from = $message->getFrom())) $message->setFrom($from);
    if (!($has_return_path = $message->getReturnPath())) $message->setReturnPath($from->build(true));
    if (!($has_reply_to = $message->getReplyTo())) $message->setReplyTo($from);
    if (!($has_message_id = $message->getId())) $message->generateId();
    
    $this->command("MAIL FROM: " . $message->getReturnPath(true), 250);
    
    $failed = 0;
    $sent = 0;
    $tmp_sent = 0;
    foreach ($list->getTo() as $address)
    {
      $to[] = $address->build();
      try {
        $this->command("RCPT TO: " . $address->build(true), 250);
        $tmp_sent++;
      } catch (Swift_BadResponseException $e) {
        $failed++;
        $send_event->addFailedRecipient($address->getAddress());
        if ($log_active) $this->log->addfailedRecipient($address->getAddress());
      }
    }
    foreach ($list->getCc() as $address)
    {
      $cc[] = $address->build();
      try {
        $this->command("RCPT TO: " . $address->build(true), 250);
        $tmp_sent++;
      } catch (Swift_BadResponseException $e) {
        $failed++;
        $send_event->addFailedRecipient($address->getAddress());
        if ($log_active) $this->log->addfailedRecipient($address->getAddress());
      }
    }
    
    if ($failed == (count($to) + count($cc)))
    {
      $this->reset();
      $this->notifyListeners($send_event, "SendListener");
      return 0;
    }
    
    if (!($has_to = $message->getTo()) && !empty($to)) $message->setTo($to);
    if (!($has_cc = $message->getCc()) && !empty($cc)) $message->setCc($cc);
    
    $this->command("DATA", 354);
    $data = $message->build();
    
    while (false !== $bytes = $data->read())
      $this->command($bytes, -1);
    if ($log_active) $this->log->add("<MESSAGE DATA>", Swift_Log_Base::COMMAND);
    try {
      $this->command("\r\n.", 250);
      $sent += $tmp_sent;
    } catch (Swift_BadResponseException $e) {
      $failed += $tmp_sent;
    }
    
    $tmp_sent = 0;
    $has_bcc = $list->getBcc();
    foreach ($list->getBcc() as $address)
    {
      if (!$has_bcc) $message->setBcc($address->build());
      try {
        $this->command("MAIL FROM: " . $message->getReturnPath(true), 250);
        $this->command("RCPT TO: " . $address->build(true), 250);
        $this->command("DATA", 354);
        $data = $message->build();
        while (false !== $bytes = $data->read())
          $this->command($bytes, -1);
        if ($log_active) $this->log->add("<MESSAGE DATA>", Swift_Log_Base::COMMAND);
        $this->command("\r\n.", 250);
        $sent++;
      } catch (Swift_BadResponseException $e) {
        $failed++;
        $send_event->addFailedRecipient($address->getAddress());
        if ($log_active) $this->log->addfailedRecipient($address->getAddress());
        $this->reset();
      }
    }
    
    $total = count($to) + count($cc) + count($list->getBcc());
    
    $send_event->setNumSent($sent);
    $this->notifyListeners($send_event, "SendListener");
    
    if (!$has_return_path) $message->setReturnPath("");
    if (!$has_from) $message->setFrom("");
    if (!$has_to) $message->setTo("");
    if (!$has_reply_to) $message->setReplyTo(null);
    if (!$has_cc) $message->setCc(null);
    if (!$has_bcc) $message->setBcc(null);
    if (!$has_message_id) $message->setId(null);
    
    if ($this->log->isEnabled()) $this->log->add("Message sent to " . $sent . "/" . $total . " recipients", Swift_Log_Base::NORMAL);
    
    return $sent;
  }
  /**
   * Send a message to a batch of recipients.
   * Unlike send() this method ignores Cc and Bcc recipients and does not reveal every recipients' address in the headers
   * @param Swift_Message The message to send (leave out the recipient headers unless you are deliberately overriding them)
   * @param Swift_RecipientList The addresses to send to
   * @param Swift_Address The address the mail is from (sender)
   * @return int The number of successful recipients
   * @throws Swift_Connection_Exception If the entire batch fails
   */
  public function batchSend(Swift_Message $message, Swift_RecipientList $to, $from)
  {
    $ret = 0;
    foreach ($to->getTo() as $address)
    {
      $ret += $this->send($message, $address, $from);
    }
    return $ret;
  }
}
Post Reply