9

我知道通过我的 cPanel 托管,我可以将电子邮件收件箱通过管道传输到脚本,但我想要做的是:

  1. 发送至 hi@hi.com
  2. 管道到 mail.php
  3. mail.php 读取主题和 .txt 附件
  4. 主题和.txt附件的内容存储在数据库中

有没有办法用直接的 PHP 做到这一点?

4

2 回答 2

6

存在一个 PHP 库,调用php-mime-mail-parser它本身依赖于PECL mailparse 库。安装这些后,实现您想要的代码非常简单:

<?php
require_once 'MimeMailParser.class.php';

$parser = new MimeMailParser();
$parser->setStream(STDIN);

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

$attachment_content = false;
foreach ($parser->getAttachments() as $attachment) {
    $extension = pathinfo($attachment->filename, PATHINFO_EXTENSION);
    if ($extension == "txt") {
        $attachment_content = $attachment->content;
        break;
    }
}

// adapt to what ever database you are using
$sth = $mysqli->prepare("INSERT INTO mails (subject, attachment) VALUES (:subject, :attachment)");
$sth->bindParam(':subject', $subject, PDO::PARAM_STR);
$sth->bindParam(':attachment', $attachment_content, PDO::PARAM_STR);
$sth->execute();

您可以将邮件通过管道传输到脚本中,因为它从STDIN. 您还可以通过更改setStream为从文件中读取setPath. 请参阅库的文档

于 2015-06-03T19:24:34.410 回答
5

您可能需要执行以下操作:

  1. 编写一个可在 CLI 中执行的 PHP 脚本(通过在指向 PHP 二进制文件的脚本顶部添加 #! 声明,然后设置其可执行权限)。

  2. 获取该脚本以从 php://stdin 读取原始电子邮件(file_get_contents 最简单)

  3. 使用 PEAR::Mail::Mime::Decode 之类的东西获取该脚本以将邮件解码为部分,或者我认为有一个方便的 Zend Framework 组件)。

  4. 从解码的消息中读取附件和主题,并正常存储

  5. exit(0) 最后告诉 CLI 这是一个干净的退出 - 任何其他 exit() 状态都可能导致退回的电子邮件。

于 2009-10-26T11:29:30.660 回答