Skip to content

Commit

Permalink
Merge pull request #147 from linniksa/patch-mime-decoder
Browse files Browse the repository at this point in the history
Provide mime text decoder by RFC2047
  • Loading branch information
tedivm committed Aug 5, 2015
2 parents ea3f1bb + a528129 commit 3fbee96
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 4 deletions.
9 changes: 7 additions & 2 deletions src/Fetch/Attachment.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,9 @@ public function __construct(Message $message, $structure, $partIdentifier = null
$parameters = Message::getParametersFromStructure($structure);

if (isset($parameters['filename'])) {
$this->filename = imap_utf8($parameters['filename']);
$this->setFileName($parameters['filename']);
} elseif (isset($parameters['name'])) {
$this->filename = imap_utf8($parameters['name']);
$this->setFileName($parameters['name']);
}

$this->size = $structure->bytes;
Expand Down Expand Up @@ -231,4 +231,9 @@ public function saveAs($path)

return $result;
}

protected function setFileName($text)
{
$this->filename = MIME::decode($text, Message::$charset);
}
}
45 changes: 45 additions & 0 deletions src/Fetch/MIME.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

/*
* This file is part of the Fetch package.
*
* (c) Robert Hafner <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Fetch;

/**
* This library is a wrapper around the Imap library functions included in php.
*
* @package Fetch
* @author Robert Hafner <[email protected]>
* @author Sergey Linnik <[email protected]>
*/
final class MIME
{
/**
* @param string $text
* @param string $targetCharset
*
* @return string
*/
public static function decode($text, $targetCharset = 'utf-8')
{
if (null === $text) {
return null;
}

$result = '';

foreach (imap_mime_header_decode($text) as $word) {
$ch = 'default' === $word->charset ? 'ascii' : $word->charset;

$result .= iconv($ch, $targetCharset, $word->text);
}

return $result;
}
}
4 changes: 2 additions & 2 deletions src/Fetch/Message.php
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ protected function loadMessage()

return false;

$this->subject = isset($messageOverview->subject) ? imap_utf8($messageOverview->subject) : null;
$this->subject = MIME::decode($messageOverview->subject, self::$charset);
$this->date = strtotime($messageOverview->date);
$this->size = $messageOverview->size;

Expand Down Expand Up @@ -674,7 +674,7 @@ protected function processAddressObject($addresses)
$currentAddress = array();
$currentAddress['address'] = $address->mailbox . '@' . $address->host;
if (isset($address->personal)) {
$currentAddress['name'] = $address->personal;
$currentAddress['name'] = MIME::decode($address->personal, self::$charset);
}
$outputAddresses[] = $currentAddress;
}
Expand Down
51 changes: 51 additions & 0 deletions tests/Fetch/Test/MIMETest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

/*
* This file is part of the Fetch library.
*
* (c) Robert Hafner <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Fetch\Test;

use Fetch\MIME;

/**
* @package Fetch
* @author Robert Hafner <[email protected]>
* @author Sergey Linnik <[email protected]>
*/
class MIMETest extends \PHPUnit_Framework_TestCase
{
public function decodeData()
{
return array(
array(null, null),
array('Just text', 'Just text'),
array('Keith Moore <[email protected]>', '=?US-ASCII?Q?Keith_Moore?= <[email protected]>'),
array('Keld Jørn Simonsen <[email protected]>', '=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <[email protected]>'),
array('André Pirard <[email protected]>', '=?ISO-8859-1?Q?Andr=E9?= Pirard <[email protected]>'),
array(
'If you can read this you understand the example.',
'=?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?='
. PHP_EOL .
'=?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?='
),
);
}

/**
* @dataProvider decodeData
*
* @param string $expected
* @param string $text
* @param string $charset
*/
public function testDecode($expected, $text, $charset = 'UTF-8')
{
self::assertSame($expected, MIME::decode($text, $charset));
}
}

0 comments on commit 3fbee96

Please sign in to comment.