Author: Frederik Holljen
Date: 2006-09-24 12:28:02 +0200 (Sun, 24 Sep 2006)
New Revision: 3556

Log:
- Fixed bug #9049: [Mail] illegal length of Bcc header
- Also fixed problem with illegal length of subject field and the rest of the 
address headers.

- Other headers may still become long but are very unlikely to go beyond the 
998 character hard limit.

Added:
   trunk/Mail/src/internal/header_folder.php
   trunk/Mail/tests/header_folder_test.php
Modified:
   trunk/Mail/ChangeLog
   trunk/Mail/src/interfaces/part.php
   trunk/Mail/src/mail.php
   trunk/Mail/src/mail_autoload.php
   trunk/Mail/src/tools.php
   trunk/Mail/tests/suite.php
   trunk/Mail/tests/tools_test.php

Modified: trunk/Mail/ChangeLog
===================================================================
--- trunk/Mail/ChangeLog        2006-09-24 10:21:52 UTC (rev 3555)
+++ trunk/Mail/ChangeLog        2006-09-24 10:28:02 UTC (rev 3556)
@@ -12,7 +12,7 @@
 - Fixed bug #8990: ezcMail->messageID should be named ezcMail->messageId
 - Added a new class (ezcMailVirtualFile) to allow attachments from memory.
 - Fixed bug #9048: [ezcMail] ezcMailText does not encode properly
-       
+- Fixed bug #9049: [Mail] illegal length of Bcc header 
 
 1.1.2 - Monday 28 August 2006
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Modified: trunk/Mail/src/interfaces/part.php
===================================================================
--- trunk/Mail/src/interfaces/part.php  2006-09-24 10:21:52 UTC (rev 3555)
+++ trunk/Mail/src/interfaces/part.php  2006-09-24 10:28:02 UTC (rev 3556)
@@ -27,10 +27,10 @@
  *
  * @property-read ezcMailHeadersHolder $headers
  *                Contains the header holder object, taking care of the headers
- *                of this part. Can be retreived for reasons of extending this 
+ *                of this part. Can be retreived for reasons of extending this
  *                class and its derivals.
- *           
  *
+ *
  * @package Mail
  * @version //autogen//
  */
@@ -138,6 +138,9 @@
      *
      * If the header is already set it will override the old value.
      *
+     * Headers set should be folded at 76 or 998 characters according to
+     * the folding rules described in RFC 2822.
+     *
      * Note: The header Content-Disposition will be overwritten by the
      * contents of the contentsDisposition property if set.
      *
@@ -159,6 +162,9 @@
      * form array(headername=>value) will overwrite any existing
      * header values.
      *
+     * Headers set should be folded at 76 or 998 characters according to
+     * the folding rules described in RFC 2822.
+     *
      * @param array(string=>string) $headers
      * @return void
      */

