Dividir encabezados de correo usando preg_match

Tengo que enviar encabezados de correo electrónico y quiero extraer los diferentes datos: de, asunto, fecha, etc.

$mail1 = 'From: <encuestas@despegar.com>
To: 4fb661d55e409@ventas.ciudades.com
Subject: Califique nuestro servicio
Date: Sat, 19 May 2012 10:39:04 -0400
Message-ID: <3b6401cd35cd$23d08b90$0c01010a@despexds.net>
MIME-Version: 1.0';

$mail2 = 'Date: Fri, 21 Oct 2011 13:42:46 +0000 (GMT)
From: "Decolar.com" <non-reply@despegar.com>
To: 4ea15be894aca@ventas.ciudades.com
Message-ID: <2009175400.15674.1319204566275.JavaMail.root@uns02>
Subject: =?UTF-8?Q?Decolar.com_-_Solicita=C3=A7=C3=A3o_?=
 =?UTF-8?Q?de_compra_-_N=C3=BAmero:10603789?=
MIME-Version: 1.0';


preg_match("/Subject: (.)*(Date|Message-ID|From|To|MIME-Version):/s",$mail1,$m);        
print_r($m);       

Estoy usando el código anterior para obtener solo el tema, pero el resultado no es el esperado.

Para mail1 obtengo:

Array
(
    [0] => Subject: Califique nuestro servicio
Date: Sat, 19 May 2012 10:39:04 -0400
Message-ID: <3b6401cd35cd$23d08b90$0c01010a@despexds.net>
MIME-Version:
    [1] => 

    [2] => MIME-Version
)

Para mail2 obtengo:

Array
(
    [0] => Subject: =?UTF-8?Q?Decolar.com_-_Solicita=C3=A7=C3=A3o_?=
 =?UTF-8?Q?de_compra_-_N=C3=BAmero:10603789?=
MIME-Version:
    [1] => 

    [2] => MIME-Version
)

En ambos casos, el asunto está vacío.

preguntado el 22 de mayo de 12 a las 18:05

2 Respuestas

Probablemente haría algo como:

function normalize_array($arr) {
    for ($res = array(), $i = 0; $i < count($arr); $i+=2) {
        $key = strtr($arr[$i],array(': '=>'','-'=>'_'));
        $res[$key] = $arr[$i+1];
    }
    return $res;
}

$mailData = normalize_array(preg_split('~([\w-]+: )~',$mail1,-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));
print_r($mailData);

que volverá:

Matriz ( [Desde] => [Para] => 4fb661d55e409@ventas.ciudades.com [Asunto] => Califique nuestro servicio [Fecha] => Sáb, 19 Mayo 2012 10:39:04 -0400 [Message_ID] => <3b6401cd35cd$23d08b90$0c01010a@despexds .net> [MIME_Version] => 1.0 )

contestado el 22 de mayo de 12 a las 18:05

Esto no es lo que estaba buscando, ¡pero es incluso una mejor solución! muchas gracias inhan - cápsula

De nada. Es posible que desee eliminar nuevas líneas en el campo de asunto (ya que no pueden existir) agregando '\r\n'=>'','\n'=>'','\r'=>'' en la matriz de reemplazos. - Inhan

sí, no estaba seguro de si podrían existir, creo que solo están allí debido a un envoltorio cuando guardé el correo electrónico. De todos modos, es una buena limpieza para hacer. - cápsula

El patrón Regex debe ser:

/Subject: (.*)\b/

contestado el 22 de mayo de 12 a las 18:05

En realidad, quería hacer coincidir exactamente el texto "Fecha", "Mensaje", ... no cualquiera. Gracias de todos modos por la ayuda, he aprendido algo nuevo;) - cápsula

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.