Artículos+recientes

mailTo(), envía correos de forma simple con PHP

sello La función que dejo hoy es un imprescindible en los proyectos de hoy en día. Se trata de una función para enviar mail a partir de las variables introducidas. La función directamente verifica si los mail introducidos como origen y destino están bien escritos y a demás verifica si es posible que existan (verifica si el hosting del mail si existe).

Las variables de la función son por orden:
Asunto: El asunto del mail.
Contenido: El contenido del mail.
To_mail: Mail de destinatario.
From_mail: Mail del usuario que lo envía.
To_name: Nombre del usuario que recibirá el mail.
From_name: Nombre del usuario que envía el mail.
Type: Tipo de contenido del mail. Hay 3 opciones para esta variable. 'html' como predeterminado para contenido HTML, 'both' como contenido comodín o 'text' como texto sin HTML (solo texto plano).
Reply: Indica 'true' o 'false' para determinar si se quiere mostrar el mail de origen al destinatario. Si no se quiere mostrar se mostrará "noreply".

PHP:
  1. function mailTo($asunto, $contenido, $to_mail, $from_mail=, $to_name=, $from_name=, $type='html', $reply = false) {
  2.     # test mail origen
  3.     if(preg_match('/^\w[-.\w]*@(\w[-._\w]*\.[a-zA-Z]{2,}.*)$/', $to_mail, $parse_mail_origen)){
  4.         if(function_exists('checkdnsrr')){
  5.             if( !checkdnsrr($parse_mail_origen[1].'.','MX') ||
  6.                 !checkdnsrr($parse_mail_origen[1].'.','A'))
  7.                     $error.='el correo de origen no existe'."<br>\n";
  8.         }
  9.     } else {
  10.         $error.='el correo de origen no es correcto'."<br>\n";
  11.     }
  12.     # test mail destino
  13.     if(preg_match('/^\w[-.\w]*@(\w[-._\w]*\.[a-zA-Z]{2,}.*)$/', $to_mail, $parse_mail)){
  14.         if(function_exists('checkdnsrr')){
  15.             if( !checkdnsrr($parse_mail[1].'.','MX') ||
  16.                 !checkdnsrr($parse_mail[1].'.','A'))
  17.                     $error.='el correo de destino no existe'."<br>\n";
  18.         }
  19.      } else {
  20.         $error.='el correo de destino no es correcto'."<br>\n";
  21.      }
  22.     if($error) return $error;
  23.     # composicion cabeceras
  24.     if($from_mail==){
  25.         $from = $_SERVER['HTTP_HOST'] ? 'noreply@'.substr($_SERVER['HTTP_HOST'], 4) : 'noreply@'.substr($_SERVER['SERVER_NAME'], 4);
  26.     } else {
  27.         if($from_name!=){
  28.             $from   = $reply ? $from_name.'<'.$from_mail.'>'   : $from_name.'<'.'noreply@'.$parse_mail[1].'>';
  29.         } else {
  30.             $from   = $reply ? $from_mail            : 'noreply@'.$parse_mail[1];
  31.         }
  32.     }
  33.     $to    = $to_name== ? $to_mail            : $to_name.'<'.$to_mail.'>';
  34.     $return_path = $reply      ? '<'.$from_mail.'>'   : '<'.'noreply@'.$parse_mail[1].'>';
  35.     $subject     = $yourSubject.': '.stripslashes($sub);
  36.     $date       = date("d-M-y H:i");
  37.     $boundary    = md5($from_mail.$to_mail.$asunto.$contenido.$type.$reply); //id unica para este contenido de mail
  38.    
  39.     $headers     = "From: $from\nReply-To: $from\n";
  40.     $headers    .= "X-Mailer:PHP/".phpversion()."\n";
  41.     $headers    .= "Mime-Version: 1.0\n";
  42.     $headers    .= "Content-Type: multipart/alternative; boundary=\"{$boundary}\"\n";
  43.     $headers    .= "Return-Path: $return_path\n";
  44.  
  45.     # composicion de mail
  46.     $message     = "\n–{$boundary}\n";
  47.     switch ($type){
  48.         case 'html' :
  49.             $message    .= "Content-Type: text/html; charset=ISO-8859-1\nContent-Transfer-Encoding: quoted-printable\n\n$contenido";
  50.             $message    .= "\n–{$boundary}–\n\n";
  51.             break;
  52.         case 'text' :
  53.             $message    .= "Content-Type: text/plain; charset=ISO-8859-1\nContent-Transfer-Encoding: quoted-printable\n\n$contenido";
  54.             $message    .= "\n–{$boundary}–\n\n";
  55.             $message     = strip_tags(stripslashes($message));
  56.             break;
  57.         case 'both' :
  58.             $message    .= "Content-Type: text/plain; charset=ISO-8859-1\nContent-Transfer-Encoding: quoted-printable\n\n$contenido";
  59.             $message    .= "\n–{$boundary}–\n\n";
  60.             break;
  61.     }
  62.     # envio
  63.     return mail($to, $asunto, $message, $headers);
  64. }

