Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 <tedivm@tedivm.com>
*
* 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 <tedivm@tedivm.com>
* @author Sergey Linnik <linniksa@gmail.com>
*/
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 <tedivm@tedivm.com>
*
* 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 <tedivm@tedivm.com>
* @author Sergey Linnik <linniksa@gmail.com>
*/
class MIMETest extends \PHPUnit_Framework_TestCase
{
public function decodeData()
{
return array(
array(null, null),
array('Just text', 'Just text'),
array('Keith Moore <moore@cs.utk.edu>', '=?US-ASCII?Q?Keith_Moore?= <moore@cs.utk.edu>'),
array('Keld Jørn Simonsen <keld@dkuug.dk>', '=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>'),
array('André Pirard <PIRARD@vm1.ulg.ac.be>', '=?ISO-8859-1?Q?Andr=E9?= Pirard <PIRARD@vm1.ulg.ac.be>'),
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));
}
}