Поиск (PHP) кода для извлечения электронной почты, его анализа и обработки - PullRequest
0 голосов
/ 29 октября 2010

Прежде чем я, вероятно, заново изобрету колесо, может кто-нибудь сказать мне, существует ли библиотека кодов FOSS для регулярной проверки электронной почты (или по заданию cron), для анализа заголовка и тела и выполнения определенных функций (главным образом отправка других писем).

Я думал о PHP как о стороне сервера и хорошо разбирался со строками, но я был бы достаточно доволен C или C ++.

Хммм, почему я вообще думаю о серверной стороне? Я полагаю, что он мог бы с таким же успехом работать на моем ПК (добавить Delphi, C ++ Builder и, возможно, C # или даже VB), насколько это возможно (извините, без обид; я знаю, что он хорошо подходит для обработки строк, но я не знаю PERL и не успеваю учиться).


Edit: я думаю о некотором общем коде, который позволяет определять «триггеры» и регистрировать функции обратного вызова. Таким образом, триггер может сказать, что sender = XXX, title содержит, To address is и т. Д. (Или их комбинации), и я могу зарегистрировать функцию обратного вызова, которую я кодирую, которая выполнит соответствующую обработку при выполнении условия (й).


Редактировать: найдено в SourceForge "ETODB - это бесплатный класс PHP, который позволяет анализировать и извлекать данные из электронных писем для интеграции с другими приложениями php. Вы можете автоматически анализировать почтовые сообщения и преобразовывать электронную почту в записи базы данных, сохранять вложения в определенные папки, просмотреть журнал. " http://sourceforge.net/projects/etodb/

Ответы [ 2 ]

1 голос
/ 29 октября 2010

Библиотека imap входит в стандартную комплектацию PHP - сворачивание собственного кода вокруг этого тривиально.

Однако опрос электронной почты является очень неэффективным способом решения проблемы - гораздо лучший способ - направить письмо (или его копию) прямо на ваш скрипт - но вы не говорите, в какой операционной системе вы работаете ни какой MTA вы используете. Предполагая, что все это находится в Unix-боксе с запущенным sendmail или аналогичным, большинство локальных агентов доставки позволяют ~ / .forward ссылаться на скрипт. Мое личное предпочтение - procmail (который фактически является языком программирования для доставки почты, создания копий, автоответов и т. Д.).

1 голос
/ 29 октября 2010

Вот быстро скомпилированный скрипт, который я использовал для обработки вложений специальной учетной записи электронной почты:

(некоторые шаги и код отредактированы, например, части, которые запоминают уже обработанные сообщения и удаляют сообщения с сервера послеколичество дней)

#!/usr/local/bin/php5
<?php

error_reporting(E_ALL);

date_default_timezone_set('Asia/Tokyo');

define('TYPE_TEXT', 0);
define('TYPE_MULTIPART', 1);
define('TYPE_MESSAGE', 2);
define('TYPE_APPLICATION', 3);
define('TYPE_AUDIO', 4);
define('TYPE_IMAGE', 5);
define('TYPE_VIDEO', 6);
define('TYPE_OTHER', 7);

define('ENCODING_7BIT', 0);
define('ENCODING_8BIT', 1);
define('ENCODING_BINARY', 2);
define('ENCODING_BASE64', 3);
define('ENCODING_QUOTEDPRINTABLE', 4);
define('ENCODING_OTHER', 5);

$server = 'example.com:110';
$user = 'foo';
$password = 'bar';

echo "\nLogging in to $server with user $user...\n";

$mbox = imap_open('{' . $server . '/pop3}INBOX', $user, $password);

if (!$mbox) {
    die("Couldn't establish a connection.\n" . join("\n", imap_errors()));
}

$numMessages = imap_num_msg($mbox);

echo "Found $numMessages messages in inbox.\n";

for ($i = 1; $i <= $numMessages; $i++) {

    echo "\nProcessing message $i...\n";

    $header = imap_headerinfo($mbox, $i);

    if (!$header) {
        die("An error occurred while processing message $i.\n" . join("\n", imap_errors()));
    }

    echo "Message id: {$header->message_id}\n";

    $structure = imap_fetchstructure($mbox, $i);

    if (!$structure) {
        die("An error occurred while processing the structure of message $i.\n" . join("\n", imap_errors()));
    }

    if ($structure->type !== TYPE_MULTIPART || empty($structure->parts)) {
        echo "Couldn't find any attachments to process, moving on...\n";
        continue;
    }

    echo "Message has " . count($structure->parts) . " parts, beginning processing of individual parts...\n";

    foreach ($structure->parts as $index => $part) {
        $index++;

        echo "Processing part $index with type of {$part->type}...\n";

        if ($part->type === TYPE_TEXT) {
            echo "Part is plain text, moving on...\n";
            continue;
        }

        $bodypart = imap_fetchbody($mbox, $i, $index);

        echo "Fetched part with length of " . strlen($bodypart) . " bytes, encoded in {$part->encoding}.\n";

        switch ($part->encoding) {
            case ENCODING_BASE64 :
                echo "Decoding attachment from BASE64.\n";
                $bodypart = imap_base64($bodypart);
                break;
            case ENCODING_QUOTEDPRINTABLE :
                echo "Decoding attachment from Quoted-Printable.\n";
                $bodypart = imap_qprint($bodypart);
                break;
        }

        $filename = $header->message_id . '_part_' . $index;
        if (!empty($part->parameters)) {
            foreach ($part->parameters as $param) {
                if ($param->attribute == 'NAME') {
                    $filename = $param->value;
                    echo "Using original filename '$filename'.\n";
                    break;
                }
            }
        }

        // file processing here...
    }

    echo "Done processing message $i.\n";
}

imap_close($mbox);

echo "\nDone.\n";

Надеюсь, это послужит вам отправной точкой.Если вы не можете предоставить более конкретную цель того, что ищете, вероятно, просто придумать сценарий самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...