Added: trunk/Mail/src/internal/header_folder.php
===================================================================
--- trunk/Mail/src/internal/header_folder.php   2006-09-24 10:21:52 UTC (rev 
3555)
+++ trunk/Mail/src/internal/header_folder.php   2006-09-24 10:28:02 UTC (rev 
3556)
@@ -0,0 +1,144 @@
+<?php
+/**
+ * File containing the ezcMailHeaderFolder class
+ *
+ * @package Mail
+ * @version //autogen//
+ * @copyright Copyright (C) 2005, 2006 eZ systems as. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ * @access private
+ */
+
+/**
+ * Internal class folding headers according to RFC 2822.
+ *
+ * RFC 2822 specifies two line length restrictions:
+ *
+ * "There are two limits that this standard places on the number of
+ *  characters in a line. Each line of characters MUST be no more than
+ *  998 characters, and SHOULD be no more than 78 characters, excluding
+ *  the CRLF."
+ *
+ * The 76 character limit is because of readability. The 998 character limit
+ * is a result of SMTP limitations.
+ *
+ * The rule for folding is:
+ * "wherever this standard allows for folding white space (not
+ *  simply WSP characters), a CRLF may be inserted before any WSP."
+ *
+ * This is described in more detail in section 3.2.3.
+ * @package Mail
+ * @version //autogen//
+ * @access private
+ */
+class ezcMailHeaderFolder
+{
+    /**
+     * The soft limit of 76 characters per line.
+     */
+    const SOFT_LIMIT = 76;
+
+    /**
+     * The soft limit of 998 characters per line.
+     */
+    const HARD_LIMIT = 998;
+
+    /**
+     * The default folding limit.
+     */
+    static private $limit = 76;
+
+    /**
+     * Sets the number of allowed characters before folding to $numCharacters.
+     *
+     * $numCharacters must be one of:
+     * - ezcMailHeaderFolder::SOFT_LIMIT (76 characters)
+     * - ezcMailHeaderFolder::HARD_LIMIT (998 characters)
+     *
+     * @param int $numCharacters
+     * @return void
+     */
+    static public function setLimit( $numCharacters )
+    {
+        self::$limit = $numCharacters;
+    }
+
+    /**
+     * Returns the maximum number of characters allowed per line.
+     *
+     * @return int
+     */
+    static public function getLimit( )
+    {
+        return self::$limit;
+    }
+
+    /**
+     * Returns $text folded to the 998 character limit on any whitespace.
+     *
+     * The algorithm tries to minimize the number of comparisons by searching
+     * backwards from the maximum number of allowed characters on a line.
+     *
+     * @param string $text
+     * @return string
+     */
+    static public function foldAny( $text )
+    {
+        // Don't fold unless we have to.
+        if( strlen( $text ) < self::$limit )
+        {
+            return $text;
+        }
+
+        // go to 998'th char.
+        // search back to whitespace
+        // fold
+
+        $length = strlen( $text );
+        $folded = "";
+        // find first occurence of whitespace searching backwards
+        $search = 0;
+        $previousFold = 0;
+
+        while( ( $search + self::$limit ) < $length )
+        {
+            // search from the max possible length of the substring
+            $search += self::$limit;
+            while( $text[$search] != " " && $text[$search] != "\t" && $search 
> $previousFold )
+            {
+                $search--;
+            }
+
+            if( $search == $previousFold )
+            {
+                // continuous string of more than limit chars.
+                // We will just have to continue searching forwards to the 
next whitespace instead
+                // This is not confirming to standard.. but what can we do?
+                $search += self::$limit; // back to where we started
+                while( $text[$search] != " " && $text[$search] != "\t" && 
$search < $length )
+                {
+                    $search++;
+                }
+            }
+
+            // lets fold
+            if( $folded === "" )
+            {
+                $folded = substr( $text, $previousFold, $search - 
$previousFold );
+            }
+            else
+            {
+                $folded .= ezcMailTools::lineBreak() .
+                           substr( $text, $previousFold, $search - 
$previousFold );
+            }
+            $previousFold = $search;
+        }
+        // we need to append the rest if there is any
+        if( $search < $length )
+        {
+            $folded .= ezcMailTools::lineBreak() . substr( $text, $search );
+        }
+        return $folded;
+    }
+}
+?>


Property changes on: trunk/Mail/src/internal/header_folder.php
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/Mail/src/mail.php
===================================================================
--- trunk/Mail/src/mail.php     2006-09-24 10:21:52 UTC (rev 3555)
+++ trunk/Mail/src/mail.php     2006-09-24 10:28:02 UTC (rev 3556)
@@ -274,15 +274,18 @@
 
         if ( $this->to !== null )
         {
-            $this->setHeader( "To", ezcMailTools::composeEmailAddresses( 
$this->to ) );
+            $this->setHeader( "To", ezcMailTools::composeEmailAddresses( 
$this->to,
+                                                                         
ezcMailHeaderFolder::getLimit()) );
         }
         if ( count( $this->cc ) )
         {
-            $this->setHeader( "Cc", ezcMailTools::composeEmailAddresses( 
$this->cc ) );
+            $this->setHeader( "Cc", ezcMailTools::composeEmailAddresses( 
$this->cc,
+                                                                         
ezcMailHeaderFolder::getLimit()) );
         }
         if ( count( $this->bcc ) )
         {
-            $this->setHeader( "Bcc", ezcMailTools::composeEmailAddresses( 
$this->bcc ) );
+            $this->setHeader( "Bcc", ezcMailTools::composeEmailAddresses( 
$this->bcc,
+                                                                          
ezcMailHeaderFolder::getLimit()) );
         }
 
         // build subject header
