Stars: 412
Forks: 52
Pull Requests: 59
Issues: 165
Watchers: 20
Last Updated: 2023-09-09 01:39:17
An email parser written in PHP
License: BSD 2-Clause "Simplified" License
Languages: PHP
Testable and PSR-compliant mail mime parser alternative to PHP's imap* functions and Pear libraries for reading messages in Internet Message Format RFC 822 (and later revisions RFC 2822, RFC 5322).
The goals of this project are to be:
To include it for use in your project, install it via composer:
composer require zbateson/mail-mime-parser
A huge thank you to all my sponsors. <3
If this project's helped you, please consider sponsoring me.
As of mail-mime-parser 2.3.0, support for php 5.4, 5.5, 5.6 and 7.0 has been dropped.
getContentResourceHandle
, getTextResourceHandle
, and getHtmlResourceHandle
have all been deprecated in 1.2.1 and removed in 2.0.0. fread() will only return a single byte of a multibyte char, and so will cause potentially unexpected results/warnings in some cases, and psr7 streams should be used instead. Note that getBinaryContentResourceHandle
and getResourceHandle
are still available.
Upgrade to 2.0 to take advantage of the new on-demand parser which parses parts of a message as they're requested. This means reading only the headers from a larger message is as fast as a smaller message because the whole message is no longer parsed (similarly reading just the content and not a message's large attachments is also much faster.)
Because of the on-demand parsing, starting in 2.0, the passed resource handle or stream must remain open while the returned message object is still in use.
Old code:
$handle = fopen('file.mime', 'r');
$message = $mailParser->parse($handle); // returned `Message`
fclose($handle);
New code:
// attaches the resource handle to the returned `IMessage` if the second parameter
// is true. The resource handle is closed when the IMessage is destroyed.
$message = $mailParser->parse(fopen('file.mime', 'r'), true);
For a more complete list of changes, please visit the 2.0 Upgrade Guide.
MailMimeParser requires PHP 7.1 or newer. Tested on PHP 7.1, 7.2, 7.3, 7.4, 8.0, 8.1 and 8.2.
use ZBateson\MailMimeParser\MailMimeParser;
use ZBateson\MailMimeParser\Message;
use ZBateson\MailMimeParser\Header\HeaderConsts;
// use an instance of MailMimeParser as a class dependency
$mailParser = new MailMimeParser();
// parse() accepts a string, resource or Psr7 StreamInterface
// pass `true` as the second argument to attach the passed $handle and close
// it when the returned IMessage is destroyed.
$handle = fopen('file.mime', 'r');
$message = $mailParser->parse($handle, false); // returns `IMessage`
// OR: use this procedurally (Message::from also accepts a string,
// resource or Psr7 StreamInterface
// true or false as second parameter doesn't matter if passing a string.
$string = "Content-Type: text/plain\r\nSubject: Test\r\n\r\nMessage";
$message = Message::from($string, false);
echo $message->getHeaderValue(HeaderConsts::FROM); // [email protected]
echo $message
->getHeader(HeaderConsts::FROM) // AddressHeader
->getPersonName(); // Person Name
echo $message->getHeaderValue(HeaderConsts::SUBJECT); // The email's subject
echo $message
->getHeader(HeaderConsts::TO) // also AddressHeader
->getAddresses()[0] // AddressPart
->getPersonName(); // Person Name
echo $message
->getHeader(HeaderConsts::CC) // also AddressHeader
->getAddresses()[0] // AddressPart
->getEmail(); // [email protected]
echo $message->getTextContent(); // or getHtmlContent()
echo $message->getHeader('X-Foo'); // for custom or undocumented headers
$att = $message->getAttachmentPart(0); // first attachment
echo $att->getHeaderValue(HeaderConsts::CONTENT_TYPE); // e.g. "text/plain"
echo $att->getHeaderParameter( // value of "charset" part
'content-type',
'charset'
);
echo $att->getContent(); // get the attached file's contents
$stream = $att->getContentStream(); // the file is decoded automatically
$dest = \GuzzleHttp\Psr7\stream_for(
fopen('my-file.ext')
);
\GuzzleHttp\Psr7\copy_to_stream(
$stream, $dest
);
// OR: more simply if saving or copying to another stream
$att->saveContent('my-file.ext'); // writes to my-file.ext
$att->saveContent($stream); // copies to the stream
// close only when $message is no longer being used.
fclose($handle);
BSD licensed - please see license agreement.