Переадресация электронных писем с помощью сценария PHP

StackOverflow https://stackoverflow.com/questions/4503980

  •  12-10-2019
  •  | 
  •  

Вопрос

У нас есть скрипт PHP Cron'ed, который проверяет почтовый ящик каждые десять минут. Цель этого сценария состоит в том, чтобы справиться с функциональностью «Остановка, чтобы бросить», для нашей службы уведомлений о SMS, который мы предоставляем. Если сценарий находит какие -либо электронные письма со словом «остановка» в начале электронной почты, мы удаляем пользователя из нашей базы данных уведомлений.

Чтобы охватить наши базы, мы хотели бы, чтобы какие -либо электронные письма не соответствовали вышеуказанным критериям, которые будут направлены на другой адрес электронной почты (который является псевдонимом), которые несколько человек получают и проверяют почасовой. Тем не менее, мы сталкиваемся с проблемами пересылки электронных писем из этого сценария PHP.

Зная, как mail Функция PHP Works, совершенно очевидно, что нам нужно пересмотреть заголовки перед отправкой. Тем не менее, электронные письма MIME Multipart всегда отправляются в виде сутки текста, включая барьеры и любые закодированные Base64.

Кто -нибудь знает о простом способе получить сообщение по электронной почте и правильно перенаправить его с помощью сценария PHP?

Мы используем нативные функции IMAP, встроенные в PHP 5. У нас также есть доступ к модулю грушевой почты. Тем не менее, мы не смогли найти никаких примеров или людей, выполняющих аналогичные задачи, выполнив поиск в Google.

Это было полезно?

Решение

Я давно закодировал этот метод, чтобы разобрать сообщение по электронной почте в их соответствующие части, используя IMAP:

function Message_Parse($id)
{
    if (is_resource($this->connection))
    {
        $result = array
        (
            'text' => null,
            'html' => null,
            'attachments' => array(),
        );

        $structure = imap_fetchstructure($this->connection, $id, FT_UID);

        if (array_key_exists('parts', $structure))
        {
            foreach ($structure->parts as $key => $part)
            {
                if (($part->type >= 2) || (($part->ifdisposition == 1) && ($part->disposition == 'ATTACHMENT')))
                {
                    $filename = null;

                    if ($part->ifparameters == 1)
                    {
                        $total_parameters = count($part->parameters);

                        for ($i = 0; $i < $total_parameters; $i++)
                        {
                            if (($part->parameters[$i]->attribute == 'NAME') || ($part->parameters[$i]->attribute == 'FILENAME'))
                            {
                                $filename = $part->parameters[$i]->value;

                                break;
                            }
                        }

                        if (is_null($filename))
                        {
                            if ($part->ifdparameters == 1)
                            {
                                $total_dparameters = count($part->dparameters);

                                for ($i = 0; $i < $total_dparameters; $i++)
                                {
                                    if (($part->dparameters[$i]->attribute == 'NAME') || ($part->dparameters[$i]->attribute == 'FILENAME'))
                                    {
                                        $filename = $part->dparameters[$i]->value;

                                        break;
                                    }
                                }
                            }
                        }
                    }

                    $result['attachments'][] = array
                    (
                        'filename' => $filename,
                        'content' => str_replace(array("\r", "\n"), '', trim(imap_fetchbody($this->connection, $id, ($key + 1), FT_UID))),
                    );
                }

                else
                {
                    if ($part->subtype == 'PLAIN')
                    {
                        $result['text'] = imap_fetchbody($this->connection, $id, ($key + 1), FT_UID);
                    }

                    else if ($part->subtype == 'HTML')
                    {
                        $result['html'] = imap_fetchbody($this->connection, $id, ($key + 1), FT_UID);
                    }

                    else
                    {
                        foreach ($part->parts as $alternative_key => $alternative_part)
                        {
                            if ($alternative_part->subtype == 'PLAIN')
                            {
                                echo '<h2>' . $alternative_part->subtype . ' ' . $alternative_part->encoding . '</h2>';

                                $result['text'] = imap_fetchbody($this->connection, $id, ($key + 1) . '.' . ($alternative_key + 1), FT_UID);
                            }

                            else if ($alternative_part->subtype == 'HTML')
                            {
                                echo '<h2>' . $alternative_part->subtype . ' ' . $alternative_part->encoding . '</h2>';

                                $result['html'] = imap_fetchbody($this->connection, $id, ($key + 1) . '.' . ($alternative_key + 1), FT_UID);
                            }
                        }
                    }
                }
            }
        }

        else
        {
            $result['text'] = imap_body($this->connection, $id, FT_UID);
        }

        $result['text'] = imap_qprint($result['text']);
        $result['html'] = imap_qprint(imap_8bit($result['html']));

        return $result;
    }

    return false;
}

Я никогда не тестировал это глубоко, и я уверен, что у него есть некоторые ошибки, но это может быть началом ... После адаптации этого кода вы сможете использовать $result Индексы (text, html, attachments) Со своим скриптом (например, SwiftMailer), не беспокоясь о том, чтобы сохранить границы MIME нетронутыми.

Другие советы

Это на самом деле не ответ, а предложение для альтернативного метода. Я думаю, что было бы намного проще и менее подвержено ошибке (т.е. без проблем с доставкой), если вы просто перемещаете сообщения в разные папки в существующей учетной записи. Т.е. Cron запускает и обрабатывает все электронные письма в почтовых ящиках. Если находит остановку, он выполняет необходимую работу, а затем (через функции IMAP) просто перемещает электронное письмо в подпапку с именем «обработанным» или аналогичным. В противном случае он перемещает электронное письмо в подпапку с именем «Проверьте это» или аналогично. Тогда вам не нужно беспокоиться о пересылке или дальнейшей доставке или второй учетной записи, и каждый может отслеживать обработанные, необработанные и напрямую ожидающую почту.

Вы посмотрели на функциональность, используя Swiftmailer библиотека?

http://swiftmailer.org/

Я использовал это в прошлом и получил хороший результат, хотя не в приложении, как вы описали, я, однако, использовал его для «списков рассылки» на основе PHP », где я проверил на субъект и отправил в надлежащую группу.

Но я создал новое сообщение, не перестал. Надеюсь, это поможет.

Это случилось со мной раньше. Чтобы исправить это, мне пришлось сделать imap_base64 () на теле электронной почты после того, как я использовал imap_fetchbody ().

$body = imap_fetchbody($imap, 1, 1);
$headers = imap_headerinfo($imap, 1);
$body = imap_base64($body);

Используйте обработчик IO, чтобы захватить содержание электронной почты в качестве строки, разделите заголовки, а затем используйте функцию php 'mail ()', чтобы отправить его.

Иначе, если вы действительно хотите сделать это с PHP-IMAP,

Расширение PHP-IMAP-это Libc-Client, который является частью программного обеспечения для клиента по электронной почте соснового письма, выясняющие ручные шаги, необходимые для этого с использованием сосны, а затем посмотрите на вызовы C-клиента, чтобы сделать это. Это даст вам шаги, необходимые в PHP.

Документация C-Client довольно минимальна, перейти к источнику сосны-лучший способ получить детали использования.

Я думаю, что вы можете обнаружить, что автор расширения PHP «для вашего удобства или защиты» опущено или изменил вещи, которые блокируют этот путь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top