From 990309f2d30097dd91c9eda5528417f3bdc32a4f Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Fri, 20 May 2016 22:55:29 +0300 Subject: [PATCH] Add more tests --- .../0.0.0/app/libraries/MailSo/Mime/Email.php | 7 +- tests/MailSo/Base/HtmlUtilsTest.php | 4 +- tests/MailSo/Base/LinkFinderTest.php | 96 ++++++++ tests/MailSo/Imap/ImapClientTest.php | 85 +++++++ tests/MailSo/Mime/EmailCollectionTest.php | 18 ++ tests/MailSo/Mime/EmailTest.php | 133 ++++++++++ tests/bootstrap.php | 2 +- tests/{_data => data}/html/1-ok.html | 0 tests/{_data => data}/html/1.html | 0 tests/{_data => data}/html/2-ok.html | 0 tests/{_data => data}/html/2.html | 0 tests/data/mails/uid-01.eml | 232 ++++++++++++++++++ tests/data/mails/uid-02.eml | 16 ++ tests/data/mails/uid-03.eml | 18 ++ tests/data/mails/uid-04.eml | 55 +++++ tests/data/mails/uid-05.eml | 55 +++++ 16 files changed, 716 insertions(+), 5 deletions(-) create mode 100644 tests/MailSo/Base/LinkFinderTest.php create mode 100644 tests/MailSo/Imap/ImapClientTest.php create mode 100644 tests/MailSo/Mime/EmailCollectionTest.php create mode 100644 tests/MailSo/Mime/EmailTest.php rename tests/{_data => data}/html/1-ok.html (100%) rename tests/{_data => data}/html/1.html (100%) rename tests/{_data => data}/html/2-ok.html (100%) rename tests/{_data => data}/html/2.html (100%) create mode 100644 tests/data/mails/uid-01.eml create mode 100644 tests/data/mails/uid-02.eml create mode 100644 tests/data/mails/uid-03.eml create mode 100644 tests/data/mails/uid-04.eml create mode 100644 tests/data/mails/uid-05.eml 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_--