|
@@ -1,6 +1,9 @@
|
|
|
# php-mime-mail-parser
|
|
|
|
|
|
-A fully tested mailparse extension wrapper for PHP 5.4+
|
|
|
+A fully tested email parser for PHP 7.1+ (mailparse extension wrapper).
|
|
|
+
|
|
|
+It's the most effective php email parser around in terms of performance, foreign character encoding, attachment handling, and ease of use.
|
|
|
+Internet Message Format RFC [822](https://tools.ietf.org/html/rfc822), [2822](https://tools.ietf.org/html/rfc2822), [5322](https://tools.ietf.org/html/rfc5322).
|
|
|
|
|
|
[](https://github.com/php-mime-mail-parser/php-mime-mail-parser/releases)
|
|
|
[](https://packagist.org/packages/php-mime-mail-parser/php-mime-mail-parser)
|
|
@@ -10,6 +13,7 @@ A fully tested mailparse extension wrapper for PHP 5.4+
|
|
|
|
|
|
This extension can be used to...
|
|
|
* Parse and read email from Postfix
|
|
|
+ * For reading messages (Filename extension: eml)
|
|
|
* Create webmail
|
|
|
* Store email information such a subject, HTML body, attachments, and etc. into a database
|
|
|
|
|
@@ -35,105 +39,185 @@ To install the latest version of PHP MIME Mail Parser, run the command below:
|
|
|
|
|
|
The following versions of PHP are supported:
|
|
|
|
|
|
-* PHP 5.4
|
|
|
-* PHP 5.5
|
|
|
-* PHP 5.6
|
|
|
-* PHP 7
|
|
|
-* HHVM
|
|
|
+* PHP 7.1
|
|
|
+* PHP 7.2
|
|
|
+* PHP 7.3
|
|
|
+
|
|
|
+Previous Versions:
|
|
|
+
|
|
|
+| PHP Compatibility | Version |
|
|
|
+| ------------- | ------------- |
|
|
|
+| HHVM | php-mime-mail-parser 2.11.1 |
|
|
|
+| PHP 5.4 | php-mime-mail-parser 2.11.1 |
|
|
|
+| PHP 5.5 | php-mime-mail-parser 2.11.1 |
|
|
|
+| PHP 5.6 | php-mime-mail-parser 3.0.4 |
|
|
|
+| PHP 7.0 | php-mime-mail-parser 3.0.4 |
|
|
|
+
|
|
|
+Make sure you have the mailparse extension (http://php.net/manual/en/book.mailparse.php) properly installed. The command line `php -m | grep mailparse` need to return "mailparse".
|
|
|
|
|
|
+
|
|
|
+### Install mailparse extension
|
|
|
+
|
|
|
+#### Ubuntu, Debian & derivatives
|
|
|
```
|
|
|
-sudo apt install php-cli php-pear php-dev php-mbstring
|
|
|
+sudo apt install php-cli php-mailparse
|
|
|
```
|
|
|
|
|
|
-Make sure you have the mailparse extension (http://php.net/manual/en/book.mailparse.php) properly installed. The command line `php -m | grep mailparse` need to return "mailparse" else install it:
|
|
|
-* PHP version > 7.0: mailparse
|
|
|
-* PHP version < 7.0: mailparse 2.1.6
|
|
|
+#### Others platforms
|
|
|
+```
|
|
|
+sudo apt install php-cli php-pear php-dev php-mbstring
|
|
|
+pecl install mailparse
|
|
|
+```
|
|
|
|
|
|
-Follow this steps to install mailparse:
|
|
|
+#### From source
|
|
|
|
|
|
-* Compile in the temp folder the extension mailparse or mailparse-2.1.6 (workaround because pecl install doesn't work yet)
|
|
|
+AAAAMMDD should be `php-config --extension-dir`
|
|
|
```
|
|
|
-cd
|
|
|
-pecl download mailparse
|
|
|
-tar -xvf mailparse-3.0.2.tgz
|
|
|
-cd mailparse-3.0.2/
|
|
|
+git clone https://github.com/php/pecl-mail-mailparse.git
|
|
|
+cd pecl-mail-mailparse
|
|
|
phpize
|
|
|
./configure
|
|
|
sed -i 's/#if\s!HAVE_MBSTRING/#ifndef MBFL_MBFILTER_H/' ./mailparse.c
|
|
|
make
|
|
|
-sudo mv modules/mailparse.so /usr/lib/php/20160303/
|
|
|
-```
|
|
|
-* Add the extension mailparse and activate it
|
|
|
-```
|
|
|
+sudo mv modules/mailparse.so /usr/lib/php/AAAAMMDD/
|
|
|
echo "extension=mailparse.so" | sudo tee /etc/php/7.1/mods-available/mailparse.ini
|
|
|
sudo phpenmod mailparse
|
|
|
```
|
|
|
|
|
|
-On Windows, you need to download mailparse DLL from http://pecl.php.net/package/mailparse and add the line "extension=php_mailparse.dll" to php.ini accordingly.
|
|
|
+#### Windows
|
|
|
+You need to download mailparse DLL from http://pecl.php.net/package/mailparse and add the line "extension=php_mailparse.dll" to php.ini accordingly.
|
|
|
|
|
|
## How do I use it?
|
|
|
|
|
|
+### Loading an email
|
|
|
+
|
|
|
+You can load an email with 4 differents ways. You only need to use one of the following four.
|
|
|
+
|
|
|
```php
|
|
|
-<?php
|
|
|
-// Include the library first
|
|
|
require_once __DIR__.'/vendor/autoload.php';
|
|
|
|
|
|
-$path = 'path/to/mail.txt';
|
|
|
-$Parser = new PhpMimeMailParser\Parser();
|
|
|
+$path = 'path/to/email.eml';
|
|
|
+$parser = new PhpMimeMailParser\Parser();
|
|
|
+
|
|
|
+// 1. Specify a file path (string)
|
|
|
+$parser->setPath($path);
|
|
|
+
|
|
|
+// 2. Specify the raw mime mail text (string)
|
|
|
+$parser->setText(file_get_contents($path));
|
|
|
|
|
|
-// There are four methods available to indicate which mime mail to parse.
|
|
|
-// You only need to use one of the following four:
|
|
|
+// 3. Specify a php file resource (stream)
|
|
|
+$parser->setStream(fopen($path, "r"));
|
|
|
|
|
|
-// 1. Specify a file path to the mime mail.
|
|
|
-$Parser->setPath($path);
|
|
|
+// 4. Specify a stream to work with mail server (stream)
|
|
|
+$parser->setStream(fopen("php://stdin", "r"));
|
|
|
+```
|
|
|
+
|
|
|
+### Get the metadata of the message
|
|
|
|
|
|
-// 2. Specify a php file resource (stream) to the mime mail.
|
|
|
-$Parser->setStream(fopen($path, "r"));
|
|
|
+Get the sender and the receiver:
|
|
|
|
|
|
-// 3. Specify the raw mime mail text.
|
|
|
-$Parser->setText(file_get_contents($path));
|
|
|
+```php
|
|
|
+$rawHeaderTo = $parser->getHeader('to');
|
|
|
+// return "test" <test@example.com>, "test2" <test2@example.com>
|
|
|
|
|
|
-// 4. Specify a stream to work with mail server
|
|
|
-$Parser->setStream(fopen("php://stdin", "r"));
|
|
|
+$arrayHeaderTo = $parser->getAddresses('to');
|
|
|
+// return [["display"=>"test", "address"=>"test@example.com", false]]
|
|
|
|
|
|
-// Once we've indicated where to find the mail, we can parse out the data
|
|
|
-$to = $Parser->getHeader('to'); // "test" <test@example.com>, "test2" <test2@example.com>
|
|
|
-$addressesTo = $Parser->getAddresses('to'); //Return an array : [["display"=>"test", "address"=>"test@example.com", false],["display"=>"test2", "address"=>"test2@example.com", false]]
|
|
|
+$rawHeaderFrom = $parser->getHeader('from');
|
|
|
+// return "test" <test@example.com>
|
|
|
|
|
|
-$from = $Parser->getHeader('from'); // "test" <test@example.com>
|
|
|
-$addressesFrom = $Parser->getAddresses('from'); //Return an array : [["display"=>"test", "address"=>"test@example.com", "is_group"=>false]]
|
|
|
+$arrayHeaderFrom = $parser->getAddresses('from');
|
|
|
+// return [["display"=>"test", "address"=>"test@example.com", "is_group"=>false]]
|
|
|
+```
|
|
|
|
|
|
-$subject = $Parser->getHeader('subject');
|
|
|
+Get the subject:
|
|
|
|
|
|
-$text = $Parser->getMessageBody('text');
|
|
|
+```php
|
|
|
+$subject = $parser->getHeader('subject');
|
|
|
+```
|
|
|
|
|
|
-$html = $Parser->getMessageBody('html');
|
|
|
-$htmlEmbedded = $Parser->getMessageBody('htmlEmbedded'); //HTML Body included data
|
|
|
+Get other headers:
|
|
|
|
|
|
-$stringHeaders = $Parser->getHeadersRaw(); // Get all headers as a string, no charset conversion
|
|
|
-$arrayHeaders = $Parser->getHeaders(); // Get all headers as an array, with charset conversion
|
|
|
+```php
|
|
|
+$stringHeaders = $parser->getHeadersRaw();
|
|
|
+// return all headers as a string, no charset conversion
|
|
|
|
|
|
-// Pass in a writeable path to save attachments
|
|
|
-$attach_dir = '/path/to/save/attachments/'; // Be sure to include the trailing slash
|
|
|
-$include_inline = true; // Optional argument to include inline attachments (default: true)
|
|
|
-$Parser->saveAttachments($attach_dir [,$include_inline]);
|
|
|
+$arrayHeaders = $parser->getHeaders();
|
|
|
+// return all headers as an array, with charset conversion
|
|
|
+```
|
|
|
|
|
|
-// Get an array of Attachment items from $Parser
|
|
|
-$attachments = $Parser->getAttachments([$include_inline]);
|
|
|
+### Get the body of the message
|
|
|
|
|
|
-// Loop through all the Attachments
|
|
|
-if (count($attachments) > 0) {
|
|
|
- foreach ($attachments as $attachment) {
|
|
|
- echo 'Filename : '.$attachment->getFilename().'<br />'; // logo.jpg
|
|
|
- echo 'Filesize : '.filesize($attach_dir.$attachment->getFilename()).'<br />'; // 1000
|
|
|
- echo 'Filetype : '.$attachment->getContentType().'<br />'; // image/jpeg
|
|
|
- echo 'MIME part string : '.$attachment->getMimePartStr().'<br />'; // (the whole MIME part of the attachment)
|
|
|
- }
|
|
|
-}
|
|
|
+```php
|
|
|
+$text = $parser->getMessageBody('text');
|
|
|
+// return the text version
|
|
|
+
|
|
|
+$html = $parser->getMessageBody('html');
|
|
|
+// return the html version
|
|
|
+
|
|
|
+$htmlEmbedded = $parser->getMessageBody('htmlEmbedded');
|
|
|
+// return the html version with the embedded contents like images
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+### Get attachments
|
|
|
+
|
|
|
+Save all attachments in a directory
|
|
|
+
|
|
|
+```php
|
|
|
+$parser->saveAttachments('/path/to/save/attachments/');
|
|
|
+// return all attachments saved in the directory (include inline attachments)
|
|
|
+
|
|
|
+$parser->saveAttachments('/path/to/save/attachments/', false);
|
|
|
+// return all attachments saved in the directory (exclude inline attachments)
|
|
|
+
|
|
|
+// Save all attachments with the strategy ATTACHMENT_DUPLICATE_SUFFIX (default)
|
|
|
+$parser->saveAttachments('/path/to/save/attachments/', false, Parser::ATTACHMENT_DUPLICATE_SUFFIX);
|
|
|
+// return all attachments saved in the directory: logo.jpg, logo_1.jpg, ..., logo_100.jpg, YY34UFHBJ.jpg
|
|
|
+
|
|
|
+// Save all attachments with the strategy ATTACHMENT_RANDOM_FILENAME
|
|
|
+$parser->saveAttachments('/path/to/save/attachments/', false, Parser::ATTACHMENT_RANDOM_FILENAME);
|
|
|
+// return all attachments saved in the directory: YY34UFHBJ.jpg and F98DBZ9FZF.jpg
|
|
|
+
|
|
|
+// Save all attachments with the strategy ATTACHMENT_DUPLICATE_THROW
|
|
|
+$parser->saveAttachments('/path/to/save/attachments/', false, Parser::ATTACHMENT_DUPLICATE_THROW);
|
|
|
+// return an exception when there is attachments duplicate.
|
|
|
|
|
|
-?>
|
|
|
```
|
|
|
|
|
|
+Get all attachments
|
|
|
+
|
|
|
+```php
|
|
|
+$attachments = $parser->getAttachments();
|
|
|
+// return an array of all attachments (include inline attachments)
|
|
|
+
|
|
|
+$attachments = $parser->getAttachments(false);
|
|
|
+// return an array of all attachments (exclude inline attachments)
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+Loop through all the Attachments
|
|
|
+```php
|
|
|
+foreach ($attachments as $attachment) {
|
|
|
+ echo 'Filename : '.$attachment->getFilename().'<br />';
|
|
|
+ // return logo.jpg
|
|
|
+
|
|
|
+ echo 'Filesize : '.filesize($attach_dir.$attachment->getFilename()).'<br />';
|
|
|
+ // return 1000
|
|
|
+
|
|
|
+ echo 'Filetype : '.$attachment->getContentType().'<br />';
|
|
|
+ // return image/jpeg
|
|
|
+
|
|
|
+ echo 'MIME part string : '.$attachment->getMimePartStr().'<br />';
|
|
|
+ // return the whole MIME part of the attachment
|
|
|
+
|
|
|
+ $attachment->save('/path/to/save/myattachment/', Parser::ATTACHMENT_DUPLICATE_SUFFIX);
|
|
|
+ // return the path and the filename saved (same strategy available than saveAttachments)
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## Postfix configuration to manage email from a mail server
|
|
|
+
|
|
|
Next you need to forward emails to this script above. For that I'm using [Postfix](http://www.postfix.org/) like a mail server, you need to configure /etc/postfix/master.cf
|
|
|
|
|
|
Add this line at the end of the file (specify myhook to send all emails to the script test.php)
|
|
@@ -150,6 +234,8 @@ smtp inet n - - - - smtpd
|
|
|
|
|
|
The php script must use the fourth method to work with this configuration.
|
|
|
|
|
|
+And finally the easiest way is to use my SaaS https://mailcare.io
|
|
|
+
|
|
|
|
|
|
## Can I contribute?
|
|
|
|
|
@@ -162,6 +248,6 @@ Feel free to contribute!
|
|
|
|
|
|
If you report an issue, please provide the raw email that triggered it. This helps us reproduce the issue and fix it more quickly.
|
|
|
|
|
|
-### License
|
|
|
+## License
|
|
|
|
|
|
The php-mime-mail-parser/php-mime-mail-parser is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT)
|