Al usar la función puede dar como resultado un binario indicando si se ha enviado o no el mail o un string de texto indicando si hay algún error con las direcciones.

Ejemplo basico:

PHP:
  1. <?php
  2. if( mailto('Asunto del email', '<b>contenido del email a enviar!</b>', 'email_de_destinatario@gmail.com') == true ){
  3.     echo 'Mail enviado';
  4. } else {
  5.     echo 'Error al enviar el mail';
  6. }
  7. ?>

Ejemplo completo mail de origen oculto:

PHP:
  1. <?php
  2.  
  3. $mail = mailto('Asunto del email', '<b>contenido del email a enviar!</b>', 'email_de_destinatario@gmail.com', 'email_de_origen@yahoo.es', 'text', false);
  4. if( $mail == true ){
  5.     echo 'Mail enviado';
  6. } else {
  7.     echo 'Error al enviar el mail';
  8. }
  9. ?>

Lang_detect(), detecta en que lenguaje esta un texto con PHP

libreria de idiomasSi, con todos los diccionarios online y con todos los traductores que existen hoy en día es muy fácil cambiar un texto de un lenguaje a otro pero, ¿como saber en que lenguaje esta para decidir que idioma de origen seleccionamos?
Pues como siempre, google al rescate!. La Google AJAX Language API nos ayuda a decidirlo a partir de un simple extracto, y como siempre, para no complicarnos os dejo una función sencilla y unos ejemplos.

PHP:
  1. function lang_detect($texto){
  2.     $url = 'http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q='.urlencode($texto);
  3.     if(strlen($url)>2000){ $url = substr($url, 0, 1999); }
  4.     $response = file_get_contents($url);
  5.     preg_match_all('!{"responseData": {"language":"(.+)","isReliable":(.+),"confidence":(.+)}, "responseDetails": (.+), "responseStatus": (.+)}!U',$response,$s);
  6.     $o['language']      = $s[1][0];
  7.     $o['isReliable']        = $s[2][0];
  8.     $o['confidence']        = $s[3][0];
  9.     $o['responseDetails']   = $s[4][0];
  10.     $o['responseStatus']    = $s[5][0];
  11.     return $o;
  12.     unset($o,$s);
  13. }

La primera y única variable que usa lang_detect() es el texto del que queremos saber en que idioma esta. Como resultado nos dará un array con varios datos como el factor de acierto que puede tener la detección (confidence) o el lenguaje en el que esta escrito (language).
Para mas información sobre el resto de parámetros devueltos podéis leer la documentación.

Ejemplo uno texto e italiano:

PHP:
  1. $texto = 'ciao mondo crudele';
  2. $resultado = lang_detect($texto);
  3. echo resultado['language'];

Ejemplo dos, texto en español:

PHP:
  1. $texto = 'Hola mundo!!';
  2. $resultado = lang_detect($texto);
  3. print_r(resultado);

Revision del proyecto Proyector Laser de video

proyector laser RGBHace ya mas de año y pico que publique la idea de realizar una pantalla de alta definición casera a partir del movimiento de 3 punteros láser y después de tantos comentarios y visitas al tema creo que ha llegado la hora de aclararnos un poco sobre que se pretende conseguir y cuales son los pasos para conseguirlo.

