Foros del Web » Programando para Internet » PHP »

Como saber que tipo de datos contiene una variable?

Estas en el tema de Como saber que tipo de datos contiene una variable? en el foro de PHP en Foros del Web. Hola, intento leer correos en texto plano , asi que divido el archivo con un explode Código PHP: explode ( "\n\n" , $correo );  Asi, ...
  #1 (permalink)  
Antiguo 29/06/2005, 07:22
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Como saber que tipo de datos contiene una variable?

Hola,

intento leer correos en texto plano, asi que divido el archivo con un explode
Código PHP:
explode("\n\n",$correo); 
Asi, ya tengo las cabeceras en array[0], pero y ahora como se que el array[x] es un archivo o en efecto texto plano, (el mensaje)?

gettype() no me va...

Por ejemplo esto es un gif que viene en uno de los correos:
Código PHP:
R0lGODlhAQDNAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP
///yH5BAEAAP8ALAAAAAABAM0A
QAgZAP8JHEiwoMGDCBMqXMiwocOHECNKnPgwIAA7 
Claro!, si siempre estuviera sobre el archivo la cabecera
Código PHP:
Content-Typeimage/gifname=mundo.gif
Content
-Transfer-Encodingbase64
Content
-Dispositionattachmentfilename="mundo.gif" 
Seria un poco + fácil, pero resulta que a veces esta al final, o agrupada con otras 5 cabeceras de otros 5 archivos, o abajo, etc...

Yahoo lo hace diferente a Gmail, a Latinmail, a Hotmail, etc...

Lo fantastico es que todos ellos si saben cuando es un correo y cuando una cadena de texto, ya que incluso si envias un archivo que contenga como texto
Código PHP:
------=_Part_555_2022941.1119990764534
Content
-Typeimage/gifname=mundo.gif
Content
-Transfer-Encodingbase64
Content
-Dispositionattachmentfilename="mundo.gif"

R0lGODlhAQDNAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP
///yH5BAEAAP8ALAAAAAABAM0A
QAgZAP8JHEiwoMGDCBMqXMiwocOHECNKnPgwIAA7 
Esos clientes de correo saben que no se trata de un archivo...

Bueno, cada elemento del array contiene pues un valor.

gettype siempre dice que es un STRING cuando los datos contenidos no siempre son string sino como he mostrado, un archivo.

Si hubiera alguna forma de que PHP "me dijera",

"Este elemento contiene una simple cadena de texto"
"Este otro contiene BYTES en base64"
"Este otro contiene cabeceras..."

Mi problema estaria resuelto, alguien puede recomendarme algo?

Última edición por Anarko; 29/06/2005 a las 07:30
  #2 (permalink)  
Antiguo 29/06/2005, 07:50
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
La idea es hacer algo parecido a
Código PHP:
Constantes predefinidas
Esta extensión no tiene ninguna constante definida
.

Tabla de contenidos
ctype_alnum 
-- Chequear posibles caracteres alfanuméricos
ctype_alpha 
-- Chequear posibles caracteres alfabéticos
ctype_cntrl 
-- Chequear posibles caracteres de control
ctype_digit 
-- Chequear posibles caracteres numéricos
ctype_graph 
-- Chequear posibles caracteres imprimiblescon excepción de los espacios
ctype_lower 
-- Chequear posibles caracteres en minúscula
ctype_print 
-- Chequear posibles caracteres imprimibles
ctype_punct 
--  Chequear posibles caracteres imprimibles que no son ni espacios en blanco ni caracteres alfanuméricos 
ctype_space 
-- Chequear posibles caracteres de espacio en blanco
ctype_upper 
-- Chequear posibles caracteres en mayúscula
ctype_xdigit 
--  Chequear posibles caracteres que representen un dígito hexadecimal 
Pero pa saber si es

Content-Transfer-Encoding: base64
Content-Transfer-Encoding: 7bit
Content-Transfer-Encoding: 8bit
Content-Transfer-Encoding: quoted-printable

Ta medio lio...

No?
  #3 (permalink)  
Antiguo 29/06/2005, 09:56
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 21 años, 8 meses
Puntos: 8
No se si deseas armar algo vos, pero seguramente muchas de las cosas que buscas deben estar implementadas por aqui...
http://ar2.php.net/imap

Una funcion que vi (muy por arriva) es
imap_fetchstructure()
pero parece que sua una conexion un servidor de correo, no un string como "fuente de datos", pero a lo mejor sirve de algo.

Saludos
  #4 (permalink)  
Antiguo 29/06/2005, 10:45
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
Que tal Anarko? mira estube viendo y la verdad este tema supera muchos mis conocimientos pero se me ocurrieron un par de cosas que pueden ayudar. 1º Lo primero es que hay que saber que todo archivos tiene una estructura y sus particularidades en su interior los .gif continen la palabra gif89a, esto a modo brusco. 2º He visto que lo que tu tienes (osea lo que recives) ya tiene una estructura y es simple de identificar: Se me ha ocurrido algo curioso, pero primero necesito saber algunas cosas:

¿esa es la estructura que siempre recives? ¿No importa si es pequeño o inmenso, siempre mantiene esa estructura? Necesitaria una muestra de un formato de gif y jpg y si puede ser alguno mas.

Bueno te cuento mas o menos la idea que tengo, no es del todo cientifica, mas bien una idea ingeniosa (con nada de cientifico). La idea es que sigas haciendo como tu lo estas haciendo y tratar de procesar cada elemento de un array, pero necesito una estructura base sobre la cual trabajar... Saludos
  #5 (permalink)  
Antiguo 29/06/2005, 10:52
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Profe,

tal como mencione al principio:
Código PHP:
Claro!, si siempre estuviera sobre el archivo la cabecera

Content
-Typeimage/gifname=mundo.gif
Content
-Transfer-Encodingbase64
Content
-Dispositionattachmentfilename="mundo.gif"

Seria un poco fácilpero resulta que a veces esta al final, o agrupada con otras 5 cabeceras de otros 5 archivoso abajoetc...

Yahoo lo hace diferente a Gmaila Latinmaila Hotmailetc... 
Es decir, no hay un patron COMUN.

Esos jijuemadres clientes de correo a veces pasan las cabeceras al principio, al final, arriba o abajo de los files, en grupo, por separado...

Es una locura...

Pero como tambien digo alli,

Ningúno de ellos se equivoca al presentar la info...

Ademas faltan los files .ZIP, .TAR, .PDF, etc...

Es una cosa complicadilla, pero que todos los grandes de correos, han resuelto.
  #6 (permalink)  
Antiguo 29/06/2005, 11:02
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Fran86,

Super interesante imap_fetchstructure()

Pero cuando la utilizo Fatal error: Call to undefined function: imap_fetchstructure() in c:\

Creo que si es por ahi, pero parece que solo PHP 5

Justo al final del manual sobre imap_fetchstructure() dice:

Código PHP:
Tabla 3. Codificacion para tranferencia

0 7BIT 
1 8BIT 
2 BINARY 
3 BASE64 
4 QUOTED
-PRINTABLE 
5 OTRO 
Es decir lo que necesito, pero yo tengo PHP Version 4.3.9

Y el server NET también asi qu en puedo pasarme al 5
  #7 (permalink)  
Antiguo 29/06/2005, 11:07
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
Bueno lo que veo es bastante dificil el tema, yo lamentablemente me tengo que apartar de este tema, mucho no puedo ayudar.
Ahora lo que tienes que tener claro es esto, a cada servidor los datos de los archivos les llega como a ti, pero ellos lo que supieron hacer un algoritmo que identifique cuando esta en base64 y cuando no, despues es solo comparacion, y otra cosa, no podras hacer tu script universal, tendras que hacer un script por cada servidor. Bueno algo de lo que no pueden escapar los servidores es que se mantenga el orden de las cabeceras y los cuerpos, osea por mas que no esten juntos, tienen que mantener un orden, si en la lista de cabeceras la segunda es un .jpg, en la lista de cuerpos tendria que ser la segunda, todo esto es "EN TEORIA". Ahora lo que queda es hacer un algoritmo que identifique si esta en base64 o en que base esta, despues es la comparación de que cabecera lleva esa base y si hay repetido fijar por posiciones... Bueno trate de ser lo mas claro, y bueno la ayuda que puedo dar no es mucha (mejor dicho, nada)...Saludos... y suerte con tu script Anarko....
  #8 (permalink)  
Antiguo 29/06/2005, 11:21
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Jeje....

Hombre DD y no podes decirme como se hace un algoritmo que identifique que tipo de base es?

No pido nada + xD

Bueno, parece que son pocas las variantes:
Código PHP:
Tabla 3. Codificacion para tranferencia

0 7BIT 
1 8BIT 
2 BINARY 
3 BASE64 
4 QUOTED
-PRINTABLE 
5 OTRO 
La cosa es que hay una funcion NATIVA para tal fin, pero requiere un poco de cosas...

Como hacer la misma funcion sin instalara librerias, para cualquier server y para PHP Version 4.3.9 es el intringulis aquí.
  #9 (permalink)  
