Tag 2.3 release

This commit is contained in:
Marcus Bointon 2008-11-11 12:25:05 +00:00
parent 40df5e651e
commit fd036f306b
28 changed files with 146 additions and 85 deletions

View File

@ -2,6 +2,25 @@ ChangeLog
NOTE: THIS VERSION OF PHPMAILER IS DESIGNED FOR PHP5/PHP6. IT WILL NOT WORK WITH PHP4.
Version 2.3 (November 06, 2008)
* added Arabic language (many thanks to Bahjat Al Mostafa)
* removed English language from language files and made it a default within
class.phpmailer.php - if no language is found, it will default to use
the english language translation
* fixed public/private declarations
* corrected line 1728, $basedir to $directory
* added $sign_cert_file to avoid improper duplicate use of $sign_key_file
* corrected $this->Hello on line 612 to $this->Helo
* changed default of $LE to "\r\n" to comply with RFC 2822. Can be set by the user
if default is not acceptable
* removed trim() from return results in EncodeQP
* /test and three files it contained are removed from version 2.3
* fixed phpunit.php for compliance with PHP5
* changed $this->AltBody = $textMsg; to $this->AltBody = html_entity_decode($textMsg);
* We have removed the /phpdoc from the downloads. All documentation is now on
the http://phpmailer.codeworxtech.com website.
Version 2.2.1 () July 19 2008
* fixed line 1092 in class.smtp.php (my apologies, error on my part)

11
README
View File

@ -9,6 +9,17 @@ PHPMailer
Full Featured Email Transfer Class for PHP
==========================================
Version 2.3 (November 08, 2008)
We have removed the /phpdoc from the downloads. All documentation is now on
the http://phpmailer.codeworxtech.com website.
The phpunit.php has been updated to support PHP5.
For all other changes and notes, please see the changelog.
Donations are accepted at PayPal with our id "paypal@worxteam.com".
Version 2.2 (July 15 2008)
- see the changelog.

View File