La idea principal era realizar una pantalla OpenHardware, que cualquiera pudiera mejorar mientras decidan compartir esas mejoras con los demás. De esta manera todos tendremos pantallas de bajo coste y podremos hacer llegar la información a mas lugares. Por esto una de las principales cosas que buscaba era que fuera de montaje sencillo y asequible, para que no fuera muy costoso para cualquiera poder experimentar.

Por todo esto y para empezar unificando pense en utiizar como referencia los conectores que mas se utilizan desde que puse el articulo hasta la actualizad, los conectores VGA. Estos permiten utilizar salidas independientes para cada color (Rojo, Verde y Azul) y a demas tomar una señal cuadrada que indica cuando cambia de linea o de punto (sincronismo vertical u horizontal). Pero de todas formas para realizar esta idea hace falta superar algunos retos electrónicos y opticos:

Como ya se comento en el anterior articulo, el ingenio funcionaria a partir de unas piezas espejadas móviles que orientaran los haces de luz a cada punto de la pantalla. Esto se conseguiría utilizando un primer sistema que moviera el haz de derecha a izquierda creando lineas de puntos, y un segundo que moviera cada linea un punto mas abajo creando los cuadros de imagen. La utilización de esta tecnología hace que el tamaño y resolución de la pantalla pueda ser cambiado digitalmente sin utilizar piezas adicionales (llegando hasta unos limites claro).

El primer reto a superar para conseguirlo seria realizar un sistema espejado que pueda moverse al menos a 50Hz. En un primer momento para mejorar el montaje se opto por utilizar motores de CD o DVD viejos para conseguir la velocidad necesaria utilizando un engranaje dentado para hacer reflejar los haces de luz, pero pronto comunicaron que esto era igual de facil de montar como de que las lineas se vieran borrosas por la sujeción de los elementos. Por lo tanto creo que volvemos a la opción inicial.
Podríamos utilizar un altavoz, como sistema móvil, espejeando su membrana a partir de un spray cromado o utilizando algún recubrimiento de este tipo y acoplarle un circuito de transistor que utilice las señales de salida de sincronismo del conector VGA (pines13-5 y 15-10) para, directamente sin mas controladores se produzca la vibración. Lo que no se, es si tendríamos que utilizar algún elemento mas entre medias para conectarlo y poder por lo tanto hacer que la potencia en el altavoz sea suficiente.

esquema de Pines VGAEl segundo reto seria crear un circuito electrónico que permita, a partir de la potencia de cada color poder pasar la potencia proporcional al láser. Esto seria muy parecido al anterior… con un circuito de transistor que permita variar a partir de 2 potenciómetros la tensión máxima y mínima de entrada al láser nos iría genial. de esa manera podríamos regular la cromática del conjunto por separado.

Difraccion de haces laserEl ultimo reto sería óptico..
3 láser de respectivos colores para formar un punto de color necesitan estar muy bien alineados para que no desdoblen la imagen, lo que ahora se consigue con espejos que filtran espectros de color. Y este es el punto flaco del proyecto. Si utilizamos un solo conjunto móvil para los 3 láser hay que unificarlos antes de proyectarlos contra el primer espejo, por lo que a mi solo se me ha ocurrido utilizar fibra óptica. Un hilo de fibra óptica se conectaría a cada láser unificando las puntas de los 3 en un solo extremo que enfocaríamos hacia el espejo, el efecto seria casi el mismo que el de las pantallas actuales de pixeles.

Vimeo(), descarga los datos de los vídeos que hay en vimeo incluyendo los FLV

vimeoUna vez pasado el tema de que youtube es el sistema mas viral y usado por los niños y jóvenes de hoy en día para subir los vídeos y compartirlos en internet, este servicio en cuanto a diseño y resolución deja bastante que desear… lo que ha solucionado perfectamente Vimeo.

Vimeo.com es una web para compartir vídeos en resolución normal o HD que permite subir hasta 500m a la semana. Su diseño es impecable, con una buena implementación de Ajax y unos colores llamativos que aumentan su atractivo, pero las ventajas no solo acaban ahí. También implementa una serie de archivos dinámicos en XML documentados y no documentados en su API que nos permiten obtener los datos de un video directamente con una rápida consulta.