@@ -291,7 +294,7 @@
             $preferences = array(
                 'input-charset' => $this->subjectCharset,
                 'output-charset' => $this->subjectCharset,
-                'line-length' => 76,
+                'line-length' => ezcMailHeaderFolder::getLimit(),
                 'scheme' => 'B',
                 'line-break-chars' => ezcMailTools::lineBreak()
             );
@@ -300,7 +303,7 @@
         }
         else
         {
-            $this->setHeader( 'Subject', $this->subject );
+            $this->setHeader( 'Subject', ezcMailHeaderFolder::foldAny( 
$this->subject ) );
         }
 
         $this->setHeader( 'MIME-Version', '1.0' );

Modified: trunk/Mail/src/mail_autoload.php
===================================================================
--- trunk/Mail/src/mail_autoload.php    2006-09-24 10:21:52 UTC (rev 3555)
+++ trunk/Mail/src/mail_autoload.php    2006-09-24 10:28:02 UTC (rev 3556)
@@ -61,6 +61,7 @@
     'ezcMailParserSet'              => 'Mail/parser/interfaces/parser_set.php',
     'ezcMailParserShutdownHandler'  => 'Mail/parser/shutdown_handler.php',
 
-    'ezcMailCharsetConverter'       => 'Mail/internal/charset_convert.php'
+    'ezcMailCharsetConverter'       => 'Mail/internal/charset_convert.php',
+    'ezcMailHeaderFolder'           => 'Mail/internal/header_folder.php'
     );
 ?>

Modified: trunk/Mail/src/tools.php
===================================================================
--- trunk/Mail/src/tools.php    2006-09-24 10:21:52 UTC (rev 3555)
+++ trunk/Mail/src/tools.php    2006-09-24 10:28:02 UTC (rev 3556)
@@ -92,17 +92,55 @@
      * Returns the array $items consisting of ezcMailAddress objects
      * as one RFC822 compliant address string.
      *
+     * Set foldLength to control how many characters each line can have before 
a line
+     * break is inserted according to the folding rules specified in RFC2822.
+     *
      * @param array(ezcMailAddress) $items
+     * @parem int $foldLength
      * @return string
      */
