diff --git a/src/Message.php b/src/Message.php index de455ef..26b6bee 100644 --- a/src/Message.php +++ b/src/Message.php @@ -2,18 +2,17 @@ namespace Laminas\Mime; +use Laminas\Mail\Header\ContentDisposition; use Laminas\Mail\Header\ContentType; use Laminas\Mail\Header\HeaderInterface; use Laminas\Mail\Headers; -use Laminas\Mime\Mime; -use Laminas\Mime\Part; - use function array_keys; use function base64_decode; use function count; use function current; use function quoted_printable_decode; use function sprintf; +use function str_starts_with; use function strlen; use function strpos; use function strtolower; @@ -333,6 +332,17 @@ public static function createFromMessage($message, $boundary = null, $EOL = Mime } } else { $newPart = new Part($body); + + if ($headers->has('content-disposition')) { + /** @var ContentDisposition $header */ + $header = $headers->get('content-disposition'); + if ( + str_starts_with($header->getFieldValue(), 'attachment') + && $header->getParameter('filename') !== null + ) { + $newPart->setFileName($header->getParameter('filename')); + } + } } foreach ($properties as $key => $value) { $newPart->$key = $value; diff --git a/test/MessageTest.php b/test/MessageTest.php index d0b96b6..94cd8f3 100644 --- a/test/MessageTest.php +++ b/test/MessageTest.php @@ -402,6 +402,8 @@ public function testDecodeMultipartMimeMessageWithMessagePartAlternatives() ); }, ARRAY_FILTER_USE_BOTH); $this->assertCount(1, $attachments); + $docAttachment = $attachments[1]; + $this->assertSame("DockMcWordface.docx", $docAttachment->getFileName()); $nonAttachments = array_filter($parts, function ($part, $index) { return ! str_starts_with(