Como ejemplo y imitando a mi función de Youtube() he creado vimeo() que a partir del numero de ID que todos los vídeos tienen como prefijo en su URL, muestra todos los datos, incluyendo el link al video FLV que podremos reproducir no solo en su player si no que en el nuestro mismo..

PHP:
  1. <?php
  2. function vimeo($id){
  3.     $xml        = file_get_contents('http://www.vimeo.com/moogaloop/load/clip:'.$id);
  4.     $flv        = 'http://www.vimeo.com/moogaloop/play/clip:'.$id.'/'.$request_signature.'/'.$request_signature_expires.'/?q='.$hd;
  5.     $strings    = array(
  6.     'timestamp'      => '<timestamp>(.+)</timestamp>',
  7.     'locked'                        => '<locked>(.+)</locked>',
  8.     'caption'                  => '<caption><![CDATA[(.+)]]></caption>',
  9.     'isLoggedIn'                    => '<isLoggedIn>(.+)</isLoggedIn>',
  10.     'isOwner'                  => '<isOwner>(.+)</isOwner>',
  11.     'likeIt'                        => '<likeIt>(.+)</likeIt>',
  12.     'default_volume'                => '<default_volume>(.+)</default_volume>',
  13.     'hd_preference'     => '<hd_preference>(.+)</hd_preference>',
  14.     ’scaling_preference'            => '<scaling_preference>(.+)</scaling_preference>',
  15.     'file'              => '<file>(.+)</file>',
  16.     'hd_file'                  => '<hd_file>(.+)</hd_file>',
  17.     'width'       => '<width>(.+)</width>',
  18.     'height'                        => '<height>(.+)</height>',
  19.     'duration'            => '<duration>(.+)</duration>',
  20.     'thumbnail'      => '<thumbnail>(.+)</thumbnail>',
  21.     'totalComments'     => '<totalComments>(.+)</totalComments>',
  22.     'totalLikes'                    => '<totalLikes>(.+)</totalLikes>',
  23.     'totalPlays'                    => '<totalPlays>(.+)</totalPlays>',
  24.     'url_clean'      => '<url_clean>(.+)</url_clean>',
  25.     'url_'              => '<url><![CDATA[(.+)]]></url>',
  26.     'uploader_url'          => '<uploader_url><![CDATA[(.+)]]></uploader_url>',
  27.     'uploader_portrait'    => '<uploader_portrait>(.+)</uploader_portrait>',
  28.     'uploader_display_name'   => '<uploader_display_name>(.+)</uploader_display_name>',
  29.     'nodeId'                        => '<nodeId>(.+)</nodeId>',
  30.     'isHD'              => '<isHD>(.+)</isHD>',
  31.     'isPrivate'      => '<isPrivate>(.+)</isPrivate>',
  32.     'isPassword'                    => '<isPassword>(.+)</isPassword>',
  33.     'isNobody'            => '<isNobody>(.+)</isNobody>',
  34.     'embed_code'                    => '<embed_code><![CDATA[(.+)]]></embed_code></video>',
  35.     'caption'                  => '<caption><![CDATA[(.+)]]></caption>',
  36.     'thumbnail'      => '<thumbnail>(.+)</thumbnail>',
  37.     'url'                     => '<url><(.+)></url>',
  38.     'nodeId'                        => '<nodeId>(.+)</nodeId></video></stream_clips>',
  39.     ’source'                        => '<source>(.+)</source>',
  40.     'referrer'            => '<referrer>(.+)</referrer>',
  41.     ’server'                        => '<server>(.+)</server>',
  42.     ’show_title'                    => '<show_title>(.+)</show_title>',
  43.     ’show_byline'               => '<show_byline>(.+)</show_byline>',
  44.     ’show_portrait'     => '<show_portrait>(.+)</show_portrait>',
  45.     'color'       => '<color>(.+)</color>',
  46.     'fullscreen'                    => '<fullscreen>(.+)</fullscreen>',
  47.     'fulloutro'      => '<fulloutro>(.+)</fulloutro>',
  48.     'is_facebook'               => '<is_facebook>(.+)</is_facebook>',
  49.     'context'                  => '<context>(.+)</context>',
  50.     'context_id'                    => '<context_id>(.+)</context_id></flash_default_vars>',
  51.     'cached_timestamp'        => '<cached_timestamp>(.+)</cached_timestamp>',
  52.     'is_mod'                        => '<is_mod>(.+)</is_mod>',
  53.     'request_signature'    => '<request_signature>(.+)</request_signature>',
  54.     'request_signature_expires'  => '<request_signature_expires>(.+)</request_signature_expires>');
  55.  
  56.     foreach($strings as $k=>$v){
  57.         preg_match_all('!'.str_replace(array('![CDATA[', ']]'), array(, ), $v).'!U', $xml, $o);
  58.         $out[$k] = (substr($o[1][0], 0, 8) == '![CDATA[') ? substr($o[1][0], 8, -2) : $o[1][0];
  59.     }
  60.  
  61.     $out['flv_video']  = 'http://'.$out[’server'].'/moogaloop/play/clip:'.$id.'/'.$out['request_signature'].'/';
  62.     $out['flv_video'] .= $out['request_signature_expires'].'/?q='.$out['isHD'];
  63.     return $out;
  64. }
  65. ?>

Muestra los datos del video Big Buck Bunny con ID:1084537.

PHP:
  1. <?php
  2.     print_r(
  3.         vimeo('1084537')
  4.     );
  5. ?>

Como en la anterior función de youtube() esta solo funciona si los archivos son públicos.. para dudas o errores, abajo comentarios ;)

