Page 1 of 2
SMTP, help!
Posted: Fri Apr 27, 2007 6:06 pm
by padlets
Weirdan | Please use 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
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]
Posted: Sat Apr 28, 2007 5:33 am
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/
Posted: Sat Apr 28, 2007 7:01 am
by padlets
can you tell me which part of the code is virsion 2?
i can't find the problem.
Posted: Sat Apr 28, 2007 7:39 am
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

Posted: Sat Apr 28, 2007 11:59 am
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
Posted: Sat Apr 28, 2007 12:01 pm
by Chris Corbyn
Where did you download Swift Mailer from and how have you installed it? What version do you have?
Posted: Sat Apr 28, 2007 12:05 pm
by padlets
I download it from the Swift site and i upload the lib dir to my site.
Swift-3.1.5-php5
Posted: Sat Apr 28, 2007 12:26 pm
by Chris Corbyn
Did you include Swift.php?
Debug:
Posted: Sat Apr 28, 2007 12:50 pm
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?
Posted: Sat Apr 28, 2007 12:56 pm
by John Cartwright
No, thats just to see if all the classes were loaded.
Posted: Sat Apr 28, 2007 1:11 pm
by padlets
all the classes were loaded.
So what i need to do?
Posted: Sat Apr 28, 2007 1:15 pm
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().
Posted: Sat Apr 28, 2007 1:24 pm
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
Posted: Sat Apr 28, 2007 1:39 pm
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.
Posted: Sat Apr 28, 2007 2:22 pm
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;
}
}