erseco / mime-mail-parser
Parse emails without the mailparse extension
v1.0.6
2026-07-26 21:56 UTC
Requires
- php: ^8.0
Requires (Dev)
- pestphp/pest: ^1.23.1 || 2.35.1 || ^3.0 || ^4.0
- phpstan/phpstan: ^2.0
- squizlabs/php_codesniffer: ^3.13 || ^4.0
This package is auto-updated.
Last update: 2026-08-02 07:22:47 UTC
README
Mime Mail Parser for PHP
Simple, fast, no extensions required, based on [opcodesio/mail-parser](https://github.com/opcodesio/mail-parser)
Features | Installation | Credits
Features
Mime Mail Parser has a very simple API to parse emails and their MIME contents. Unlike many other parsers out there, this package does not require the mailparse PHP extension.
Has not been fully tested against RFC 5322.
Get Started
Requirements
- PHP 8.0+
Installation
To install the package via composer, Run:
composer require erseco/mime-mail-parser
Usage
use Erseco\Message; // Parse a message from a string $rawEmail = file_get_contents('/path/to/email.eml'); $message = Message::fromString($rawEmail); // Or parse from a file directly $message = Message::fromFile('/path/to/email.eml'); // Optional safety limits (defaults keep ordinary mail working) use Erseco\ParserOptions; $options = new ParserOptions( maxMessageBytes: 10_485_760, // 10 MiB raw message maxParts: 1000, // leaf MIME parts maxDepth: 20, // nested multipart depth maxHeaders: 500, // headers per header block maxHeaderLineLength: 998, // bytes per header line maxDecodedPartBytes: 10_485_760 ); $message = Message::fromString($rawEmail, false, $options); // Exceeding a limit throws Erseco\ParserLimitExceededException // with getLimitName(), getLimitValue(), and getActualValue(). $message->getHeaders(); // get all headers as array $message->getHeader('Content-Type'); // get specific header (raw unfolded value) $message->getContentType(); // 'multipart/mixed; boundary="----=_Part_1_1234567890"' $message->getFrom(); // 'Service <service@example.com>' $message->getTo(); // 'John Doe <johndoe@example.com>' $message->getSubject(); // raw subject (may still contain RFC 2047 encoded words) $message->getDate(); // DateTime object when the email was sent // RFC 2047: raw vs decoded headers // getHeader() / getSubject() keep the raw unfolded value, including encoded-words. // getDecodedHeader() and the convenience helpers decode B/Q encoded-words to text. $message->getHeader('Subject'); // '=?UTF-8?B?UmV1bmnDs24gZGUgcHJveWVjdG8=?=' $message->getDecodedHeader('Subject'); // 'Reunión de proyecto' $message->getDecodedSubject(); // same as getDecodedHeader('Subject') $message->getDecodedFrom(); $message->getDecodedTo(); $message->getDecodedReplyTo(); $message->getParts(); // Returns array of MessagePart objects $message->getHtmlPart(); // Returns MessagePart with HTML content $message->getTextPart(); // Returns MessagePart with Text content $message->getAttachments(); // Returns array of attachment MessageParts // Working with message parts $parts = $message->getParts(); $firstPart = $parts[0]; $firstPart->getHeaders(); // array of all headers for this part $firstPart->getHeader('Content-Type'); // get specific header $firstPart->getContentType(); // 'text/html; charset="utf-8"' $firstPart->getContent(); // transfer-decoded content (no charset conversion) $firstPart->getContentAsUtf8(); // text/* parts converted to UTF-8 when possible $firstPart->getCharset(); // charset from Content-Type, or null $firstPart->isHtml(); // true if it's an HTML part $firstPart->isText(); // true if it's a text part $firstPart->isAttachment(); // true if it's an attachment $firstPart->getFilename(); // name of the file if attachment // supports filename=, filename*=, and RFC 2231 // continuations (filename*0*=, filename*1*=, …) $firstPart->getSize(); // size of content in bytes
Credits
License
The MIT License (MIT). Please see License File for more information.