Pregunta

Tenemos un script PHP cron'ed que comprueba una bandeja de entrada cada diez minutos. El propósito de este guión es de manejar "STOP para dejar de fumar" funcionalidad de nuestro servicio de notificación por SMS proporcionamos. Si el script encuentra ningún correo electrónico con la palabra "STOP" al comienzo del correo electrónico, se elimina al usuario de la base de datos de notificación.

Para cubrir nuestras bases, nos gustaría que los correos electrónicos que no cumplen los criterios anteriores que se remitirá a otra dirección de correo electrónico (que es un alias) que varias personas reciben y comprobar por hora. Sin embargo, nos estamos quedando en problemas reenvío de los mensajes de correo electrónico desde este script PHP.

Saber la función mail de obras de PHP, es bastante obvio que la necesidad de reinsertar las cabeceras antes de enviar. Sin embargo, los correos electrónicos de varias partes MIME siempre se envían como una garble de texto, incluyendo las barreras y los archivos adjuntos codificados en base64.

¿Alguien sabe de una manera simple de tomar un mensaje de correo electrónico y enviarlo en el uso correcto de un script PHP?

Estamos utilizando las funciones IMAP nativas integradas en PHP 5. También tenemos acceso al módulo PEAR correo. Sin embargo, no hemos podido encontrar ningún ejemplo o personas realizando tareas similares buscando Google.

¿Fue útil?

Solución

I codificado este método hace mucho tiempo para analizar un mensaje de correo electrónico en sus partes pertinentes mediante 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;
}

nunca he probado profundamente y estoy seguro de que tiene algunos errores, pero podría ser un comienzo ... Después de adaptar el código que debe ser capaz de utilizar los índices $result (text, html, attachments) con la secuencia de comandos de reenvío (usando SwiftMailer por ejemplo), sin tener que preocuparse acerca de mantener intactos los límites MIME.

Otros consejos

Esto no es realmente una respuesta, pero una sugerencia para un método alternativo. Creo que sería mucho más simple y menos propenso a errores (es decir, no hay problemas de entrega) si simplemente movido los mensajes en torno a diferentes carpetas dentro de la cuenta existente. Es decir, las carreras y los procesos de todos los correos electrónicos en buzón de entrada cron. Si si los hallazgos de STOP, que hace el trabajo requerido y luego (a través de las funciones IMAP) simplemente mueve el correo a una subcarpeta denominada "Proceso" o similar. De lo contrario, se mueve el correo a una subcarpeta denominada "Compruebe Estos" o similar. Entonces usted no tiene que preocuparse acerca del reenvío, o más entregas, o una segunda cuenta, y todo el mundo puede supervisar los procesados, no procesados, y mails pendientes directamente.

¿Ha echado un vistazo a la funcionalidad utilizando SwiftMailer biblioteca?

http://swiftmailer.org/

he utilizado este en el pasado y han conseguido buenos resultados, Altho no en una aplicación como se ha descrito, he embargo utilizada para PHP basado 'listas de correo', donde he comprobado para la asignatura y se envía al grupo adecuado.

Sin embargo, he creado un nuevo mensaje, no lo hice hacia adelante. Espero que ayude.

Esto ha sucedido a mí antes. Con el fin de solucionarlo que tenía que hacer un imap_base64 () en el cuerpo del correo electrónico después de que imap_fetchbody usada ().

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

usar un controlador IO para capturar el contenido del correo electrónico como una cadena, dividir los encabezados y luego usar el php 'mail ()' función para enviarlo.

Else si realmente quiere hacer esto con php-IMAP,

la extensión PHP-IMAP es libc-cliente, que es parte del software de cliente de correo electrónico de pino averiguar los pasos manuales necesarios para hacerlo utilizando el pino y luego mira el c-cliente llama a las marcas de pino para hacerlo. que le dará los pasos necesarios en php.

la documentación c-cliente es bastante mínima, ir a la fuente de pino es la mejor manera de conseguir los detalles de uso.

Creo que es posible que el autor de la extensión php cuenta "para su conveniencia o la protección" omitido o cambiado cosas que bloquea este camino.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top