exorus/php-mime-mail-parser

此包已被废弃,不再维护。作者建议使用php-mime-mail-parser/php-mime-mail-parser包。

适用于PHP 8.0+的全面测试的邮件解析器(mailparse扩展包装器)。

8.0.4 2024-09-11 12:19 UTC

README

适用于PHP 8.0+的全面测试的邮件解析器(mailparse扩展包装器)。

在性能、外文编码、附件处理和使用便捷性方面,它是目前最有效的PHP邮件解析器。遵循Internet Message Format RFC 822、2822、5322。

Latest Version Total Downloads Software License

为什么?

此扩展可用于...

  • 解析和读取来自Postfix的邮件
  • 读取消息(文件扩展名:.eml
  • 创建Web邮件
  • 将邮件信息(如主题、HTML正文、附件等)存储到数据库中

它可靠吗?

是的。所有已知问题都已重现、修复并测试。

我们使用GitHub Actions、Codecov、Codacy来帮助确保代码质量。您可以在下面查看实时统计数据。

CI Coverage Code Quality

如何安装它?

最简单的方法是使用Composer

要安装PHP MIME Mail Parser的最新版本,请运行以下命令

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

要求

以下版本的PHP受支持

  • PHP 8.0
  • PHP 8.1
  • PHP 8.2
  • PHP 8.3

以前的版本

请确保已正确安装mailparse扩展(https://php.ac.cn/manual/en/book.mailparse.php)。命令行php -m | grep mailparse需要返回"mailparse"。

安装mailparse扩展

Debian、Ubuntu及衍生版本

sudo apt install php-cli php-mailparse

MacOS

brew install php
pecl install mailparse

其他平台

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

从源代码

AAAAMMDD应该是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

您需要从http://pecl.php.net/package/mailparse下载mailparse DLL,并将extension=php_mailparse.dll行添加到相应的php.ini中。

如何使用它?

加载邮件

您可以通过4种不同方式加载邮件

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"));

获取消息的元数据

获取发件人和收件人

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

获取主题

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

获取其他标题

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

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

获取消息正文

$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

获取附件

将所有附件保存到目录中

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

获取所有附件

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

遍历所有附件

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配置以管理来自邮件服务器的邮件

要将来自Postfix的邮件转发到上面的PHP脚本,请在/etc/postfix/master.cf的末尾添加此行(指定myhook将所有邮件发送到脚本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}

编辑此行(注册myhook)

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

PHP脚本必须使用上述第四种方法(见上面)才能与该配置一起工作。

最后,最简单的方法是使用我的SaaShttps://mailcare.io

我可以贡献吗?

请随时贡献!

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

如果您报告了一个问题,请提供触发该问题的原始邮件。这有助于我们更快地重现并修复问题。

许可证

php-mime-mail-parser/php-mime-mail-parser 是一个开源软件,遵循 MIT 许可协议