1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-18 11:30:55 +01:00
phorge-phorge/externals/mimemailparser
Valerio Bozzolan 9d3e258853 Add first unit test for mimemailparser headers
Summary:
Uploaded an example email with a lot of accents called 'test_accents.mbox' and
expected headers in the file 'test_accents.headers.txt'.

Better than nothing.

This change also includes a minor refactor in the library loading.

Ref T15960

Test Plan:
Manually run the new unit test and see green lights:

    arc unit src/applications/metamta/externals/__tests__/PhabricatorExternalMimeMailParserTestCase.php

Double-check that the new class is already recorded:

    arc liberate

Just as extra care, re-apply the same test plan of:

D25839

So, for example, run this, and see no exceptions:

    ./scripts/mail/mail_handler.php < src/applications/metamta/externals/__tests__/data/test_accents.mbox

Reviewers: aklapper, taavi, O1 Blessed Committers

Reviewed By: aklapper, O1 Blessed Committers

Subscribers: tobiaswiese, Matthew, Cigaryno

Maniphest Tasks: T15960

Differential Revision: https://we.phorge.it/D25844
2024-12-06 13:12:54 +01:00
..
Contracts Update mimemailparser from May 2011 version to 8.0.4 2024-11-01 08:59:05 +01:00
__init.php Add first unit test for mimemailparser headers 2024-12-06 13:12:54 +01:00
Attachment.php Update mimemailparser from May 2011 version to 8.0.4 2024-11-01 08:59:05 +01:00
Charset.php Update mimemailparser from May 2011 version to 8.0.4 2024-11-01 08:59:05 +01:00
Exception.php Update mimemailparser from May 2011 version to 8.0.4 2024-11-01 08:59:05 +01:00
LICENSE Update mimemailparser from May 2011 version to 8.0.4 2024-11-01 08:59:05 +01:00
Middleware.php Update mimemailparser from May 2011 version to 8.0.4 2024-11-01 08:59:05 +01:00
MiddlewareStack.php mimemailparser: Fix implicitly nullable parameter declarations for PHP 8.4 2024-11-26 15:02:10 +01:00
MimePart.php Update mimemailparser from May 2011 version to 8.0.4 2024-11-01 08:59:05 +01:00
Parser.php mimemailparser: Fix implicitly nullable parameter declarations for PHP 8.4 2024-11-26 15:02:10 +01:00
README.md Update mimemailparser from May 2011 version to 8.0.4 2024-11-01 08:59:05 +01:00

php-mime-mail-parser

A fully tested email parser for PHP 8.0+ (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, 2822, 5322.

Latest Version Total Downloads Software License

Why?

This extension can be used to...

  • Parse and read email from Postfix
  • Read messages (Filename extension: .eml)
  • Create webmail
  • Store email information such a subject, HTML body, attachments, etc. into a database

Is it reliable?

Yes. All known issues have been reproduced, fixed and tested.

We use GitHub Actions, Codecov, Codacy to help ensure code quality. You can see real-time statistics below:

CI Coverage Code Quality

How do I install it?

The easiest way is via Composer.

To install the latest version of PHP MIME Mail Parser, run the command below:

composer require php-mime-mail-parser/php-mime-mail-parser

Requirements

The following versions of PHP are supported:

  • PHP 8.0
  • PHP 8.1
  • PHP 8.2
  • PHP 8.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
PHP 7.1 php-mime-mail-parser 5.0.5
PHP 7.2 php-mime-mail-parser 7.1.2
PHP 7.3 php-mime-mail-parser 7.1.2
PHP 7.4 php-mime-mail-parser 7.1.2

Make sure you have the mailparse extension (http://php.net/manual/en/book.mailparse.php) properly installed. The command line php -m | grep mailparse needs to return "mailparse".

Install mailparse extension

Debian, Ubuntu & derivatives

sudo apt install php-cli php-mailparse

MacOS

brew install php
pecl install mailparse

Other platforms

sudo apt install php-cli php-pear php-dev php-mbstring
pecl install mailparse

From source

AAAAMMDD should be php-config --extension-dir

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/AAAAMMDD/
echo "extension=mailparse.so" | sudo tee /etc/php/7.1/mods-available/mailparse.ini
sudo phpenmod mailparse

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 in 4 differents ways:

require_once __DIR__.'/vendor/autoload.php';

$path = 'path/to/email.eml';
$parser = new PhpMimeMailParser\Parser();

// 1. Either specify a file path (string)
$parser->setPath($path); 

// 2. or specify the raw mime mail text (string)
$parser->setText(file_get_contents($path));

// 3. or specify a php file resource (stream)
$parser->setStream(fopen($path, "r"));

// 4. or specify a stream to work with a mail server (stream)
$parser->setStream(fopen("php://stdin", "r"));

Get the metadata of the message

Get the sender and the receiver:

$rawHeaderTo = $parser->getHeader('to');
// return "test" <test@example.com>, "test2" <test2@example.com>

$arrayHeaderTo = $parser->getAddresses('to');
// return [["display"=>"test", "address"=>"test@example.com", false]]

$rawHeaderFrom = $parser->getHeader('from');
// return "test" <test@example.com>

$arrayHeaderFrom = $parser->getAddresses('from');
// return [["display"=>"test", "address"=>"test@example.com", "is_group"=>false]]

Get the subject:

$subject = $parser->getHeader('subject');

Get other headers:

$stringHeaders = $parser->getHeadersRaw();
// return all headers as a string, no charset conversion

$arrayHeaders = $parser->getHeaders();
// return all headers as an array, with charset conversion

Get the body of the message

$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

$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

$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 attachments

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
    
    $stream = $attachment->getStream();
    // get the stream of the attachment file

    $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

To forward mails from Postfix to the PHP script above, add this line at the end of your /etc/postfix/master.cf (to specify myhook to send all emails to the script test.php):

myhook unix - n n - - pipe
  				flags=F user=www-data argv=php -c /etc/php5/apache2/php.ini -f /var/www/test.php ${sender} ${size} ${recipient}

Edit this line (register myhook)

smtp      inet  n       -       -       -       -       smtpd
        			-o content_filter=myhook:dummy

The PHP script must use the fourth method (see above) to work with this configuration.

And finally the easiest way is to use my SaaS https://mailcare.io

Can I contribute?

Feel free to contribute!

git clone https://github.com/php-mime-mail-parser/php-mime-mail-parser
cd php-mime-mail-parser
composer install
./vendor/bin/phpunit

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

The php-mime-mail-parser/php-mime-mail-parser is open-sourced software licensed under the MIT license