es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Archivos adjuntos de PHP Mailparse

Estoy desarrollando un pequeño sistema de correo electrónico y tengo una pregunta sobre PHP Mailparse a la que no puedo encontrar una respuesta, ni descifrar a partir del código en sí. He pasado mucho tiempo revisando el código de Mailparse y no puedo ver una respuesta.

Sencillamente, ¿existe alguna manera de distinguir entre imágenes adjuntas a un correo electrónico entrante y aquellas que están incrustadas en el correo electrónico (por ejemplo, imágenes de firma al pie del correo electrónico)?

Mailparse parece entregar tanto archivos adjuntos como imágenes incrustadas, todo como adjuntos. Lo que intento hacer es preservar cualquier archivo adjunto que el remitente pueda haber adjuntado al correo electrónico, pero descartar cualquier imagen incrustada en el correo electrónico.

¿Es posible hacer esto?
Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible discernir entre imágenes adjuntas e imágenes incrustadas utilizando PHP Mailparse.

    Mailparse devuelve todos los archivos adjuntos como archivos adjuntos, independientemente de si son imágenes adjuntas o incrustadas. Sin embargo, se pueden utilizar las cabeceras MIME de los archivos adjuntos para identificar si son imágenes adjuntas o incrustadas.

    Las imágenes incrustadas suelen identificarse con la cabecera “Content-Disposition” establecida en “inline”, mientras que las imágenes adjuntas tienen “Content-Disposition” establecida en “attachment”.

    Para preservar los archivos adjuntos y descartar las imágenes incrustadas, es necesario analizar las cabeceras MIME de cada archivo adjunto y verificar su cabecera “Content-Disposition”. Los archivos adjuntos con “Content-Disposition” establecida en “attachment” deben preservarse, mientras que aquellos con “Content-Disposition” establecida en “inline” pueden ser descartados.

    Aquí hay un código de ejemplo para lograr esto:

    // abra el correo electrónico usando Mailparse
    $parser = mailparse_msg_parse_file('/ruta/a/correo electrónico');
    
    // recorra todos los archivos adjuntos
    foreach (mailparse_msg_get_structure($parser) as $part_id) {
    
        // obtener las cabeceras de este archivo adjunto
        $headers = mailparse_msg_get_part_data($parser, $part_id)['headers'];
    
        // verifique la cabecera Content-Disposition
        foreach ($headers as $header) {
            $nombre_cabecera = strtolower(substr($header, 0, strpos($header, ':')));
            if ($nombre_cabecera === 'content-disposition') {
                $disposicion = strtolower(trim(substr($header, strpos($header, ':') + 1)));
                // si es un archivo adjunto, presérvelo
                if (strpos($disposicion, 'attachment') !== false) {
                    // preservar este archivo adjunto
                    break;
                }
                // si es una imagen incrustada, descártela
                if (strpos($disposicion, 'inline') !== false && strpos($disposicion, 'image') !== false) {
                    mailparse_msg_extract_part_file($parser, '/tmp/' . $part_id . '.jpg', $part_id);
                    unlink('/tmp/' . $part_id . '.jpg');
                    break;
                }
            }
        }
    }
    
    // limpieza
    mailparse_msg_free($parser);
    

    Este código abre el correo electrónico, recorre todos los archivos adjuntos y verifica su cabecera “Content-Disposition”. Si es un archivo adjunto, se preserva. Si es una imagen incrustada, se descarta (en este caso, se escribe en un archivo temporal y luego se elimina).

    Tenga en cuenta que este es solo un código de muestra, y es posible que necesite modificarlo para adaptarlo a sus requisitos específicos.

Comments are closed.