-    public static function composeEmailAddresses( array $items )
+    public static function composeEmailAddresses( array $items, $foldLength = 
null )
     {
         $textElements = array();
         foreach ( $items as $item )
         {
             $textElements[] = ezcMailTools::composeEmailAddress( $item );
         }
-        return implode( ', ', $textElements );
+
+        if( $foldLength === null ) // quick version
+        {
+            return implode( ', ', $textElements );
+        }
+
+        $result = "";
+        $charsSinceFold = 0;
+        foreach( $textElements as $element )
+        {
+            $length = strlen( $element );
+            if( ( $charsSinceFold + $length + 2 /* comma, space */ ) > 
$foldLength )
+            {
+                // fold last line if there is any
+                if( $result != '' )
+                {
+                    $result .= "," . ezcMailTools::lineBreak() .' ';
+                    $charsSinceFold = 0;
+                }
+                $result .= $element;
+            }
+            else
+            {
+                if( $result == '' )
+                {
+                    $result = $element;
+                }
+                else
+                {
+                    $result .= ', ' . $element;
+                }
+            }
+            $charsSinceFold += $length + 1 /*space*/;
+        }
+        return $result;
     }
 
     /**

Added: trunk/Mail/tests/header_folder_test.php
===================================================================
--- trunk/Mail/tests/header_folder_test.php     2006-09-24 10:21:52 UTC (rev 
3555)
+++ trunk/Mail/tests/header_folder_test.php     2006-09-24 10:28:02 UTC (rev 
3556)
@@ -0,0 +1,73 @@
+<?php
+/**
+ * @copyright Copyright (C) 2005, 2006 eZ systems as. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ * @version //autogentag//
+ * @filesource
+ * @package Mail
+ * @subpackage Tests
+ */
+
+/**
+ * @package Mail
+ * @subpackage Tests
+ */
+class ezcMailHeaderFolderTest extends ezcTestCase
+{
+    public function testFoldAnyTooShort()
+    {
+        $reference = "This is a short string";
+        $this->assertEquals( $reference,
+                             ezcMailHeaderFolder::foldAny( $reference ) );
+    }
+
+    public function testFoldAny998()
+    {
+        $reference = "This is a much much longer string that goes over more 
than 998 characters. Since that is quite long this string will go on for a long 
time. Time to put on some music. I can recommend Pink Floyd, Hooverphonic, Chet 
Baker, Miles Davis, Morcheeba, Micheal Jackson, Madonna, Yanni, Jean Michelle 
Jarre, D'Sound, 4 Hero and a lot more. Now it is time to just fill this space 
with random stuff. But before I come to that, let me tell you that you should 
start flying. Doesn't matter what, but you need to fly. Go paragliding. 
FLYYYYYYYYYY :) Ok, still reading? You must be completely mad. MAD.. RAVIN MAD. 
fraardsadsf isadkjfahsdf tdsfjher tyieurwer eweriuer eyadsfifu rydsfiausdf 
goiusaydfoiuasydfosdaf odsfasdfoy dadskfjhkasjfd thlsakdjfhlksdjf haskdfjh 
alksjdf hlkasdjf hlksajdf hlaksjdf hldksajf hklsjadh falskjdf haklsjd fhklsajdf 
hkajlsd fhlkjash dfklajsdf hksjad hfkljsah dflkjash dfkljash dflkjashd fkljasfd 
hlkajs hdfkljasdh fkljasd hflkjasd hfjklas hdflkjash dfkljas hdfkjashd flkjasdh 
flaksjfdh aklsjfd hlkasjfd haksjldf hklsadf safdhkl sajkd fhlaksjdh f askdjhfl 
laksdhf lkasdfsadhflkajs dfhkljhasdl f";
+        ezcMailHeaderFolder::setLimit( ezcMailHeaderFolder::HARD_LIMIT );
+        $folded = ezcMailHeaderFolder::foldAny( $reference );
+        $exploded = explode( ezcMailTools::lineBreak(), $folded );
+        $this->assertEquals( 2, count( $exploded  ) );
+        $this->assertEquals( 989, strlen( $exploded[0] ) );
+    }
+
+    public function testFoldAny998MultiFold()
+    {
+        $reference = "This is a much much longer string that goes over more 
than 998 characters. Since that is quite long this string will go on for a long 
time. Time to put on some music. I can recommend Pink Floyd, Hooverphonic, Chet 
Baker, Miles Davis, Morcheeba, Micheal Jackson, Madonna, Yanni, Jean Michelle 
Jarre, D'Sound, 4 Hero and a lot more. Now it is time to just fill this space 
with random stuff. But before I come to that, let me tell you that you should 
start flying. Doesn't matter what, but you need to fly. Go paragliding. 
FLYYYYYYYYYY :) Ok, still reading? You must be completely mad. MAD.. RAVIN MAD. 
fraardsadsf isadkjfahsdf tdsfjher tyieurwer eweriuer eyadsfifu rydsfiausdf 
goiusaydfoiuasydfosdaf odsfasdfoy dadskfjhkasjfd thlsakdjfhlksdjf haskdfjh 
alksjdf hlkasdjf hlksajdf hlaksjdf hldksajf hklsjadh falskjdf haklsjd fhklsajdf 
hkajlsd fhlkjash dfklajsdf hksjad hfkljsah dflkjash dfkljash dflkjashd fkljasfd 
hlkajs hdfkljasdh fkljasd hflkjasd hfjklas hdflkjash dfkljas hdfkjashd flkjasdh 
flaksjfdh aklsjfd hlkasjfd haksjldf hklsadf safdhkl sajkd fhlaksjdh f askdjhfl 
laksdhf lkasdfsadhflkajs dfhkljhasdl fdsjaflkd asldfk tuiy iuy tuiy tiuyt iuyt 
iuyt iuy tiuy tuiyt iuyt iuty iuy tiuyt iuyt iuy tiuy tiu ytiuy tiuy tiuy tiut 
iuyt iut iu tiuyt iuy tiut iuy tuyt iut iuyt  ytiuy tiu ytiuy tiuy tiuy tiuy 
tiuy tuy tiuy tiuy tiuy tiuy tuytiutyiuyt iuytiuyt iutyiyut iutiuyt uy tiu ytiu 
ytiu ytiu ytiuy tiuy tuiytiutuitiuyt iuyt ui tuiytiuytiut uiuyt iuyt iutui 
tuiytuitiytiuy tiuyt uiytiutyiuyti uiyt uituytiuyt uiuyt iuytiuttiuytiuyt uyt 
uiytuiytiutiuty iuytiutiuytiuyt uytiutiuyt iuyt iuy tuyt iut iuyt iut iuyt uyt 
uiyt iuyt iuty iuyt iuyt iuyt uiyt yt uit iutyuytyiutuytuitiutiutyut y 
tuityutuytutuyt ytiuytiuytuiytuyt yitiytiyti iuyty ytiuyt yutiuyt yuti utiu 
ytiyutu ytiuyt iuyt uytiuyt iuytiu ytiuyt iuytyu tiuyt iutyiuytyuti uytiuytiu 
ytuiytyiutuy tyutiu ytiuytyut iuytiu t iut uiyt utyi utui ytiuyty iut uiyt uy 
tiu ytiu tyi uyt iuyt iu ytiu yt iuyt iuyt ui tu ytuiy tiutuyit ituuyti tuy 
tiuyt iuyt iuytiu tyu tiu ytiu ty uit yt iuytituuit yitu tiut yt iut yut iy ity 
utiu ytiu y yutityu";
+        ezcMailHeaderFolder::setLimit( ezcMailHeaderFolder::HARD_LIMIT );
+        $folded = ezcMailHeaderFolder::foldAny( $reference );
+        $exploded = explode( ezcMailTools::lineBreak(), $folded );
+        $this->assertEquals( 3, count( $exploded  ) );
+        $this->assertEquals( 989, strlen( $exploded[0] ) );
+        $this->assertEquals( 993, strlen( $exploded[1] ) );
+    }
+
+    public function testFoldAny76()
+    {
+        $reference = "This is a much much longer string that goes over more 
than 998 characters. Since that is quite long this string will go on for a long 
time. Time to put on some music. I can recommend Pink Floyd, Hooverphonic, Chet 
Baker, Miles Davis, Morcheeba, Micheal Jackson, Madonna, Yanni, Jean Michelle 
Jarre, D'Sound, 4 Hero and a lot more. Now it is time to just fill this space 
with random stuff. But before I come to that, let me tell you that you should 
start flying. Doesn't matter what, but you need to fly. Go paragliding. 
FLYYYYYYYYYY :) Ok, still reading? You must be completely mad. MAD.. RAVIN MAD. 
fraardsadsf isadkjfahsdf tdsfjher tyieurwer eweriuer eyadsfifu rydsfiausdf 
goiusaydfoiuasydfosdaf odsfasdfoy dadskfjhkasjfd thlsakdjfhlksdjf haskdfjh 
alksjdf hlkasdjf hlksajdf hlaksjdf hldksajf hklsjadh falskjdf haklsjd fhklsajdf 
hkajlsd fhlkjash dfklajsdf hksjad hfkljsah dflkjash dfkljash dflkjashd fkljasfd 
hlkajs hdfkljasdh fkljasd hflkjasd hfjklas hdflkjash dfkljas hdfkjashd flkjasdh 
flaksjfdh aklsjfd hlkasjfd haksjldf hklsadf safdhkl sajkd fhlaksjdh f askdjhfl 
laksdhf lkasdfsadhflkajs dfhkljhasdl f";
+        ezcMailHeaderFolder::setLimit( ezcMailHeaderFolder::SOFT_LIMIT );
+        $folded = ezcMailHeaderFolder::foldAny( $reference );
+        $exploded = explode( ezcMailTools::lineBreak(), $folded );
+        foreach( $exploded as $line )
+        {
+            $this->assertTrue( strlen( $line ) <= 76 );
+        }
+    }
+
+    public function testFoldAny76LongWord()
+    {
+        $reference = 
"Thisisalongwordthatismorethan76characterslong.Let'sseehowthisishandledbyourlittlefolder
 That was the first space.";
+        ezcMailHeaderFolder::setLimit( ezcMailHeaderFolder::SOFT_LIMIT );
+        $folded = ezcMailHeaderFolder::foldAny( $reference );
+        $exploded = explode( ezcMailTools::lineBreak(), $folded );
+        $this->assertEquals( 2, count( $exploded  ) );
+        $this->assertEquals( 87, strlen( $exploded[0] ) );
+        $this->assertEquals( 26, strlen( $exploded[1] ) );
+    }
+
+    public static function suite()
+    {
+         return new ezcTestSuite( "ezcMailHeaderFolderTest" );
+    }
+}
+?>


