diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php
index ee03c6720..1da3d320f 100644
--- a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php
+++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php
@@ -287,13 +287,14 @@ class Email
/**
* @param bool $bIdn = false
+ * @param bool $bDkim = true
*
* @return array
*/
- public function ToArray($bIdn = false)
+ public function ToArray($bIdn = false, $bDkim = true)
{
- return array($this->sDisplayName, $this->GetEmail($bIdn), $this->sRemark,
- $this->sDkimStatus, $this->sDkimValue);
+ return $bDkim ? array($this->sDisplayName, $this->GetEmail($bIdn), $this->sRemark, $this->sDkimStatus, $this->sDkimValue) :
+ array($this->sDisplayName, $this->GetEmail($bIdn), $this->sRemark);
}
/**
diff --git a/tests/MailSo/Base/HtmlUtilsTest.php b/tests/MailSo/Base/HtmlUtilsTest.php
index 4ef8dd260..e927002bb 100644
--- a/tests/MailSo/Base/HtmlUtilsTest.php
+++ b/tests/MailSo/Base/HtmlUtilsTest.php
@@ -1,6 +1,8 @@
object = \MailSo\Base\LinkFinder::NewInstance();
+ }
+
+ protected function tearDown()
+ {
+ $this->object = null;
+ }
+
+ public function testNewInstance()
+ {
+ $this->assertTrue($this->object instanceof \MailSo\Base\LinkFinder);
+ }
+
+ public function testClear()
+ {
+ $this->object->Text('111');
+ $this->assertEquals('111', $this->object->CompileText());
+ $this->object->Clear();
+ $this->assertEquals('', $this->object->CompileText());
+ }
+
+ public function testText()
+ {
+ $this->object->Text('222');
+ $this->assertEquals('222', $this->object->CompileText());
+ }
+
+ public function testLinkWrapper()
+ {
+ $this->object
+ ->Text('333 http://domain.com 333')
+ ->LinkWrapper(function ($sLink) {
+ return '!'.$sLink.'!';
+ })
+ ;
+
+ $this->assertEquals('333 !http://domain.com! 333', $this->object->CompileText());
+ }
+
+ public function testMailWrapper()
+ {
+ $this->object
+ ->Text('444 user@domain.com 444')
+ ->MailWrapper(function ($sMail) {
+ return '!'.$sMail.'!';
+ })
+ ;
+
+ $this->assertEquals('444 !user@domain.com! 444', $this->object->CompileText());
+ }
+
+ public function testUseDefaultWrappers()
+ {
+ $this->object
+ ->Text('555 http://domain.com user@domain.com 555')
+ ->UseDefaultWrappers()
+ ;
+
+ $this->assertEquals('555 http://domain.com user@domain.com 555',
+ $this->object->CompileText());
+
+ $this->object->UseDefaultWrappers(true);
+
+ $this->assertEquals('555 http://domain.com user@domain.com 555',
+ $this->object->CompileText());
+ }
+
+ public function testCompileText()
+ {
+ $this->object
+ ->Text('777 http://domain.com domain.com user@domain.com <> 777')
+ ->LinkWrapper(function ($sLink) {
+ return '~'.$sLink.'~';
+ })
+ ->MailWrapper(function ($sMail) {
+ return '~'.$sMail.'~';
+ })
+ ;
+
+ $this->assertEquals('777 ~http://domain.com~ domain.com ~user@domain.com~ <> 777', $this->object->CompileText(true));
+ $this->assertEquals('777 ~http://domain.com~ domain.com ~user@domain.com~ <> 777', $this->object->CompileText(false));
+ }
+}
diff --git a/tests/MailSo/Imap/ImapClientTest.php b/tests/MailSo/Imap/ImapClientTest.php
new file mode 100644
index 000000000..92d994029
--- /dev/null
+++ b/tests/MailSo/Imap/ImapClientTest.php
@@ -0,0 +1,85 @@
+TestSetValues($rConnect, array('NAMESPACE'));
+ $oResult = $oImapClient->GetNamespace();
+
+ $this->assertTrue($oResult instanceof \MailSo\Imap\NamespaceResult);
+ }
+
+ public function testQuota()
+ {
+ $rConnect = \MailSo\Base\StreamWrappers\Test::CreateStream(
+ '* QUOTAROOT "INBOX" ""'.self::CRLF.
+ '* QUOTA "" (STORAGE 55163 10511217)'.self::CRLF.
+ 'TAG1 OK Success'.self::CRLF
+ );
+
+ $oImapClient = \MailSo\Imap\ImapClient::NewInstance()->TestSetValues($rConnect, array('QUOTA'));
+
+ $aResult = $oImapClient->Quota();
+ $this->assertTrue(is_array($aResult));
+ $this->assertEquals(4, count($aResult));
+ $this->assertEquals(55163, $aResult[0]);
+ $this->assertEquals(10511217, $aResult[1]);
+ }
+
+ public function testFolderList()
+ {
+ $rConnect = \MailSo\Base\StreamWrappers\Test::CreateStream(
+'* LIST (\Noselect) "/" 0'.self::CRLF.
+'* LIST (\UnMarked) "/" 0/1'.self::CRLF.
+'* LIST (\Noselect) "/" 1'.self::CRLF.
+'* LIST (\Noselect) "/" 1/2'.self::CRLF.
+'* LIST (\UnMarked) "/" 1/2/3'.self::CRLF.
+'* LIST (\UnMarked \Inbox) "/" INBOX'.self::CRLF.
+'* LIST (\UnMarked) "/" "INBOX/XXX XXX"'.self::CRLF.
+'* LIST (\UnMarked) "/" &-BT,MAQBDoEM'.self::CRLF.
+'* LIST (\UnMarked) "NIL" NILDelimiteFolder'.self::CRLF.
+'* LIST (\UnMarked) "" EmptyDelimiteFolder'.self::CRLF.
+'TAG1 OK Success'.self::CRLF
+ );
+
+ $oImapClient = \MailSo\Imap\ImapClient::NewInstance()->TestSetValues($rConnect);
+
+ $aResult = $oImapClient->FolderList();
+ $this->assertTrue(is_array($aResult) && 0 < count($aResult));
+ $this->assertTrue($aResult[0] instanceof \MailSo\Imap\Folder);
+
+ $this->assertEquals('0', $aResult[0]->FullNameRaw());
+ $this->assertEquals('0', $aResult[0]->NameRaw());
+ $this->assertEquals('0/1', $aResult[1]->FullNameRaw());
+ $this->assertEquals('1', $aResult[1]->NameRaw());
+ $this->assertEquals('1', $aResult[2]->FullNameRaw());
+ $this->assertEquals('1/2', $aResult[3]->FullNameRaw());
+ $this->assertEquals('1/2/3', $aResult[4]->FullNameRaw());
+ $this->assertEquals('3', $aResult[4]->NameRaw());
+ $this->assertEquals('INBOX', $aResult[5]->FullNameRaw());
+ $this->assertEquals('INBOX/XXX XXX', $aResult[6]->FullNameRaw());
+ $this->assertEquals('XXX XXX', $aResult[6]->NameRaw());
+ $this->assertEquals('&-BT,MAQBDoEM', $aResult[7]->FullNameRaw());
+
+ $this->assertTrue($aResult[5] instanceof \MailSo\Imap\Folder);
+ $this->assertEquals('/', $aResult[5]->Delimiter());
+ $this->assertEquals(2, count($aResult[5]->FlagsLowerCase()));
+ $this->assertTrue(in_array('\inbox', $aResult[5]->FlagsLowerCase()));
+
+ $this->assertTrue($aResult[8] instanceof \MailSo\Imap\Folder);
+ $this->assertEquals('.', $aResult[8]->Delimiter());
+
+ $this->assertTrue($aResult[9] instanceof \MailSo\Imap\Folder);
+ $this->assertEquals('.', $aResult[8]->Delimiter());
+ }
+}
diff --git a/tests/MailSo/Mime/EmailCollectionTest.php b/tests/MailSo/Mime/EmailCollectionTest.php
new file mode 100644
index 000000000..382a16381
--- /dev/null
+++ b/tests/MailSo/Mime/EmailCollectionTest.php
@@ -0,0 +1,18 @@
+assertEquals(1, $oMails->Count());
+ }
+
+ public function testNewInstance1()
+ {
+ $oMails = \MailSo\Mime\EmailCollection::NewInstance('User Name , User D\'Name , "User Name" ');
+ $this->assertEquals(3, $oMails->Count());
+ }
+}
diff --git a/tests/MailSo/Mime/EmailTest.php b/tests/MailSo/Mime/EmailTest.php
new file mode 100644
index 000000000..09a403f72
--- /dev/null
+++ b/tests/MailSo/Mime/EmailTest.php
@@ -0,0 +1,133 @@
+assertEquals('admin@example.com', $oMail->GetEmail());
+ $this->assertEquals('Administrator', $oMail->GetDisplayName());
+ $this->assertEquals('Remark', $oMail->GetRemark());
+ $this->assertEquals('admin', $oMail->GetAccountName());
+ $this->assertEquals('example.com', $oMail->GetDomain());
+ $this->assertEquals('"Administrator" (Remark)', $oMail->ToString());
+ $this->assertEquals(array('Administrator', 'admin@example.com', 'Remark', 'none', ''), $oMail->ToArray());
+ }
+
+ public function testNewInstance1()
+ {
+ $oMail = \MailSo\Mime\Email::NewInstance('admin@example.com');
+ $this->assertEquals('admin@example.com', $oMail->GetEmail());
+ $this->assertEquals('', $oMail->GetDisplayName());
+ $this->assertEquals('', $oMail->GetRemark());
+ $this->assertEquals('admin@example.com', $oMail->ToString());
+ $this->assertEquals(array('', 'admin@example.com', '', 'none', ''), $oMail->ToArray());
+ }
+
+ public function testNewInstance2()
+ {
+ $oMail = \MailSo\Mime\Email::NewInstance('admin@example.com', 'Administrator');
+ $this->assertEquals('admin@example.com', $oMail->GetEmail());
+ $this->assertEquals('Administrator', $oMail->GetDisplayName());
+ $this->assertEquals('', $oMail->GetRemark());
+ $this->assertEquals('"Administrator" ', $oMail->ToString());
+ $this->assertEquals(array('Administrator', 'admin@example.com', '', 'none', ''), $oMail->ToArray());
+ }
+
+ public function testNewInstance3()
+ {
+ $oMail = \MailSo\Mime\Email::NewInstance('admin@example.com', '', 'Remark');
+ $this->assertEquals('admin@example.com', $oMail->GetEmail());
+ $this->assertEquals('', $oMail->GetDisplayName());
+ $this->assertEquals('Remark', $oMail->GetRemark());
+ $this->assertEquals(' (Remark)', $oMail->ToString());
+ $this->assertEquals(array('', 'admin@example.com', 'Remark', 'none', ''), $oMail->ToArray());
+ }
+
+ /**
+ * @expectedException \MailSo\Base\Exceptions\InvalidArgumentException
+ */
+ public function testNewInstance4()
+ {
+ $oMail = \MailSo\Mime\Email::NewInstance('');
+ }
+
+ public function testParse1()
+ {
+ $oMail = \MailSo\Mime\Email::Parse('help@example.com');
+ $this->assertEquals('help@example.com', $oMail->GetEmail());
+
+ $oMail = \MailSo\Mime\Email::Parse('');
+ $this->assertEquals('help@example.com', $oMail->GetEmail());
+ }
+
+ public function testParse2()
+ {
+ $oMail = \MailSo\Mime\Email::Parse('"Тест" (Ремарка)');
+ $this->assertEquals('"Тест" (Ремарка)', $oMail->ToString());
+ }
+
+ public static function providerForParse()
+ {
+ return array(
+ array('test ',
+ array('test', 'help@example.com', '')),
+ array('test',
+ array('test', 'help@example.com', '')),
+ array('test< help@example.com >',
+ array('test', 'help@example.com', '')),
+ array(' (Remark)',
+ array('', 'help@example.com', 'Remark')),
+ array('"New \" Admin" (Rem)',
+ array('New " Admin', 'help@example.com', 'Rem')),
+ array('"Тест" (Ремарка)',
+ array('Тест', 'help@example.com', 'Ремарка')),
+ array('Microsoft Outlook',
+ array('Microsoft Outlook', 'MicrosoftExchange329e71ec88ae4615bbc36ab6ce41109e@ppth.private', '')),
+ );
+ }
+
+ public static function providerForParse2()
+ {
+ return array(
+ array('help@xn--d1abbgf6aiiy.xn--p1ai',
+ array('', 'help@президент.рф', '')),
+ );
+ }
+
+ /**
+ * @dataProvider providerForParse
+ */
+ public function testParseWithProvider($sValue, $aResult)
+ {
+ $oMail = \MailSo\Mime\Email::Parse($sValue);
+ $this->assertEquals($aResult, $oMail->ToArray(false, false));
+ }
+
+ /**
+ * @dataProvider providerForParse2
+ */
+ public function testParseWithProvider2($sValue, $aResult)
+ {
+ $oMail = \MailSo\Mime\Email::Parse($sValue);
+ $this->assertEquals($aResult, $oMail->ToArray(true, false));
+ }
+
+ /**
+ * @expectedException \MailSo\Base\Exceptions\InvalidArgumentException
+ */
+ public function testParse5()
+ {
+ $oMail = \MailSo\Mime\Email::Parse('');
+ }
+
+ /**
+ * @expectedException \MailSo\Base\Exceptions\InvalidArgumentException
+ */
+ public function testParse6()
+ {
+ $oMail = \MailSo\Mime\Email::Parse('example.com');
+ }
+}
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index 2582a6963..d5667e602 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -1,6 +1,6 @@
+From: from@domain.com
+To: test@domain.com
+Subject: TEST HTML MESSAGE WITH ATTACHMENT
+Date: Thu, 6 May 2010 07:26:37 -0700 (PDT)
+Content-Type: multipart/mixed;
+ boundary="--=_NextPart_11de424d3d872ac110be4ecfffc45411"
+
+----=_NextPart_11de424d3d872ac110be4ecfffc45411
+Content-Type: text/html;
+ charset="utf-8"
+Content-Transfer-Encoding: Quoted-Printable
+
+TEST HTML MESSAGE WITH ATTACHMENT
+
+----=_NextPart_11de424d3d872ac110be4ecfffc45411
+Content-Type: image/gif;
+ name="av-7.gif"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="av-7.gif"
+
+R0lGODdhMgAyAOfXAAAAADMAAGYAAJkAAMwAAP8AAAAzADMzAGYzAJkzAMwzAP8zAABmADNmAGZm
+AJlmAMxmAP9mAACZADOZAGaZAJmZAMyZAP+ZAADMADPMAGbMAJnMAMzMAP/MAAD/ADP/AGb/AJn/
+AMz/AP//AAAAMzMAM2YAM5kAM8wAM/8AMwAzMzMzM2YzM5kzM8wzM/8zMwBmMzNmM2ZmM5lmM8xm
+M/9mMwCZMzOZM2aZM5mZM8yZM/+ZMwDMMzPMM2bMM5nMM8zMM//MMwD/MzP/M2b/M5n/M8z/M///
+MwAAZjMAZmYAZpkAZswAZv8AZgAzZjMzZmYzZpkzZswzZv8zZgBmZjNmZmZmZplmZsxmZv9mZgCZ
+ZjOZZmaZZpmZZsyZZv+ZZgDMZjPMZmbMZpnMZszMZv/MZgD/ZjP/Zmb/Zpn/Zsz/Zv//ZgAAmTMA
+mWYAmZkAmcwAmf8AmQAzmTMzmWYzmZkzmcwzmf8zmQBmmTNmmWZmmZlmmcxmmf9mmQCZmTOZmWaZ
+mZmZmcyZmf+ZmQDMmTPMmWbMmZnMmczMmf/MmQD/mTP/mWb/mZn/mcz/mf//mQAAzDMAzGYAzJkA
+zMwAzP8AzAAzzDMzzGYzzJkzzMwzzP8zzABmzDNmzGZmzJlmzMxmzP9mzACZzDOZzGaZzJmZzMyZ
+zP+ZzADMzDPMzGbMzJnMzMzMzP/MzAD/zDP/zGb/zJn/zMz/zP//zAAA/zMA/2YA/5kA/8wA//8A
+/wAz/zMz/2Yz/5kz/8wz//8z/wBm/zNm/2Zm/5lm/8xm//9m/wCZ/zOZ/2aZ/5mZ/8yZ//+Z/wDM
+/zPM/2bM/5nM/8zM///M/wD//zP//2b//5n//8z//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQFCADYACwAAAAAMgAyAAAI/gCvCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzaswYiNVG
+ioFWAAg0kOTHhitYsQJwjZVIKycXBoJ5jeXMa1ZMxjyYUyDLkddS7kTYM2RIn0MRCl0xk+TRpARV
+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
+
+
+----=_NextPart_11de424d3d872ac110be4ecfffc45411--
+
+
diff --git a/tests/data/mails/uid-02.eml b/tests/data/mails/uid-02.eml
new file mode 100644
index 000000000..650a004aa
--- /dev/null
+++ b/tests/data/mails/uid-02.eml
@@ -0,0 +1,16 @@
+MIME-Version: 1.0
+From: test@domain.com
+To: test@domain.com
+Subject: TEST MESSAGE
+Content-Type: text/plain; charset="UTF-8"
+Content-Transfer-Encoding: 8bit
+Date: Wed, 28 Apr 2010 02:04:20 -0700
+Message-ID: <16800462619664130307453@TEST-TEST>
+
+TEST
+
+.
+
+. MESSGAE
+
+BODY
diff --git a/tests/data/mails/uid-03.eml b/tests/data/mails/uid-03.eml
new file mode 100644
index 000000000..6fd6e2ed1
--- /dev/null
+++ b/tests/data/mails/uid-03.eml
@@ -0,0 +1,18 @@
+Envelope-to: webmail@test.com
+Delivery-date: Tue, 15 Jun 2010 22:48:56 -0700
+Received: from [84.51.195.105] (helo=workstation5.dom2.local)
+ by mail.test.com with esmtpa (Exim 4.71)
+ (envelope-from )
+ id 1OOlUe-0002EQ-IJ
+ for webmail@test.com; Tue, 15 Jun 2010 22:48:56 -0700
+Date: Wed, 16 Jun 2010 09:48:42 +0400
+From: sss
+X-Mailer: The Bat! (v4.0.24) Professional
+Reply-To: sss
+X-Priority: 3 (Normal)
+Message-ID: <708372127.20100616094842@test.com>
+To: webmail@test.com
+Subject: =?iso-8859-5?B?v+DY4eLj39DvIA==?= =?iso-8859-5?B?2iDg0NHe4tUg4Q==?= =?iso-8859-5?B?3iDh2+PW0d7ZIA==?= =?iso-8859-5?B?V2luZG93cyBMaQ==?= =?iso-8859-5?B?dmUgSG90bWFpbA==?=
+MIME-Version: 1.0
+Content-Type: text/plain; charset=windows-1251
+Content-Transfer-Encoding: 8bit
diff --git a/tests/data/mails/uid-04.eml b/tests/data/mails/uid-04.eml
new file mode 100644
index 000000000..f5066b7d3
--- /dev/null
+++ b/tests/data/mails/uid-04.eml
@@ -0,0 +1,55 @@
+MIME-Version: 1.0
+Message-ID: <45a92f7.0e89f233c32fbd2b9d191d4cb28775c9@domain.com>
+From: from@domain.com
+To: test@domain.com
+Subject: TEST HTML MESSAGE WITH ATTACHMENT
+Date: Thu, 6 May 2010 07:26:37 -0700 (PDT)
+Content-Type: multipart/mixed;
+ boundary="--=_NextPart_11de424d3d872ac110be4ecfffc45411"
+
+----=_NextPart_11de424d3d872ac110be4ecfffc45411
+Content-Type: text/html;
+ charset="utf-8"
+Content-Transfer-Encoding: Quoted-Printable
+
+TEST HTML MESSAGE WITH ATTACHMENT
+
+----=_NextPart_11de424d3d872ac110be4ecfffc45411
+Content-Type: image/gif;
+ name="av-7.gif"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="av-7.gif"
+
+R0lGODdhMgAyAOfXAAAAADMAAGYAAJkAAMwAAP8AAAAzADMzAGYzAJkzAMwzAP8zAABmADNmAGZm
+AJlmAMxmAP9mAACZADOZAGaZAJmZAMyZAP+ZAADMADPMAGbMAJnMAMzMAP/MAAD/ADP/AGb/AJn/
+AMz/AP//AAAAMzMAM2YAM5kAM8wAM/8AMwAzMzMzM2YzM5kzM8wzM/8zMwBmMzNmM2ZmM5lmM8xm
+JkGbFiixJtrNgEcjNIo0ocmUcmc33Viyo9qSKnOzrTmx89CTGmUv5zm4NUiyPD02ZkVZtEvGnmVU
+whaJcCZdn0/NYpzsPHxQkF/lPk0PNepOtFeFduwKVqPd2QZdB2BDOZk3oEObHeiQTAqG5l2DBHEH
+IUMkPQhhTMlNSFBCRa12oEceJajhThKpZFNAADs=
+
+
+----=_NextPart_11de424d3d872ac110be4ecfffc45411
+Content-Type: image/gif;
+Content-Transfer-Encoding: base64
+
+R0lGODdhMgAyAOfXAAAAADMAAGYAAJkAAMwAAP8AAAAzADMzAGYzAJkzAMwzAP8zAABmADNmAGZm
+AJlmAMxmAP9mAACZADOZAGaZAJmZAMyZAP+ZAADMADPMAGbMAJnMAMzMAP/MAAD/ADP/AGb/AJn/
+AMz/AP//AAAAMzMAM2YAM5kAM8wAM/8AMwAzMzMzM2YzM5kzM8wzM/8zMwBmMzNmM2ZmM5lmM8xm
+JkGbFiixJtrNgEcjNIo0ocmUcmc33Viyo9qSKnOzrTmx89CTGmUv5zm4NUiyPD02ZkVZtEvGnmVU
+whaJcCZdn0/NYpzsPHxQkF/lPk0PNepOtFeFduwKVqPd2QZdB2BDOZk3oEObHeiQTAqG5l2DBHEH
+IUMkPQhhTMlNSFBCRa12oEceJajhThKpZFNAADs=
+
+
+----=_NextPart_11de424d3d872ac110be4ecfffc45411
+Content-Type: image/png
+Content-Transfer-Encoding: Quoted-Printable
+Content-Disposition: attachment;
+ filename*0*=111; filename*1*=222.gif;
+
+TEST HTML MESSAGE WITH ATTACHMENT
+
+
+----=_NextPart_11de424d3d872ac110be4ecfffc45411--
+
+
diff --git a/tests/data/mails/uid-05.eml b/tests/data/mails/uid-05.eml
new file mode 100644
index 000000000..038cc5492
--- /dev/null
+++ b/tests/data/mails/uid-05.eml
@@ -0,0 +1,55 @@
+From: alex1
+To: alex1
+Date: Thu, 22 Nov 2012 09:42:17 +0100
+Subject:
+ -------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5----...
+Thread-Topic:
+ -------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5----...
+Message-ID: <50ADE569.2000807@omninet.local>
+Accept-Language: de-DE
+Content-Language: de-DE
+X-MS-Has-Attach:
+X-MS-TNEF-Correlator:
+user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20121026
+ Thunderbird/16.0.2
+Content-Type: multipart/alternative;
+ boundary="_000_50ADE5692000807omninetlocal_"
+MIME-Version: 1.0
+
+--_000_50ADE5692000807omninetlocal_
+Content-Type: text/plain; charset="iso-8859-15"
+Content-Transfer-Encoding: quoted-printable
+
+Test
+-------1---------2---------3---------4---------5---------1---------2-------=
+--3---------4---------5---------1---------2---------3---------4---------5--=
+-------1---------2---------3---------4---------5---------1---------2-------=
+--3---------4---------5---------1---------2---------3---------4---------5--
+
+--_000_50ADE5692000807omninetlocal_
+Content-Type: text/html; charset="iso-8859-15"
+Content-Transfer-Encoding: quoted-printable
+
+
+
+
+
+
+
+ Test
+
+ -------1---------2---------3---------4---------5---------1-------=
+--2---------3---------4---------5---------1---------2---------3---------4--=
+-------5---------1---------2---------3---------4---------5---------1-------=
+--2---------3---------4---------5---------1---------2---------3---------4--=
+-------5--
+ HTML clipboard
+
+ HTML clipboard
+
+
+
+--_000_50ADE5692000807omninetlocal_--