Antiguo 29/06/2005, 12:13
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 18 años, 10 meses
Puntos: 2
No es necesario que se meta en tanto lio, la funcion que esta requiriendo esta disponible desde la version 3 de php. Lo que esta pasando es que en el servidor donde esta haciendo las pruebas, PHP no fue configurado o compilado con soporte para IMAP.
Y suponiendo que no se pueda arreglar ese detalle, es mejor buscar alguna clase u otro cosa que detecte codificaciones para el envio de archivos mediante el protocolo smtp, que hacerla, sobre todo por los tiempo, y de las lectuars que tiene que hacer a los RFC`s correspondientes,pero repito eso no debe de ser mayor problema, pero por el error pareciera que estas usando php en un windows, asi que el soporte para IMAP se resume a hacer una modifcacion en el php.ini.

Saludos
  #10 (permalink)  
Antiguo 29/06/2005, 12:29
Avatar de sism82  
Fecha de Ingreso: octubre-2003
Ubicación: Guadalajara
Mensajes: 865
Antigüedad: 20 años, 6 meses
Puntos: 1
extendiendo un poco la respuesta de HerSan...

tomate la molestia de revisar las siguientes ligas

http://mx.php.net/imap_fetchstructure
http://mx.php.net/manual/en/function.dl.php

la primera indica claramente que imap_fetchstructure efectivamente se encuentra disponible desde la versión 3 de PHP. Solo es necesario tener compilado el soporte para la extensión en el caso de GNU/Linux. Para el caso de windows se debe tener la dll correspondiente.
Revisa la segunda liga que te dice como cargar una extensión de php en "runtime". Es posible que con algo de suerte puedas cargar la extensión de imap.

saludos
  #11 (permalink)  
Antiguo 29/06/2005, 13:24
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Cuando descomento la linea
Código PHP:
extension=php_imap.dll 
en el PHP.INI PHP se friega y apache o corre.

En el manual de PHP dice
Cita:
XLII. Funciones IMAP
Para hacer funcionar estas funciones, debe compilar PHP con --with-imap. Esto requiere que la libreria c-client esté instalada. Obtenga la última versión de ftp://ftp.cac.washington.edu/imap/ y compílela. Luego copie c-client/c-client.a al directorio /usr/local/lib o a cualquier otro directorio de su LINK path y copie c-client/rfc822.h, mail.h y linkage.h al directorio /usr/local/include o a cualquier otro de su INCLUDE path.
Tengo Win 98 donde realizo los progra+, y el server NET donde subo y utilizo los mismos...

Que hago en el PHP.INI ?

--------------------------------------------

Cuando utilizo
Código PHP:
dl('php_imap.dll'); 
PHP dice
Cita:
Warning: dl(): Unable to load dynamic library 'C:/PHP/extensions/php_imap.dll' - Uno de los dispositivos vinculados al sistema no funciona.
Al entrar en el dir [extensions] alli esta la .DLL

Que hago ?

Última edición por Anarko; 29/06/2005 a las 13:46
  #12 (permalink)  
Antiguo 30/06/2005, 09:51
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 21 años, 8 meses
Puntos: 8
A ver:
Cita:
IMAP is not supported on systems earlier that Windows 2000. This is because it uses encryption functions in order to enable SSL connections to the mail servers.
A si que no queda claro si en w98 no funciona nada, o solamente respecto a conecciones SSL (que dudo que necesites esta caracteristica.)

Por otro lado ese tipo de mensaje suele solucionarse copiando los archivos de la carpeta "dlls" (o algo asi) que viene dentro de la distribucion de PHP, a algun directorio que windows busque (como windows\System32, o windows\system, o directamente en windows).

Y otra propuesta, es
http://pear.php.net/manual/en/packag....mail-mime.php
y el metodo decode()
http://pear.php.net/manual/en/packag...ode.decode.php

Saludos
  #13 (permalink)  
Antiguo 30/06/2005, 13:28
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Gracias,

Copie to2 los files de [dlls] a los dir

win
System
System32

El problema siguio =

Copie el file [php_imap.dll]

a los directorios

win
System
System32

La respuesta de PHP es[QUOTE][30-Jun-2005 14:26:16] PHP Warning: Unknown(): Unable to load dynamic library 'C:/PHP/extensions/php_imap.dll' - Uno de los dispositivos vinculados al sistema no funciona.
in Unknown on line 0[QUOTE]... Los del host no me van a colocar las librerias PEAR...

Ademas cuando cambie de host?...

Que vaina!, en efecto no requiero SSL

Como dige, incluso baje PHP 4.3.11 y nada...



Gracias por la ayuda

  #14 (permalink)  
Antiguo 01/07/2005, 10:01
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 21 años, 8 meses
Puntos: 8
Bueno, entonces puede ser que que IMAP no funciones en W98 porque, segun esto
http://ar.php.net/install.windows.extensions
no requiere otra dll que no venda en el distro de PHP.

Por otro lado, las clases de PEAR pueden instalarse a mano, poniendolas en tu carpeta del servidor. Solo resulta que la mayoria de las veces, cada clase requiere a otra que es parte del pack, entonces, vas a tener que copiar ademas cada una de las "dependencias". Po ej, la clase que te dije, requiere un archivo llamado PEAR.php, por los que tendrias que juntarlo con lo del pack de mail_mime para que funcione.

PD:
Ahaha, y solo era necesario copiar esos dlls en uno de los directorios, no en todos jajaja.
  #15 (permalink)  
Antiguo 01/07/2005, 14:08
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Fran, los del host en NET aceptaron ponerme la libreria IMAP.

Por ello me podrias dar una mano aqui?:

http://www.forosdelweb.com/f18/tengo-correos-texto-plano-como-les-puedo-hacer-imap_fetchstructure-312687/

Gracias!.

(y)

Pos como no funcionaba en 1, los copie al otro, y luego al otro, y luego tengo pesadillas...

:-X
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:03.