Tidy PHP Mime Mail parse

This commit is contained in:
Marcus Hill 2023-01-31 14:22:06 +00:00
parent e6cc458b1c
commit 9f2c8bb4ba
8 changed files with 0 additions and 720 deletions

View File

@ -1,63 +0,0 @@
name: CI
on:
pull_request:
push:
branches: [main]
jobs:
tests:
runs-on: ubuntu-latest
strategy:
matrix:
php: [8.0, 8.1, 8.2]
dependency-version: [prefer-lowest, prefer-stable]
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: mailparse
coverage: none
- name: Install dependencies
run: composer update --${{ matrix.dependency-version }} --prefer-dist --no-interaction --no-suggest --no-progress
- name: Execute tests
run: vendor/bin/phpunit
php-cs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install dependencies
run: composer update --no-progress --ignore-platform-reqs
- name: Execute phpcs
run: vendor/bin/phpcs src tests --standard=psr2
coverage:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.0
extensions: mailparse
- name: Install dependencies
run: composer update --prefer-dist --no-interaction --no-suggest --no-progress
- name: Execute code coverage
run: |
vendor/bin/phpunit --coverage-clover=coverage.xml --whitelist src
bash <(curl -s https://codecov.io/bash) -t ${{ secrets.COVERALLS_REPO_TOKEN }}

View File

@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2016 Vincent Dauce
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -1,257 +0,0 @@
# 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](https://tools.ietf.org/html/rfc822), [2822](https://tools.ietf.org/html/rfc2822), [5322](https://tools.ietf.org/html/rfc5322).
[![Latest Version](https://img.shields.io/packagist/v/php-mime-mail-parser/php-mime-mail-parser.svg?style=flat-square)](https://github.com/php-mime-mail-parser/php-mime-mail-parser/releases)
[![Total Downloads](https://img.shields.io/packagist/dt/php-mime-mail-parser/php-mime-mail-parser.svg?style=flat-square)](https://packagist.org/packages/php-mime-mail-parser/php-mime-mail-parser)
[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
## Why?
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
## 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](https://github.com/php-mime-mail-parser/php-mime-mail-parser/actions/workflows/main.yml/badge.svg?style=flat-square)](https://github.com/php-mime-mail-parser/php-mime-mail-parser/actions/workflows/main.yml)
[![Coverage](https://codecov.io/gh/php-mime-mail-parser/php-mime-mail-parser/branch/main/graph/badge.svg?token=wTSIbXJDL0)](https://codecov.io/gh/php-mime-mail-parser/php-mime-mail-parser)
[![Code Quality](https://app.codacy.com/project/badge/Grade/8cbfe0fcd84c4b2b9282b9a0b4467607)](https://www.codacy.com/gh/php-mime-mail-parser/php-mime-mail-parser/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=php-mime-mail-parser/php-mime-mail-parser&amp;utm_campaign=Badge_Grade)
## How do I install it?
The easiest way is via [Composer](https://getcomposer.org/).
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
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` need to return "mailparse".
### Install mailparse extension
#### Ubuntu, Debian & derivatives
```
sudo apt install php-cli php-mailparse
```
#### Others 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 with 4 differents ways. You only need to use one of the following four.
```php
require_once __DIR__.'/vendor/autoload.php';
$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));
// 3. Specify a php file resource (stream)
$parser->setStream(fopen($path, "r"));
// 4. Specify a stream to work with mail server (stream)
$parser->setStream(fopen("php://stdin", "r"));
```
### Get the metadata of the message
Get the sender and the receiver:
```php
$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:
```php
$subject = $parser->getHeader('subject');
```
Get other headers:
```php
$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
```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)
```
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 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](http://opensource.org/licenses/MIT)

View File

@ -1,10 +0,0 @@
#!/bin/sh
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 /home/travis/.phpenv/versions/7.3.2/lib/php/extensions/no-debug-zts-20180731/
echo 'extension=mailparse.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini

View File

@ -1,60 +0,0 @@
{
"name": "php-mime-mail-parser/php-mime-mail-parser",
"type": "library",
"description": "A fully tested email parser for PHP 8.0+ (mailparse extension wrapper).",
"keywords": ["mime", "mail", "mailparse", "MimeMailParser", "parser", "php"],
"homepage": "https://github.com/php-mime-mail-parser/php-mime-mail-parser",
"license": "MIT",
"authors": [
{
"name":"eXorus",
"email":"exorus.spam@gmail.com",
"homepage":"https://github.com/eXorus/",
"role":"Developer"
},
{
"name":"M.Valinskis",
"email":"M.Valins@gmail.com",
"homepage":"https://code.google.com/p/php-mime-mail-parser",
"role":"Developer"
},
{
"name":"eugene.emmett.wood",
"email":"gene_w@cementhorizon.com",
"homepage":"https://code.google.com/p/php-mime-mail-parser",
"role":"Developer"
},
{
"name":"alknetso",
"email":"alkne@gmail.com",
"homepage":"https://code.google.com/p/php-mime-mail-parser",
"role":"Developer"
},
{
"name":"bucabay",
"email":"gabe@fijiwebdesign.com",
"homepage":"http://www.fijiwebdesign.com",
"role":"Developer"
}
],
"repository":{
"type":"git",
"url":"https://github.com/php-mime-mail-parser/php-mime-mail-parser.git"
},
"require": {
"php": "^8.0",
"ext-mailparse": "*"
},
"require-dev": {
"phpunit/phpunit": "^9.3",
"php-coveralls/php-coveralls": "^2.2",
"squizlabs/php_codesniffer": "^3.5"
},
"replace": {
"exorus/php-mime-mail-parser": "*",
"messaged/php-mime-mail-parser": "*"
},
"autoload": {
"psr-4": { "PhpMimeMailParser\\": "src/" }
}
}

View File

@ -1,303 +0,0 @@
<?php
/**
* @link http://php.net/manual/en/mailparse.constants.php
*/
define('MAILPARSE_EXTRACT_OUTPUT', 0);
/**
* @link http://php.net/manual/en/mailparse.constants.php
*/
define('MAILPARSE_EXTRACT_STREAM', 1);
/**
* @link http://php.net/manual/en/mailparse.constants.php
*/
define('MAILPARSE_EXTRACT_RETURN', 2);
/**
* Parses a file. This is the optimal way of parsing a mail file that you have on
* disk.
*
* @link http://php.net/manual/en/functions.mailparse-msg-parse-file.php
*
* @param string $filename Path to the file holding the message. The file is opened
* and streamed through the parser
*
* @return resource Returns a MIME resource representing the structure, or false on error
*/
function mailparse_msg_parse_file($filename)
{
}
/**
* .
*
* @link http://php.net/manual/en/functions.mailparse-msg-get-part.php
*
* @param resource $mimemail A valid MIME resource
* @param string $mimesection
*
* @return resource
*/
function mailparse_msg_get_part($mimemail, $mimesection)
{
}
/**
* .
*
* @link http://php.net/manual/en/functions.mailparse-msg-get-structure.php
*
* @param resource $mimemail A valid MIME resource
*
* @return array
*/
function mailparse_msg_get_structure($mimemail)
{
}
/**
* .
*
* @link http://php.net/manual/en/functions.mailparse-msg-get-part-data.php
*
* @param resource $mimemail A valid MIME resource
*
* @return array
*/
function mailparse_msg_get_part_data($mimemail)
{
}
/**
* .
*
* @link http://php.net/manual/en/functions.mailparse-msg-extract-part.php
*
* @param resource $mimemail A valid MIME resource
* @param string $msgbody
* @param callable $callbackfunc
*
* @return void
*/
function mailparse_msg_extract_part($mimemail, $msgbody, $callbackfunc)
{
}
/**
* Extracts/decodes a message section from the supplied filename.
*
* @link http://php.net/manual/en/functions.mailparse-msg-extract-part-file.php
*
* @param resource $mimemail A valid MIME resource, created with
* mailparse_msg_create
* @param mixed $filename Can be a file name or a valid stream resource
* @param callable $callbackfunc If set, this must be either a valid callback that
* will be passed the extracted section, or null to make this function return the
* extracted section
*
* @return string If $callbackfunc is not null returns true on success
*/
function mailparse_msg_extract_part_file($mimemail, $filename, $callbackfunc = false)
{
}
/**
* .
*
* @link http://php.net/manual/en/functions.mailparse-msg-extract-whole-part-file.php
*
* @param resource $mimemail A valid MIME resource
* @param string $filename
* @param callable $callbackfunc
*
* @return string
*/
function mailparse_msg_extract_whole_part_file($mimemail, $filename, $callbackfunc)
{
}
/**
* Create a MIME mail resource.
*
* @link http://php.net/manual/en/functions.mailparse-msg-create.php
* @return resource Returns a handle that can be used to parse a message
*/
function mailparse_msg_create()
{
}
/**
* Frees a MIME resource.
*
* @link http://php.net/manual/en/functions.mailparse-msg-free.php
*
* @param resource $mimemail A valid MIME resource allocated by
* mailparse_msg_create or mailparse_msg_parse_file
*
* @return boolean|null
*/
function mailparse_msg_free($mimemail)
{
}
/**
* Incrementally parse data into the supplied mime mail resource.
*
* @link http://php.net/manual/en/functions.mailparse-msg-parse.php
*
* @param resource $mimemail A valid MIME resource
* @param string $data
*
* @return boolean|null
*/
function mailparse_msg_parse($mimemail, $data)
{
}
/**
* Parses a RFC 822 compliant recipient list, such as that found in the To: header.
*
* @link http://php.net/manual/en/functions.mailparse-rfc822-parse-addresses.php
*
* @param string $addresses A string containing addresses, like in: Wez Furlong
* wez@example.com, doe@example.com
*
* @return array Returns an array of associative arrays with the following keys for each
* recipient: display The recipient name, for display purpose. If this part is not
* set for a recipient, this key will hold the same value as address. address The
* email address is_group true if the recipient is a newsgroup, false otherwise
*/
function mailparse_rfc822_parse_addresses($addresses)
{
}
/**
* Figures out the best way of encoding the content read from the given file
* pointer.
*
* @link http://php.net/manual/en/functions.mailparse-determine-best-xfer-encoding.php
*
* @param resource $fp A valid file pointer, which must be seek-able
*
* @return string Returns one of the character encodings supported by the mbstring module
*/
function mailparse_determine_best_xfer_encoding($fp)
{
}
/**
* Streams data from the source file pointer, apply $encoding and write to the
* destination file pointer.
*
* @link http://php.net/manual/en/functions.mailparse-stream-encode.php
*
* @param resource $sourcefp A valid file handle. The file is streamed through the
* parser
* @param resource $destfp The destination file handle in which the encoded data
* will be written
* @param string $encoding One of the character encodings supported by the mbstring
* module
*
* @return boolean|null
*/
function mailparse_stream_encode($sourcefp, $destfp, $encoding)
{
}
/**
* Scans the data from the given file pointer and extract each embedded uuencoded
* file into a temporary file.
*
* @link http://php.net/manual/en/functions.mailparse-uudecode-all.php
*
* @param resource $fp A valid file pointer
*
* @return array Returns an array of associative arrays listing filename information.
* filename Path to the temporary file name created origfilename The original
* filename, for uuencoded parts only The first filename entry is the message body.
* The next entries are the decoded uuencoded files
*/
function mailparse_uudecode_all($fp)
{
}
/**
* @return
*/
function mailparse_test()
{
}
class mimemessage
{
/**
* @return
*/
public function mimemessage()
{
}
/**
* @return
*/
public function get_child()
{
}
/**
* @return
*/
public function get_child_count()
{
}
/**
* @return
*/
public function get_parent()
{
}
/**
* @return
*/
public function extract_headers()
{
}
/**
* @return
*/
public function extract_body()
{
}
/**
* @return
*/
public function enum_uue()
{
}
/**
* @return
*/
public function extract_uue()
{
}
/**
* @return
*/
public function remove()
{
}
/**
* @return
*/
public function add_child()
{
}
}

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit colors="true" bootstrap="vendor/autoload.php">
<testsuite name="eXorus PhpMimeMailParser Test Suite">
<directory suffix="Test.php">tests</directory>
</testsuite>
</phpunit>