Property changes on: trunk/Mail/tests/header_folder_test.php
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/Mail/tests/suite.php
===================================================================
--- trunk/Mail/tests/suite.php  2006-09-24 10:21:52 UTC (rev 3555)
+++ trunk/Mail/tests/suite.php  2006-09-24 10:28:02 UTC (rev 3556)
@@ -29,6 +29,7 @@
 require_once( "parser/parser_test.php" );
 require_once( "parser/headers_holder_test.php" );
 require_once( "parser/parts/multipart_mixed_test.php" );
+require_once( "header_folder_test.php" );
 
 /**
  * @package Mail
@@ -59,6 +60,7 @@
         $this->addTest( ezcMailParserTest::suite() );
         $this->addTest( ezcMailHeadersHolderTest::suite() );
         $this->addTest( ezcMailMultipartMixedParserTest::suite() );
+        $this->addTest( ezcMailHeaderFolderTest::suite() );
        }
 
     public static function suite()

Modified: trunk/Mail/tests/tools_test.php
===================================================================
--- trunk/Mail/tests/tools_test.php     2006-09-24 10:21:52 UTC (rev 3555)
+++ trunk/Mail/tests/tools_test.php     2006-09-24 10:28:02 UTC (rev 3556)
@@ -46,7 +46,36 @@
                              ezcMailTools::composeEmailAddresses( $addresses ) 
);
     }
 
+    public function testComposeEmailAddressesSingleFolding()
+    {
+        $reference = "John Doe <[EMAIL PROTECTED]>, Harry Doe <[EMAIL 
PROTECTED]>," .
+            ezcMailTools::lineBreak() .
+            " Gordon Doe <[EMAIL PROTECTED]>, [EMAIL PROTECTED]";
+        $addresses = array( new ezcMailAddress( '[EMAIL PROTECTED]', 'John 
Doe' ),
+                            new ezcMailAddress( '[EMAIL PROTECTED]', 'Harry 
Doe' ),
+                            new ezcMailAddress( '[EMAIL PROTECTED]', 'Gordon 
Doe' ),
+                            new ezcMailAddress( '[EMAIL PROTECTED]' ) );
+        $result = ezcMailTools::composeEmailAddresses( $addresses, 76 );
+        $this->assertEquals( $reference, $result );
+    }
 
+    public function testComposeEmailAddressesMultiFolding()
+    {
+        $reference = "John Doe <[EMAIL PROTECTED]>, Harry Doe <[EMAIL 
PROTECTED]>," .
+            ezcMailTools::lineBreak() .
+            " Nancy Doe <[EMAIL PROTECTED]>, Faith Doe <[EMAIL PROTECTED]>," .
+            ezcMailTools::lineBreak() .
+            " Gordon Doe <[EMAIL PROTECTED]>, [EMAIL PROTECTED]";
+        $addresses = array( new ezcMailAddress( '[EMAIL PROTECTED]', 'John 
Doe' ),
+                            new ezcMailAddress( '[EMAIL PROTECTED]', 'Harry 
Doe' ),
+                            new ezcMailAddress( '[EMAIL PROTECTED]', 'Nancy 
Doe' ),
+                            new ezcMailAddress( '[EMAIL PROTECTED]', 'Faith 
Doe' ),
+                            new ezcMailAddress( '[EMAIL PROTECTED]', 'Gordon 
Doe' ),
+                            new ezcMailAddress( '[EMAIL PROTECTED]' ) );
+        $result = ezcMailTools::composeEmailAddresses( $addresses, 76 );
+        $this->assertEquals( $reference, $result );
+    }
+
     public function testParseEmailAddressMimeGood()
     {
         $add = ezcMailTools::parseEmailAddress( '"John Doe" <[EMAIL 
PROTECTED]>' );

-- 
svn-components mailing list
[email protected]
http://lists.ez.no/mailman/listinfo/svn-components

Reply via email to