@ -2,7 +2,7 @@
/*~ class.phpmailer.php
.---------------------------------------------------------------------------.
| Software: PHPMailer - PHP email class |
| Version: 2.2.1 |
| Version: 2.3 |
| Contact: via sourceforge.net support pages (also www.codeworxtech.com) |
| Info: http://phpmailer.sourceforge.net |
| Support: http://sourceforge.net/projects/phpmailer/ |
@ -140,7 +140,7 @@ class PHPMailer {
* Holds PHPMailer version.
* @var string
*/
public $Version = "2.2";
public $Version = "2.3";
/**
* Sets the email address that a reading confirmation will be sent.
@ -242,6 +242,12 @@ class PHPMailer {
*/
public $SingleTo = false;
/**
* Provides the ability to change the line ending
* @var string
*/
public $LE = "\r\n";
/////////////////////////////////////////////////
// PROPERTIES, PRIVATE
/////////////////////////////////////////////////
@ -257,7 +263,6 @@ class PHPMailer {
private $boundary = array();
private $language = array();
private $error_count = 0;
private $LE = "\n";
private $sign_cert_file = "";
private $sign_key_file = "";
private $sign_key_pass = "";
@ -604,7 +609,7 @@ class PHPMailer {
if($this->smtp->Connect(($ssl ? 'ssl://':'').$host, $port, $this->Timeout)) {
$hello = ($this->Helo != '' ? $this->Hello : $this->ServerHostname());
$hello = ($this->Helo != '' ? $this->Helo : $this->ServerHostname());
$this->smtp->Hello($hello);
if($tls) {
@ -660,8 +665,20 @@ class PHPMailer {
*/
function SetLanguage($lang_type = 'en', $lang_path = 'language/') {
if( !(@include $lang_path.'phpmailer.lang-'.$lang_type.'.php') ) {
$this->SetError('Could not load language file');
return false;
$PHPMAILER_LANG = array();
$PHPMAILER_LANG["provide_address"] = 'You must provide at least one ' .
$PHPMAILER_LANG["mailer_not_supported"] = ' mailer is not supported.';
$PHPMAILER_LANG["execute"] = 'Could not execute: ';
$PHPMAILER_LANG["instantiate"] = 'Could not instantiate mail function.';
$PHPMAILER_LANG["authenticate"] = 'SMTP Error: Could not authenticate.';
$PHPMAILER_LANG["from_failed"] = 'The following From address failed: ';
$PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: The following ' .
$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data not accepted.';
$PHPMAILER_LANG["connect_host"] = 'SMTP Error: Could not connect to SMTP host.';
$PHPMAILER_LANG["file_access"] = 'Could not access file: ';
$PHPMAILER_LANG["file_open"] = 'File Error: Could not open file: ';
$PHPMAILER_LANG["encoding"] = 'Unknown encoding: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
}
$this->language = $PHPMAILER_LANG;
return true;
@ -875,9 +892,6 @@ class PHPMailer {
} elseif (count($this->cc) == 0) {
$result .= $this->HeaderLine('To', 'undisclosed-recipients:;');
}
if(count($this->cc) > 0) {
$result .= $this->AddrAppend('Cc', $this->cc);
}
}
$from = array();
@ -1423,7 +1437,7 @@ class PHPMailer {
} // end of for
$output .= $newline.$eol;
} // end of while
return trim($output);
return $output;
}
/**
@ -1711,8 +1725,7 @@ class PHPMailer {
$ext = $fileParts[1];
$mimeType = $this->_mime_types($ext);
if ( strlen($basedir) > 1 && substr($basedir,-1) != '/') { $basedir .= '/'; }
if ( strlen($directory) > 1 && substr($basedir,-1) != '/') { $directory .= '/'; }
$this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64', $mimeType);
if ( strlen($directory) > 1 && substr($directory,-1) != '/') { $directory .= '/'; }
if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64',$mimeType) ) {
$message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message);
}
@ -1723,7 +1736,7 @@ class PHPMailer {
$this->Body = $message;
$textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message)));
if ( !empty($textMsg) && empty($this->AltBody) ) {
$this->AltBody = $textMsg;
$this->AltBody = html_entity_decode($textMsg);
}
if ( empty($this->AltBody) ) {
$this->AltBody = 'To view this email message, open the email in with HTML compatibility!' . "\n\n";
@ -1894,4 +1907,4 @@ class PHPMailer {
}
}
?>
?>

View File

@ -2,7 +2,7 @@
/*~ class.pop3.php
.---------------------------------------------------------------------------.
| Software: PHPMailer - PHP email class |
| Version: 2.2.1 |
| Version: 2.3 |
| Contact: via sourceforge.net support pages (also www.codeworxtech.com) |
| Info: http://phpmailer.sourceforge.net |
| Support: http://sourceforge.net/projects/phpmailer/ |
@ -26,7 +26,7 @@
/**
* POP Before SMTP Authentication Class
* Version 2.1
* Version 2.3
*
* Author: Richard Davey (rich@corephp.co.uk)
* Modifications: Andy Prevost
@ -390,4 +390,4 @@ class POP3 {
// End of class
}
?>
?>

View File

@ -2,7 +2,7 @@
/*~ class.smtp.php
.---------------------------------------------------------------------------.
| Software: PHPMailer - PHP email class |
| Version: 2.2.1 |
| Version: 2.3 |
| Contact: via sourceforge.net support pages (also www.codeworxtech.com) |
| Info: http://phpmailer.sourceforge.net |
| Support: http://sourceforge.net/projects/phpmailer/ |
@ -170,7 +170,7 @@ class SMTP {
return false;
}
fputs($this->smtp_conn,"STARTTLS" . $extra . $this->CRLF);
fputs($this->smtp_conn,"STARTTLS" . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
@ -1109,5 +1109,4 @@ class SMTP {
}
?>
?>

View File

@ -66,11 +66,11 @@ Thanks ....<br />
<p><strong>WHY USE OUR TOOLS &amp; WHAT&#39;S IN IT FOR YOU?</strong></p>
<p>A valid question. We're developers too. We've been writing software, primarily for the internet, for more than 15 years. Along the way, there are two major things that had tremendous impact of our company: PHP and Open Source. PHP is without doubt the most popular platform for the internet. There has been more progress in this area of technology because of Open Source software than in any other IT segment. We have used many open source tools, some as learning tools, some as components in projects we were working on. To us, it's not about popularity ... we're committed to robust, stable, and efficient tools you can use to get your projects in your user's hands quickly. So the shorter answer: what's in it for you? rapid development and rapid deployment without fuss and with straight forward open source licensing.</p>
<p>Now, the introductions:</p>
<p>Our company, <strong>Codeworx Technologies</strong>, is the publisher of several Open Source applications and developer tools as well as several commercial PHP applications. The Open Source applications are ttCMS and DCP Portal. The Open Source developer tools include QuickComponents (QuickSkin, QuickCache, and QuickTabs) and now PHPMailer.
We have staff and offices in the United States, Canada, Caribbean, the Middle
East, and our primary development center in India. Our company is represented by
<p>Our company, <strong>Worx International Inc.</strong>, is the publisher of several Open Source applications and developer tools as well as several commercial PHP applications. The Open Source applications are ttCMS and DCP Portal. The Open Source developer tools include QuickComponents (QuickSkin and QuickCache) and now PHPMailer.
We have staff and offices in the United States, Caribbean, the Middle
East, and our primary development center in Canada. Our company is represented by
agents and resellers globally.</p>
<p><strong>Codeworx Technologies</strong> is at the forefront of developing PHP applications. Our staff are all Zend Certified university educated and experts at object oriented programming. While <strong>Codeworx Technologies</strong> can handle any project from trouble shooting programs written by others all the way to finished mission-critical applications, we specialize in taking projects from inception all the way through to implementation - on budget, and on time. If you need help with your projects, we&#39;re the team to get it done right at a reasonable price.</p>
<p><strong>Worx International Inc.</strong> is at the forefront of developing PHP applications. Our staff are all Zend Certified university educated and experts at object oriented programming. While <strong>Worx International Inc.</strong> can handle any project from trouble shooting programs written by others all the way to finished mission-critical applications, we specialize in taking projects from inception all the way through to implementation - on budget, and on time. If you need help with your projects, we&#39;re the team to get it done right at a reasonable price.</p>
<p>Over the years, there have been a number of tools that have been constant favorites in all of our projects. We have become the project administrators for most of these tools.</p>
<p>Our developer tools are all Open Source. Here&#39;s a brief description:</p>
<ul>
@ -93,13 +93,13 @@ agents and resellers globally.</p>
</li>
</ul>
<p>We're committed to PHP and to the Open Source community.</p>
<p>Opportunities with <strong>Codeworx Technologies</strong>:</p>
<p>Opportunities with <strong>Worx International Inc.</strong>:</p>
<ul>
<li><span style="background-color: #FFFF00">Resellers/Agents</span>: We're always interested in talking with companies that
want to represent
<strong>Codeworx Technologies</strong> in their markets. We also have private label programs for our commercial products (in certain circumstances).</li>
<strong>Worx International Inc.</strong> in their markets. We also have private label programs for our commercial products (in certain circumstances).</li>
<li>Programmers/Developers: We are usually fully staffed, however, if you would like to be considered for a career with
<strong>Codeworx Technologies</strong>, we would be pleased to hear from you.<br />
<strong>Worx International Inc.</strong>, we would be pleased to hear from you.<br />
A few things to note:<br />
<ul>
<li>experience level does not matter: from fresh out of college to multi-year experience - it&#39;s your
@ -114,6 +114,7 @@ Regards,<br />
Andy Prevost (aka, codeworxtech)<br />
<a href="mailto:codeworxtech@users.sourceforge.net">codeworxtech@users.sourceforge.net</a><br />
<br />
We now also offer website design. hosting, and remote forms processing. Visit <a href="http://www.worxstudio.com/" target="_blank">WorxStudio.com</a> for more information.<br />
</div>
</center>
</body>

View File

@ -0,0 +1,25 @@
<?php
/**
* PHPMailer language file.
* Arabic Version
* by : bahjat al mostafa <bahjat983@hotmail.com> */
$PHPMAILER_LANG = array();
$PHPMAILER_LANG["provide_address"] = ' íÌÈ Ãä ÊÖÚ Úáì ÇáÃŞá ' .
'ÚäæÇä ÈÑíÏ ÅáßÊÑæäí ãÓÊŞÈá æÇÍÏ';
$PHPMAILER_LANG["mailer_not_supported"] = ' ãÑÓá ÇáÈÑíÏ ÛíÑ ãÏÚæã :';
$PHPMAILER_LANG["execute"] = 'áÇ íãßä ÊäİíĞ : ';
$PHPMAILER_LANG["instantiate"] = 'áã íÓÊØÚ ÊåíÆÉ ÊÇÈÚ ÇáÈÑíÏ';
$PHPMAILER_LANG["authenticate"] = 'ÎØÃ STMP : áã íãáß ÇáÕáÇÍíÉ';
$PHPMAILER_LANG["from_failed"] = 'ÇáÚäæÇä ÇáãÑÓá ÇáÊÇáí İÔá : ';
$PHPMAILER_LANG["recipients_failed"] = 'ÎØÃ STMP : ' .
'åÄáÇÁ ÇáãÓÊŞÈáæä İÔáæÇ : ';
$PHPMAILER_LANG["data_not_accepted"] = 'ÎØÃ STMP : ÇáãÚØíÇÊ áã ÊŞÈá .';
$PHPMAILER_LANG["connect_host"] = 'ÎØÃ STMP : ÇáÇÊÕÇá ÈãÓÊÖíİ STMP áã íÊã';
$PHPMAILER_LANG["file_access"] = 'áÇ íãßä ÇáæÕæá áãáİ : ';
$PHPMAILER_LANG["file_open"] = 'ÎØÃ ãáİ : áã íãßä İÊÍ ãáİ :';
$PHPMAILER_LANG["encoding"] = 'ÊÔİíÑ ÛíÑ ãÚÑæİ : ';
$PHPMAILER_LANG["signing"] = 'ÎØÃ ÊÓÌíá : ';
?>

View File

@ -20,5 +20,4 @@ $PHPMAILER_LANG["file_open"] = 'Erro de Arquivo: Não foi possível a
$PHPMAILER_LANG["encoding"] = 'Codificação desconhecida: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -21,4 +21,4 @@ $PHPMAILER_LANG["file_open"] = 'Error d\'Arxiu: No es pot obrir l\'ar
$PHPMAILER_LANG["encoding"] = 'Codificació desconeguda: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -23,4 +23,4 @@ $PHPMAILER_LANG["file_open"] = 'File Error: Nelze otevøít soubor pr
$PHPMAILER_LANG["encoding"] = 'Neznámé kódování: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -23,5 +23,4 @@ $PHPMAILER_LANG["file_open"] = 'Datei Fehler: konnte folgende Datei n
$PHPMAILER_LANG["encoding"] = 'Unbekanntes Encoding-Format: ';
$PHPMAILER_LANG["signing"] = 'Fehler beim Signieren: ';
?>
?>

View File

@ -2,8 +2,7 @@
/**
* PHPMailer language file.
* Danish Version
* Author: Mikael Stokkebro <info@stokkebro.dk>
*/
* Author: Mikael Stokkebro <info@stokkebro.dk> */
$PHPMAILER_LANG = array();
@ -23,4 +22,4 @@ $PHPMAILER_LANG["file_open"] = 'Fil fejl: Kunne ikke åbne filen: ';
$PHPMAILER_LANG["encoding"] = 'Ukendt encode-format: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -22,4 +22,4 @@ $PHPMAILER_LANG["file_open"] = 'Error de Archivo: No puede abrir el a
$PHPMAILER_LANG["encoding"] = 'Codificación desconocida: ';
$PHPMAILER_LANG["signing"] = 'Error al firmar: ';
?>
?>

View File

@ -21,4 +21,4 @@ $PHPMAILER_LANG["file_open"] = 'Faili Viga: Faili avamine eba&otilde;
$PHPMAILER_LANG["encoding"] = 'Tundmatu Unknown kodeering: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -22,4 +22,4 @@ $PHPMAILER_LANG["file_open"] = 'Tiedostovirhe: Ei voida avata tiedost
$PHPMAILER_LANG["encoding"] = 'Tuntematon koodaustyyppi: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -24,4 +24,4 @@ $PHPMAILER_LANG["file_open"] = 'Fílu feilur: Kundi ikki opna fílu:
$PHPMAILER_LANG["encoding"] = 'Ókend encoding: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -22,5 +22,4 @@ $PHPMAILER_LANG["file_open"] = 'Erreur Fichier : ouverture impossible
$PHPMAILER_LANG["encoding"] = 'Encodage inconnu : ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -22,4 +22,4 @@ $PHPMAILER_LANG["file_open"] = 'Fájl Hiba: Nem sikerült megnyitni a
$PHPMAILER_LANG["encoding"] = 'Ismeretlen kódolás: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -3,8 +3,7 @@
* PHPMailer language file.
* Italian version
* @package PHPMailer
* @author Ilias Bartolini <brain79@inwind.it>
*/
* @author Ilias Bartolini <brain79@inwind.it>*/
$PHPMAILER_LANG = array();
@ -27,4 +26,4 @@ $PHPMAILER_LANG["file_open"] = 'File Error: Impossibile aprire il fil
$PHPMAILER_LANG["encoding"] = 'Encoding set dei caratteri sconosciuto: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

Binary file not shown.

View File

@ -22,4 +22,4 @@ $PHPMAILER_LANG["file_open"] = 'Bestandsfout: Kon bestand niet openen
$PHPMAILER_LANG["encoding"] = 'Onbekende codering: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -22,4 +22,4 @@ $PHPMAILER_LANG["file_open"] = 'Fil feil: Kunne ikke åpne filen: ';
$PHPMAILER_LANG["encoding"] = 'Ukjent encoding: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -22,4 +22,4 @@ $PHPMAILER_LANG["file_open"] = 'Nie mo¿na otworzyæ pliku: ';
$PHPMAILER_LANG["encoding"] = 'Nieznany sposób kodowania znaków: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -3,8 +3,7 @@
* PHPMailer language file.
* Romanian Version
* @package PHPMailer
* @author Catalin Constantin <catalin@dazoot.ro>
*/
* @author Catalin Constantin <catalin@dazoot.ro> */
$PHPMAILER_LANG = array();
@ -22,4 +21,4 @@ $PHPMAILER_LANG["file_open"] = 'Eroare de fisier: Nu pot deschide fis
$PHPMAILER_LANG["encoding"] = 'Encodare necunoscuta: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -1,8 +1,7 @@
<?php
/**
* PHPMailer language file.
* Russian Version by Alexey Chumakov <alex@chumakov.ru>
*/
* Russian Version by Alexey Chumakov <alex@chumakov.ru> */
$PHPMAILER_LANG = array();
@ -22,5 +21,4 @@ $PHPMAILER_LANG["file_open"] = '
$PHPMAILER_LANG["encoding"] = 'Íåèçâåñòíûé âèä êîäèðîâêè: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -2,8 +2,7 @@
/**
* PHPMailer language file.
* Swedish Version
* Author: Johan Linnér <johan@linner.biz>
*/
* Author: Johan Linnér <johan@linner.biz> */
$PHPMAILER_LANG = array();
@ -23,4 +22,4 @@ $PHPMAILER_LANG["file_open"] = 'Fil fel: Kunde inte
$PHPMAILER_LANG["encoding"] = 'Okänt encode-format: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -23,4 +23,4 @@ $PHPMAILER_LANG["file_open"] = 'Dosya Hatas
$PHPMAILER_LANG["encoding"] = 'Bilinmeyen þifreleme: ';
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
?>
?>

View File

@ -30,7 +30,7 @@
// SOFTWARE.
//
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE |
E_CORE_ERROR | E_CORE_WARNING);
E_CORE_ERROR | E_CORE_WARNING);
/*
interface Test {
@ -46,11 +46,13 @@ function trace($msg) {
}
class Exception {
class phpUnitException {
/* Emulate a Java exception, sort of... */
var $message;
function Exception($message) {
var $type;
function phpUnitException($message, $type = 'FAILURE') {
$this->message = $message;
$this->type = $type;
}
function getMessage() {
return $this->message;
@ -82,7 +84,7 @@ class Assert {
$htmlExpected = htmlspecialchars($expected);
$htmlActual = htmlspecialchars($actual);
$str .= sprintf("<pre>%s\n--------\n%s</pre>",
$htmlExpected, $htmlActual);
$htmlExpected, $htmlActual);
$this->fail($str);
}
}
@ -194,24 +196,24 @@ class TestSuite /* implements Test */ {
// get matched below and then treated (incorrectly) as a test
// method. So don't name any TestCase subclasses as "Test..."!
if (floor(phpversion()) >= 4) {
// PHP4 introspection, submitted by Dylan Kuhn
$names = get_class_methods($classname);
while (list($key, $method) = each($names)) {
if (preg_match('/^test/', $method) && $method != "testcase") {
$this->addTest(new $classname($method));
}
}
// PHP4 introspection, submitted by Dylan Kuhn
$names = get_class_methods($classname);
while (list($key, $method) = each($names)) {
if (preg_match('/^test/', $method) && $method != "testcase") {
$this->addTest(new $classname($method));
}
}
}
else {
$dummy = new $classname("dummy");
$names = (array) $dummy;
while (list($key, $value) = each($names)) {
$type = gettype($value);
if ($type == "user function" && preg_match('/^test/', $key)
&& $key != "testcase") {
$this->addTest(new $classname($key));
}
}
$dummy = new $classname("dummy");
$names = (array) $dummy;
while (list($key, $value) = each($names)) {
$type = gettype($value);
if ($type == "user function" && preg_match('/^test/', $key)
&& $key != "testcase") {
$this->addTest(new $classname($key));
}
}
}
}
}
@ -227,7 +229,7 @@ class TestSuite /* implements Test */ {
reset($this->fTests);
while (list($na, $test) = each($this->fTests)) {
if ($testResult->shouldStop())
break;
break;
$test->run(&$testResult);
}
}
@ -275,7 +277,7 @@ class TestResult {
function _endTest($test) /* protected */ {
/* specialize this for end-of-test action, such as progress
reports */
reports */
}
function getFailures() {
@ -324,7 +326,7 @@ class TextTestResult extends TestResult {
function TextTestResult() {
$this->TestResult(); // call superclass constructor
}
function report() {
/* report result of test run */
$nRun = $this->countTests();
@ -343,7 +345,7 @@ class TextTestResult extends TestResult {
$exceptions = $failure->getExceptions();
print("<ul>");
while (list($na, $exception) = each($exceptions))
printf("<li>%s\n", $exception->getMessage());
printf("<li>%s\n", $exception->getMessage());
print("</ul>");
}
print("</ol>\n");