Hack para Phoogle, abre los globos de información desde fuera del mapa

Tierra con chincheta transparentePhoogle es una fantástica clase para manejar la API de GoogleMaps y poder generar en unas cuantas lineas mapas simples y funcionales. El único problema podría ser la limitación que tiene a la hora de desarrollar nuevas operaciones.

Mi problema era que quería que, al pinchar en un enlace apareciera el globo de texto asociado mostrando la ubicación. Esta funcion la habia visto con la clase GoogleMapAPI.class.php y pensaba que Phoogle tambien lo podria hacer pero, vistos los ejemplos me di cuenta que no, asi que me puse manos a la obra para aplicar alguna pequeña mejora y poder realizarlo de una manera simple.

Para hacerlo he realizado unas pequeñas modificaciones.
En el archivo que podéis descargar de aquí, entramos y modificamos las siguientes lineas:

Despues de la linea 241, donde aparece:

PHP:
  1. echo "    <script type=\"text/javascript\">\n";

insertamos esto:

PHP:
  1. echo "var markers = [];\n";
  2.             echo 'function click_sidebar(idx, contenido) {' . "\n";
  3.             echo '  markers[idx].openInfoWindowHtml(contenido);' . "\n";
  4.             echo '}' . "\n";

En la que ahora será la linea 278, después de:

PHP:
  1. map.addOverlay(marker".$g.")\n

insertamos:

PHP:
  1. markers[".$g."] = marker".$g.";\n

Con esta modificacion podremos utilizar una nueva funcion javascript llamada click_sidebar(). A esta función le pasaremos 2 parámetros, el primero es el numero de "dirección" al que queremos llamar (la primera es 0, la segunda 1….). El segundo parámetro será el contenido del globo de información.
Ejemplo: <a href="#" onclick="javascript:click_sidebar('0', 'primer punto del mapa');return false;">texto del link</a>.

Lo mejor para despejar dudas será un ejemplo practico amplio..
Para el ejemplo usaremos 2 archivos que estarán en la misma parpeta dentro del servidor:

Archivo phogle.php (version Phoogle Maps 2.0) CON LA MODIFICACIÓN REALIZADA! más la función de obtención de APIKEY automatica:

PHP:
  1. <?php
  2.  
  3. /**
  4. * Phoogle Maps 2.0 | Uses Google Maps API to create customizable maps
  5. * that can be embedded on your website
  6. *    Copyright (C) 2005  Justin Johnson
  7. *
  8. *    This program is free software; you can redistribute it and/or modify