<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Código Metrópoli - Blog de programación &#187; PHP</title>
	<atom:link href="http://www.codigometropoli.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codigometropoli.com</link>
	<description>Programación para Super Héroes</description>
	<lastBuildDate>Wed, 27 Apr 2011 07:20:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Introducción a AMFPHP</title>
		<link>http://www.codigometropoli.com/introduccion-a-amfphp/</link>
		<comments>http://www.codigometropoli.com/introduccion-a-amfphp/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 00:56:21 +0000</pubDate>
		<dc:creator>Carla Macías</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[AMFPHP]]></category>

		<guid isPermaLink="false">http://www.codigometropoli.com/?p=411</guid>
		<description><![CDATA[AMFPHP es una implementación en PHP, gratuita y de código abierto del AMF (Action Message Format), el cual es un formato binario basado en SOAP. AMF permite la serialización binaria de objetos y tipos nativos de ActionScript 2 y ActionScript 3 para ser enviados a servicios del lado del servidor. AMFPHP permite que aplicaciones realizadas [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="float: right;" src="http://codigometropoli.com/images/flash.png" alt="Flash" width="93" height="93" /><a href="http://www.amfphp.org/" target="_blank">AMFPHP</a> es una implementación en PHP,  gratuita y de código abierto del <a href="http://en.wikipedia.org/wiki/Action_Message_Format" target="_blank">AMF</a> (Action Message Format), el cual es un formato binario basado en SOAP. AMF permite la serialización binaria de objetos y tipos nativos de ActionScript 2 y ActionScript 3 para ser enviados a servicios del lado del servidor. AMFPHP permite que aplicaciones realizadas en Flash, Flex y AIR puedan comunicarse  directamente con objetos de clases de PHP.</p>
<p>Prácticamente, la forma en la que funciona se resume en que podemos crear clases en PHP, acceder a los métodos de esas clases por medio de Flash, Flex o AIR y obtener los datos retornados por esos métodos. Por ejemplo, podemos crear una clase para conectarnos a una base de datos en MySQL. Esta clase podría contener un método para insertar datos a la base, otro método para generar consultas y obtener en nuestra aplicación de Flash, Flex o AIR los registros regresados por la consulta.</p>
<p>En esta entrada veremos cómo está formado el AMFPHP y cómo acceder a él desde Flash CS3. Para una mejor explicación de cómo acceder a AMFPHP haremos una sencilla clase en PHP la cual no accederá a ninguna base de datos (eso lo dejaremos para nuestro próximo tutorial).</p>
<p><span id="more-411"></span></p>
<p><span style="color: #ff0000;"><strong>Tutorial</strong></span></p>
<p>1. Baja el archivo amfphp-1.9.beta.20080120.zip de <a href="http://sourceforge.net/project/showfiles.php?group_id=72483&amp;package_id=72363&amp;release_id=541961" target="_blank">aquí</a>. El amfphp-1.9 lo podemos usar con ActionScript 3 (Flash CS3, Flex y AIR), mientras que la versión anterior puede ser usada con ActionScript 2.</p>
<p>2. Descomprímelo y ponlo en algún directorio de tu servidor Web, en tu directorio <strong>htdocs</strong> o <strong>www</strong> en tu <em>localhost</em>. Si lo deseas, puedes renombrar la carpeta y ponerle AMFPHP1.9.</p>
<p>La estructura del directorio quedaría de la siguiente manera (en mi caso, la carpeta AMFPHP1.9 la puse en la carpeta raíz de mi servidor):</p>
<p>&#8211;&gt; root ó carpeta raíz<br />
<span style="padding-left: 30px;">&#8211;&gt;AMFPHP1.9 (D)</span><br />
<span style="padding-left: 60px;">&#8211;&gt; browser (D)</span><br />
<span style="padding-left: 60px;">&#8211;&gt; core (D)</span><br />
<span style="padding-left: 60px;">&#8211;&gt; services (D)</span><br />
<span style="padding-left: 60px;">&#8211;&gt; gateway.php</span><br />
<span style="padding-left: 60px;">&#8211;&gt; globals.php</span><br />
<span style="padding-left: 60px;">&#8211;&gt; json.php</span><br />
<span style="padding-left: 60px;">&#8211;&gt; phpinfo</span><br />
<span style="padding-left: 60px;">&#8211;&gt; xmlrpc</span></p>
<p>Donde (D) indica que se trata de un directorio. Observa la carpeta <em>browser</em>, si accediéramos a él desde el navegador observaremos  una aplicación creada en Flex donde nos muestra la lista de servicios que tenemos en AMFPHP, como se muestra en la siguiente <a href="http://www.codigometropoli.com/AMFPHP1.9/browser/" target="_blank">liga</a>. Si es la primera vez que accedes al <em>browser</em>, aparecerá la siguiente ventana de configuración:</p>
<div align="center"><img title="Imagen 1: Ventana de Configuración de AMFPHP" src="http://www.codigometropoli.com/images/screens/amfphp_configuracion_1.jpg" alt="Imagen 1: Ventana de Configuración de AMFPHP" width="514" height="247" /></div>
<p></p>
<p>En esta ventana de configuración deberás asegurarte que la dirección del <em>Gateway</em> es correcta. Después de hacer click en el botón <em>Save</em> te aparecerá la lista de servicios. Por default y cuando todavía no hemos creado ningún servicio nuevo, solamente aparecerá el servicio <em>DiscoveryService</em>. <strong>Importante:</strong> Cuando tenemos servicios que deben acceder a una base de datos o tratan información importante o crítica, lo mejor será no poner el directorio <em>browser</em> en el servidor. Continuando con nuestra estructura de directorios, como podrás imaginar, todos nuestros servicios (clases en PHP) deberán ir en el directorio <em>services</em>.</p>
<p>3. Vamos a crear una sencilla clase de PHP, la cual simulará las operaciones básicas de una calculadora. Sus métodos serán <em>sumar</em>, <em>restar</em>, <em>multiplicar</em> y <em>dividir</em>. Cada método recibirá como parámetro los dos números sobre los cuales hay que hacer la operación. <strong>Nota:</strong> Este tutorial es solamente para explicar cómo funciona AMFPHP y cómo podemos acceder a él desde Flash. Es por eso que nuestra clase de ejemplo es muy sencilla y muchos de ustedes dirán que no se requiere de PHP para sumar, restar, multiplicar y dividir dos números =0).<br />
En PHP, al igual que en Flash, el nombre del archivo de una clase deberá tener el mismo nombre de la clase; por lo tanto, crea un nuevo archivo PHP, nómbralo <strong>Calculadora.php</strong> y guárdalo dentro del directorio <em>services</em> de nuestra carpeta AMFPHP19. Coloca el siguiente código dentro de Calculadora.php:</p>
<pre class="brush: php;">
&lt;?php

class Calculadora
{
	/**
	 * Suma dos números pasados por parámetro
	 * @returns Regresa un valor numérico
	 */
	function sumar($numeroA, $numeroB)
	{
		return ($numeroA + $numeroB);
	}	

	/**
	 * Resta dos números pasados por parámetro
	 * @returns Regresa un valor numérico
	 */
	function restar($numeroA, $numeroB)
	{
		return ($numeroA - $numeroB);
	}

	/**
	 * Multiplica dos números pasados por parámetro
	 * @returns Regresa un valor numérico
	 */
	function multiplicar($numeroA, $numeroB)
	{
		return ($numeroA * $numeroB);
	}

	/**
	 * Divide dos números pasados por parámetro
	 * @returns Regresa un valor numérico
	 */
	function dividir($numeroA, $numeroB)
	{
		return ($numeroA / $numeroB);
	}
}

?&gt;
</pre>
<p>Observa los comentarios antes de cada función; estos comentarios nos dan una descripción de qué es lo que hace cada método y además le estamos indicando qué es lo que nos regresa cada método (@returns). Si bien estos comentarios no son obligatorios, nos ayudarán a recordar en el momento en que queramos modificar el archivo. Además, dentro de la lista de servicios en el browser, cuando seleccionamos alguno de estos métodos se nos mostrará esta descripción (Como prueba, ingresa al <a href="http://www.codigometropoli.com/AMFPHP1.9/browser/" target="_blank">navegador</a>, de la lista de la izquierda selecciona la clase Calculadora y posteriormente selecciona de la ventana de la derecha el método <em>dividir</em>. Observarás que antes de los campos de texto para ingresar los números aparece la descripción del método). Ahora ingresa un número dentro del campo de texto <em>$numeroA</em> e ingresa otro número dentro del campo <em>$numeroB</em>, haz click en el botón <strong>Call</strong> y observa cómo en el área de resultados (<em>Results</em>) se muestra el resultado regresado por el método <em>dividir</em> de nuestra clase <em>Calculadora</em> en PHP.</p>
<p>4. Dentro de nuestra clase podemos utilizar métodos privados, los cuales no podrán ser utilizados desde el navegador de servicios (<em>browser</em>) ni desde nuestras aplicaciones en Flash, Flex o AIR. Esto es útil cuando dichos métodos realizan operaciones importantes o críticas y que requieran de mayor seguridad. Para establecer que un método es privado, bastará con agregarle un guión bajo (_) antes del nombre. Para hacer la prueba, agrega el siguiente código a la clase Calculadora.php (Insértalo antes de la última llave (}) y del tag de cierre de PHP (?>):</p>
<pre class="brush: php;">
	 /**
	 * Este método es privado y no aparecerá en el browser de servicios
	 * @returns Regresa la fecha y tiempo del servidor
	 */
	function _esteMetodoEsPrivado() {
		$fecha_hoy = date(&quot;d/m/Y&quot;) . ' ' . date(&quot;H:i:s&quot;);
		return $fecha_hoy;
	}
</pre>
<p>Observa cómo en el código anterior el nombre de la función empieza con guión bajo _, eso quiere decir que se trata de un método privado. El código de este método privado lo que hace es regresarnos la fecha y el tiempo del servidor (por medio del método date).</p>
<p>Desde nuestra clase de PHP podemos acceder a ese método privado por medio de otro método. Para acceder a este método es necesario utilizar la palabra clave <em>$this</em>. A continuación te muestro cómo:</p>
<pre class="brush: php;">
	 /**
	 * Este método es público y está accediendo a nuestro método privado
	 * @returns Regresa la fecha y tiempo del servidor
	 */
	function obtenFechaServidor() {
		$fecha_hoy = $this-&gt;_esteMetodoEsPrivado();
		return $fecha_hoy;
	}
</pre>
<p>El método <em>obtenFechaServidor</em> hace un llamado a la función <em>esteMetodoEsPrivado</em> y almacena en la variable <em>$fecha_hoy</em> el valor regresado por el método privado. Este valor es regresado por el método <em>obtenFechaServidor</em>. </p>
<p>Ingresa a nuestro navegador de <a href="http://www.codigometropoli.com/AMFPHP1.9/browser/" target="_blank">servicios</a>, selecciona la clase Calculadora y observa cómo el método <em>esteMetodoEsPrivado</em> no aparece dentro de los métodos de esta clase. Ahora haz click en el botón <em>obtenFechaServidor</em> y posteriormente en el botón <strong>Call</strong>. En el área de resultados (<em>Results</em>) se mostrará la fecha y hora del servidor.</p>
<p>Antes de pasar a la interfaz y al código ActionScript, te dejo el código completo del archivo <em>Calculadora.php</em></p>
<pre class="brush: php;">
&lt;?php

class Calculadora
{
	/**
	 * Suma dos números pasados por parámetro
	 * @returns Regresa un valor numérico
	 */
	function sumar($numeroA, $numeroB)
	{
		return ($numeroA + $numeroB);
	}	

	/**
	 * Resta dos números pasados por parámetro
	 * @returns Regresa un valor numérico
	 */
	function restar($numeroA, $numeroB)
	{
		return ($numeroA - $numeroB);
	}

	/**
	 * Multiplica dos números pasados por parámetro
	 * @returns Regresa un valor numérico
	 */
	function multiplicar($numeroA, $numeroB)
	{
		return ($numeroA * $numeroB);
	}

	/**
	 * Divide dos números pasados por parámetro
	 * @returns Regresa un valor numérico
	 */
	function dividir($numeroA, $numeroB)
	{
		return ($numeroA / $numeroB);
	}

	/**
	 * Este método es privado y no aparecerá en el browser de servicios
	 * @returns Regresa la fecha y tiempo del servidor
	 */
	function _esteMetodoEsPrivado() {
		$fecha_hoy = date(&quot;d/m/Y&quot;) . ' ' . date(&quot;H:i:s&quot;);
		return $fecha_hoy;
	}

	/**
	 * Este método es público y está accediendo a nuestro método privado
	 * @returns Regresa la fecha y tiempo del servidor
	 */
	function obtenFechaServidor() {
		$fecha_hoy = $this-&gt;_esteMetodoEsPrivado();
		return $fecha_hoy;
	}
}

?&gt;
</pre>
<p>5. Crea un nuevo documento de Flash en Flash CS3 ActionScript 3.0. Cambia las dimensiones del área de trabajo por 300px de ancho y 190px de alto. Renombra la única capa que existe y ponle de nombre Forma. Agrega 3 textos, 3 TextInput(s) y 4 botones de tal forma que tu forma quede similar a la de la imagen:</p>
<div align="center"><img title="Imagen 2: Forma de nuestra aplicación" src="http://www.codigometropoli.com/images/screens/amfphp_flashcs3_2.jpg" alt="Imagen 2: Forma de nuestra aplicación" width="310" height="198" /></div>
<p></p>
<p>El nombre de instancia de cada uno de los TextInput(s) es (de arriba a abajo):</p>
<ul>
<li>numeroA_txt</li>
</ul>
<ul>
<li>numeroB_txt</li>
</ul>
<ul>
<li>resultado_txt</li>
</ul>
<p>El nombre de instancia de cada uno de los botones es (de arriba a abajo):</p>
<ul>
<li>mas_btn</li>
</ul>
<ul>
<li>menos_btn</li>
</ul>
<ul>
<li>por_btn</li>
</ul>
<ul>
<li>entre_btn</li>
</ul>
<p>6. Agrega otra capa y ponle de nombre <em>Acciones</em>. Agrega el siguiente código a dicha capa:</p>
<pre class="brush: as3;">
/* Las siguientes librerías son necesarias para hacer las llamadas y conexión a AMFPHP */
import flash.net.NetConnection;
import flash.net.Responder;

/* Dentro de la variable gateway especificamos la URL completa de donde se encuentra nuestro archivo gateway.php. Si estás trabajando en local, es posible que tu URL sea similar a  http://localhost/AMFPHP1.9/gateway.php */
var gateway:String = &quot;http://localhost/AMFPHP1.9/gateway.php&quot;;
/* Creamos una variable de tipo NetConnection para poder establecer la conexión. Este objeto funcionará como enlace entre el cliente y el servidor */
var conexion:NetConnection = new NetConnection;
/* Establecemos una conexión bidireccional entre el Flash Player y el servidor */
conexion.connect(gateway);
/* Este objeto de clase Responder se encargará de administrar los valores que son regresados por el servidor, ya sea si la operación fue todo un éxito o si hubo un error */
var responder:Responder;
/* Deshabilitamos el campo de texto donde se mostrará el resultado para que sea sólo de lectura */
resultado_txt.enabled = false;
</pre>
<p>Revisa con atención el código anterior y los comentarios que están insertados en él. Hasta ahora solamente hemos importado las librerías que necesitamos, hemos declarado e instanciado las variables que usaremos a lo largo del programa.</p>
<p>Coloca el siguiente código debajo del anterior. Aquí estamos declarando cuatro métodos que serán llamados dependiendo de si el usuario hizo click en el botón de mas, menos, por o entre. Observa bien que el código de cada uno de estos métodos sólo cambia en la llamada de los métodos de la clase (la última línea de cada método, antes de }), es por eso que sólo comentaré la primera función (suma).</p>
<pre class="brush: as3;">
function suma(evento:MouseEvent) :void {
	/* Obtenemos el valor ingresado en cada uno de los campos de texto  */
	var numeroA:Number = Number(numeroA_txt.text);
	var numeroB:Number = Number(numeroB_txt.text);

	/* Le especificamos a la variable responder qué métodos debe llamar en caso de éxito (método respuesta) o en caso de error (método error)  */
	responder = new Responder(respuesta, error);			

	/* Invocamos, por medio del método call, al método sumar que se encuentra en la clase Calculadora (Calculadora.sumar). El segundo parámetro del método call es nuestro objeto de la clase Responder (el que se encargará de gestionar los valores obtenidos de dicha llamada. Por último, le pasamos como cuarto y quinto parámetro los dos números que deberá recibir la función sumar. */
	conexion.call(&quot;Calculadora.sumar&quot;, responder, numeroA, numeroB);
}

function resta(evento:MouseEvent) :void {
	var numeroA:Number = Number(numeroA_txt.text);
	var numeroB:Number = Number(numeroB_txt.text);

	operacion_mc.gotoAndStop(&quot;menos&quot;);
	responder = new Responder(respuesta, error);			

	conexion.call(&quot;Calculadora.restar&quot;, responder, numeroA, numeroB);
}

function multiplicacion(evento:MouseEvent) :void {
	var numeroA:Number = Number(numeroA_txt.text);
	var numeroB:Number = Number(numeroB_txt.text);

	operacion_mc.gotoAndStop(&quot;por&quot;);
	responder = new Responder(respuesta, error);			

	conexion.call(&quot;Calculadora.multiplicar&quot;, responder, numeroA, numeroB);
}

function division(evento:MouseEvent) :void {
	var numeroA:Number = Number(numeroA_txt.text);
	var numeroB:Number = Number(numeroB_txt.text);

	operacion_mc.gotoAndStop(&quot;entre&quot;);
	responder = new Responder(respuesta, error);			

	conexion.call(&quot;Calculadora.dividir&quot;, responder, numeroA, numeroB);
}
</pre>
<p>Después del código anterior solamente nos faltan los métodos respuesta y error, además de las acciones de cada uno de nuestros botones:</p>
<pre class="brush: as3;">
/* En caso de éxito tras ejecutar el método call, esta función es llamada pasándole como parámetro un objeto con el resultado regresado. Este resultado lo mostraremos dentro del TextInput resultado_txt. */
function respuesta(resultado:Object):void {
	resultado_txt.text = String(resultado);
}

/* En caso de error tras ejecutar el método call, esta función es llamada pasándole como parámetro un objeto con el error generado. Este error lo desplegaremos dentro de un trace. */
function error(error:Object):void {
	trace(&quot;Error: &quot; + error.description);
}

/* Establecemos las acciones de nuestros botones */
mas_btn.addEventListener(MouseEvent.CLICK, suma);
menos_btn.addEventListener(MouseEvent.CLICK, resta);
por_btn.addEventListener(MouseEvent.CLICK, multiplicacion);
entre_btn.addEventListener(MouseEvent.CLICK, division);
</pre>
<p>A continuación puedes ver el SWF funcionando. A este archivo le añadí un campo de texto dinámico en el lado inferior derecho en el cual muestro el resultado de hacer una llamada al método <em>obtenFechaServidor</em> de nuestra clase Calculadora. No olvides bajar los archivos de este tutorial que se encuentran al final de esta entrada.</p>
<div align="center" style="margin-top:0px"><script type="text/javascript"><!--
      google_ad_client = "pub-5808310808246221";
      /* 250x250, Posts */
      google_ad_slot = "8254875600";
      google_ad_width = 250;
      google_ad_height = 250;
// --></script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></div>
<div align="center" style="margin-top:30px; margin-bottom:20px; border:1px solid #000000; width=300px; height=220px;">
<object width="300" height="220">
<param name="movie" value="http://codigometropoli.com/wp-content/uploads/2008/09/introduccion-a-amfphp.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<embed type="application/x-shockwave-flash" width="300" height="220" src="http://codigometropoli.com/wp-content/uploads/2008/09/introduccion-a-amfphp.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</div>
<div style="margin-top:30px; margin-bottom:20px;" align="center">
<table border="0" cellspacing="0" cellpadding="0" width="180">
<tbody>
<tr>
<td valign="top"><a href="http://www.megaupload.com/?d=3A3IFW7X" target="_blank"><img src="http://codigometropoli.com/images/descargar.png" alt="Descargar Archivo" /></a></td>
</tr>
</tbody>
</table>
</div>
<div style="margin-top:40px; margin-bottom:30px;">
<p><strong>Enlaces recomendados:</strong></p>
<p>» <a href="http://www.amfphp.org/" target="_blank">Sitio del AMFPHP</a><br />
» <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/NetConnection.html" target="_blank">ActionScript 3.0 Language and Components Reference (Clase NetConnection) </a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.codigometropoli.com/introduccion-a-amfphp/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Enviar Formulario de Contacto</title>
		<link>http://www.codigometropoli.com/enviar-formulario-de-contacto/</link>
		<comments>http://www.codigometropoli.com/enviar-formulario-de-contacto/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 05:39:16 +0000</pubDate>
		<dc:creator>Carla Macías</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[contacto]]></category>
		<category><![CDATA[formulario]]></category>

		<guid isPermaLink="false">http://www.codigometropoli.com/?p=21</guid>
		<description><![CDATA[Para poder enviar un formulario de contacto en Flash es necesario utilizar un lenguaje del lado del servidor que permita enviar el correo con los datos que el usuario introdujo en Flash. Algunos ejemplos de estos lenguajes del lado de servidor son PHP, JSP y ASP. En este ejemplo veremos cómo enviar por mail un [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><img class="alignright" style="float: right;" src="http://codigometropoli.com/images/flash.png" alt="Flash y PHP" width="93" height="93" /><img class="alignright" style="float: right;" src="http://codigometropoli.com/images/php.png" alt="Flash y PHP" width="93" height="93" /> Para poder enviar un formulario de contacto en Flash es necesario utilizar un lenguaje del lado del servidor que permita enviar el correo con los datos que el usuario introdujo en Flash. Algunos ejemplos de estos lenguajes del lado de servidor son PHP, JSP y ASP.<br />
En este ejemplo veremos cómo enviar por mail un formulario de contacto usando PHP.</p>
<p style="text-align: left;"><span id="more-21"></span>Para fines de este tutorial, se pondrán en el formulario algunos de los componentes que ya vimos en los post pasados. Estos componentes son <a href="http://www.codigometropoli.com/componente-combobox" target="_blank">ComboBox</a>, <a href="http://www.codigometropoli.com/componente-radiobutton">RadioButton </a>y <a href="http://www.codigometropoli.com/componente-checkbox">CheckBox</a>.</p>
<p style="text-align: left;">Para este tutorial usaremos Flash 8. El ejemplo y los archivos de este tutorial los encuentras al final de esta entrada.</p>
<p style="text-align: left;"><img style="float: left; padding-right: 5px;" src="../images/nota.jpg" alt="Nota" /> Por razones de seguridad, el ejemplo que se encuentra al final de este post no enviará  ningún correo electrónico (para evitar que se llene el buzón o llegue puro correo basura). En lugar de mandar el correo electrónico mostraré el resultado final de cómo se vería el correo electrónico (tanto en formato HTML como en formato de texto plano). Sin embargo, los archivos de esta entrada y el código aquí pegado, sí tienen la instrucción para enviar el correo electrónico.</p>
<p><span style="color: #560e00;"><span style="text-decoration: underline;"><strong>Tutorial<br />
</strong></span></span></p>
<p style="text-align: left;"><strong>I. Haciendo el formulario en <span style="color: #993300;">Flash</span></strong></p>
<p style="text-align: left;">1. Crea un nuevo documento de Flash de 420px por 380px.</p>
<p style="text-align: left;">2. Arrastra al escenario los siguientes componentes (recuerda que estos componentes están dentro de la sección <strong>User Interface</strong> del panel <strong>Components </strong>(Ctrl. + F7) :</p>
<ul>
<li>2 Campos de texto (TextInput)</li>
<li>2 Botones de Radio (RadioButton)</li>
<li>1 ComboBox</li>
<li>5 CheckBoxes</li>
<li>1 TextArea</li>
<li>1 Botón (Button)</li>
</ul>
<p>Además, crea 5 textos dinámicos con el (*) como texto (estos los usaremos para mostrar los campos obligatorios que el usuario debe llenar. Para este ejemplo, haremos que todos los datos sean obligatorios). A estos textos, ponles como nombre de instancia msj1, msj2, msj3, etc.</p>
<p>3. Selecciona cada componente que arrastraste al escenario y ponle los siguientes nombres de instancia (dentro del Panel Propiedades):</p>
<ul>
<li>1er Campo de texto (TextInput)  -&gt; nombre_txt</li>
<li>2do Campo de texto (TextInput)  -&gt; correo_txt</li>
<li>1er Botón de Radio (RadioButton) -&gt; radio1</li>
<li>2do Botón de Radio (RadioButton) -&gt; radio2</li>
<li>ComboBox -&gt; pais_cb</li>
<li>1er CheckBox -&gt; check1, 2do CheckBox -&gt; check2, 3er CheckBox -&gt; check3, 4to CheckBox -&gt; check4, 5to CheckBox -&gt; check5</li>
<li>TextArea -&gt; comentarios_txt</li>
<li>Botón -&gt; enviar_btn</li>
</ul>
<p>4. Además, cambia los siguientes parámetros (tercera pestaña del panel Propiedades) a estos componentes:</p>
<ul>
<li>radio1: <strong>data </strong>= F, <strong>groupName </strong>= sexoGroup, <strong>label </strong>= Femenino</li>
<li>radio2: <strong>data </strong>= M, <strong>groupName </strong>= sexoGroup, <strong>label </strong>= Masculino</li>
<li>check1: <strong>label</strong> = Flash</li>
<li>check2: <strong>label</strong> = Flex</li>
<li>check3: <strong>label</strong> = AIR</li>
<li>check4: <strong>label</strong> = PHP</li>
<li>check5: <strong>label</strong> = Ajax</li>
</ul>
<p>5. Acomoda todos los componentes anteriores para que te queden similar a la siguiente imagen:</p>
<p style="text-align: center;"><img src="http://www.codigometropoli.com/images/screens/ps11sc1.png" alt="" /></p>
<p style="text-align: left;">6. Es momento de escribir el código. A la capa (layer) existente asígnale el nombre de <em>Forma</em>. Crea una nueva capa llamada <em>Acciones</em>. En el panel <strong>Actions</strong> de esta capa escribe lo siguiente:</p>
<pre class="brush: as3;">
// Importamos la librería del componente Alert
import mx.controls.Alert;
// Sólo por estética, cambiamos el color del tema (cambiamos el verde que aparece por default)
_global.style.setStyle(&quot;themeColor&quot;, 0xCCFFFF);
/* Esta línea es importante para que todo lo que el usuario escriba o seleccione tenga acentos, se muestren de forma correcta y no con caracteres raros (Ej. Ã) */
System.useCodepage = true;
/* Creamos un arreglo para guardar los temas seleccionados por el usuario (es decir, las opciones de los checkboxes que el usuario seleccionó) */
var temas:Array = new Array();
/* En el arrelgo paises gaurdaremos los datos que aparecerán en el combobox de países */
var paises:Array = new Array();
/* Creamos dos objetos de la clase LoadVars, uno para enviar los datos introducidos por el usuario y el otro para recibir la respuesta enviada por el archivo de PHP */
var enviar_lv:LoadVars = new LoadVars();
var resultado_lv:LoadVars = new LoadVars();
/* Hacemos la llamada a la función initForm, la cual a su vez llamará a otras funciones para, por ejemplo, llenar el combobox de los paises, cambiarle el estilo a los botones de radio, etc. El código de esta función está en el siguiente bloque de código ActionScript. */
initForm();
</pre>
<p style="text-align: left;">El código anterior muestra la declaración variables e importación de clases necesarias (en este caso sólo una clase). Ahora nos enfocaremos en las funciones que escribiremos en nuestro código.</p>
<pre class="brush: as3;">
/* Esta función llama a los métodos encargados de cambiar los estilos de los botones de radio, checkboxes, etc. */
function initForm() {
	escondeMensajes();
	setEstilosRadioButtons();
	setEstilosCheckBoxes();
	llenaComboPaises();
}
/* Escondemos (no mostramos) los mensajes que le indicarán al usuario qué campos le faltó introducir. Es decir, los campos obligarios marcados por (*). */
function escondeMensajes() {
	for(var i = 1; i &lt; 7; i++) {
		this[&quot;msj&quot; + i]._visible = false;
	}
}
/* Le cambiamos el formato a los botones de radio. Si no entiendes esta parte, por favor revisa el post sobre el componente RadioButton */
function setEstilosRadioButtons() {
	for(var i = 1; i &lt; 3; i++) {
		this[&quot;radio&quot; + i].setStyle(&quot;color&quot;, 0x990000);
		this[&quot;radio&quot; + i].setStyle(&quot;fontWeight&quot;, &quot;bold&quot;);
		this[&quot;radio&quot; + i].setStyle(&quot;marginLeft&quot;, 2);
	}
}
/* Le cambiamos el formato a los checkboxes. Si no entiendes esta parte, por favor revisa el post sobre el componente CheckBox */
function setEstilosCheckBoxes() {
	for(var i = 1; i &lt; 6; i++) {
		this[&quot;check&quot; + i].setStyle(&quot;color&quot;, 0x990000);
		this[&quot;check&quot; + i].setStyle(&quot;fontWeight&quot;, &quot;bold&quot;);
		this[&quot;check&quot; + i].setStyle(&quot;marginLeft&quot;, 2);
	}
}
/* Esta función llena el arreglo países con las opciones que nos interesa mostrar en el combobox de países. Después de llenar el arreglo se lo asignamos como dataProvider al combobox pais_cb y le decimos que ordene las opciones de acuerdo a su etiqueta (label). Si no entiendes esta parte, por favor revisa el post sobre el componente ComboBox */
function llenaComboPaises() {
	paises.push({label:&quot;-- Selecciona --&quot;, 	data:0});
	paises.push({label:&quot;México&quot;, 			data:&quot;MEX&quot;});
	paises.push({label:&quot;España&quot;, 			data:&quot;ESP&quot;});
	paises.push({label:&quot;Colombia&quot;,	 	data:&quot;COL&quot;});
	paises.push({label:&quot;Argentina&quot;, 		data:&quot;ARG&quot;});
	paises.push({label:&quot;Chile&quot;,		 	data:&quot;CHI&quot;});
	paises.push({label:&quot;Perú&quot;,			data:&quot;PER&quot;});
	paises.push({label:&quot;Venezuela&quot;, 		data:&quot;VEN&quot;});

	paises.push({label:&quot;Ecuador&quot;, 		data:&quot;ECU&quot;});
	paises.push({label:&quot;Costa Rica&quot;, 		data:&quot;COS&quot;});
	paises.push({label:&quot;Uruguay&quot;, 		data:&quot;URU&quot;});
	paises.push({label:&quot;Bolivia&quot;, 			data:&quot;BOL&quot;});
	paises.push({label:&quot;Estados Unidos&quot;, 	data:&quot;EUA&quot;});
	paises.push({label:&quot;Guatemala&quot;, 		data:&quot;GUA&quot;});
	paises.push({label:&quot;Brasil&quot;, 			data:&quot;BRA&quot;});
	paises.push({label:&quot;Cuba&quot;, 			data:&quot;CUB&quot;});
	paises.push({label:&quot;Panamá&quot;, 			data:&quot;PAN&quot;});
	paises.push({label:&quot;El Salvador&quot;, 		data:&quot;SAL&quot;});
	paises.push({label:&quot;Nicaragua&quot;, 		data:&quot;NIC&quot;});
	paises.push({label:&quot;Otro&quot;,			data:&quot;Otr&quot;});
	pais_cb.dataProvider = paises;
	pais_cb.sortItemsBy(&quot;label&quot;);
}
</pre>
<p style="text-align: left;">Las siguientes funciones son vitales para el tratamiento del formulario:</p>
<pre class="brush: as3;">
/* Asignamos las acciones al botón de Enviar. En este caso, el botón de Enviar hará el llamado a la función validaForma para verificar que el usuario haya llenado los campos obligatorios. Como lo dije anteriormente, para este ejemplo haremos que el usuario tenga que llenar todos los campos. */
enviar_btn.onRelease = function() {
	validaForma();
}
/* Esta función se encarga de validar que todos los campos obligatorios fueron llenados. Primero hacemos llamamos a la función escondeMensajes para no mostrar los campos dinámicos (msj1, msj2, etc.) en caso de que sea la segunda vez que se llama a la función validaForma. */
function validaForma() {
	escondeMensajes();
	if(nombre_txt.text == &quot;&quot;) { // Vemos si el campo de texto del nombre está vacío
		msj1._visible = true; // Como el campo del nombre no fue llenado, mostramos el primer mensaje
		nombre_txt.setFocus(); // Colocamos el foco o cursor en el campo del nombre
	} else if(correo_txt.text == &quot;&quot; || !esCorreo(correo_txt.text)) { /* Vemos si el campo del correo está vacío y sí el formato del correo es correcto */
		msj2._visible = true; /* Mostramos el segundo mensaje ya que el campo del correo está vacío o bien el formato es incorrecto */
		correo_txt.setFocus(); // Ponemos el cursos en el campo del correo
	} else if(sexoGroup.selection.data == undefined) { /* Si se cumple esta sentencia quiere decir que el usuario no seleccionó ninguna opción de los botones de radio */
		msj3._visible = true; // Mostramos el tercer mensaje
		radio1.setFocus(); // Ponemos el cursor en el primer botón de radio
	} else if(pais_cb.selectedIndex == 0) { /* Si se cumple este condicional quiere decir que el usuario no seleccionó ninguna opción del combobox de los países. Si el índice seleccionado (selectedIndex) es igual a 0, entonces la opción seleccionada es la que dice &quot;-- Seleccionar --&quot;, por lo tanto no nos interesa que el usuario use esa opción */
		msj4._visible = true;
		pais_cb.setFocus();
	} else {
		temas = buscaChecksSeleccionados(); /* Guardamos en el arreglo temas los valores de los checkboxes que el usuario seleccionó. La función buscaChecksSeleccionados nos regresa un arreglo con los valores de los checkboxes seleccionados */
		if(temas.length == 0) { /* Si la longitud del arreglo temas es igual a 0, entonces el usuario no seleccionó ninguna opción; por lo tanto, mostramos el quinto mensaje y ponemos el cursor en el primer checkbox */
			msj5._visible = true;
			check1.setFocus();
		} else if(comentarios_txt.text == &quot;&quot;) { /* Si la caja de texto de los comentarios está vacía, mostramos el sexto mensaje y posicionamos el cursor en la caja de texto (TextArea) */
			msj6._visible = true;
			comentarios_txt.setFocus();
		} else { /* Si ninguno de los condicionales anteriores se cumplió, quiere decir que el usuario llenó todos los campos necesarios. Mandamos a llamar la función enviarCorreo */
			enviarCorreo();
		}
	}
}
/* Esta función regresa un arreglo con los valores de los CheckBox(es) seleccionados. Recorremos todos los componentes checkbox por medio de un ciclo for y vemos el valor de la propiedad &quot;selected&quot; de cada uno de ellos. Si no entiendes esta parte, por favor revisa el post sobre el componente CheckBox  */
function buscaChecksSeleccionados():Array {
	var temp = new Array();
	for(var i = 1; i &lt; 6; i++) {
		if(this[&quot;check&quot; + i].selected) {
			temp.push(this[&quot;check&quot; + i].label);
		}
	}
	return temp;
}
/* Esta función nos permite revisar si el formato del correo electrónico es correcto. Es decir, que contenga @, el punto xxx, etc. */
function esCorreo(email:String):Boolean
{
	var res:Boolean = false;
	if(email.indexOf(&quot;@&quot;)&gt;0 &amp;&amp; email.indexOf(&quot;@&quot;) == email.lastIndexOf(&quot;@&quot;))
	{
		if(email.lastIndexOf(&quot;.&quot;) &gt; email.indexOf(&quot;@&quot;) &amp;&amp; email.lastIndexOf(&quot;.&quot;)&lt;email.length-1)
		{
			res = true;
		}
	}
	return res;
}
</pre>
<p style="text-align: left;">El siguiente código muestra el script de la función enviarCorreo.</p>
<pre class="brush: as3;">
/* Explicación: Primero desactivamos el botón de enviar para que el usuario no haga click más de una vez. Al objeto enviar_lv de la clase LoadVars le copiamos el valor de cada uno de los campos del formulario y los enviamos al archivo de PHP (enviar_formulario_de_contacto.php). A la función sendAndLoad del objeto enviar_lv, le pasamos como parámetro el path del archivo que recibirá los datos, el objeto de la clase LoadVars que recibirá la respuesta y el método en cómo se enviarán los datos (POST o GET). Este último parámetro es opcional y por default el valor es de POST.  NOTA: Si quieres cargar el resultado del archivo pasado como primer parámetro, deberás usar la función send. En los archivos de este tutorial que encuentras más abajo en un archivo zip, usamos la función sendAndLoad ya que nos interesa mostrar un mensaje de alerta (con el resultado) dentro del mismo Flash y no dentro del PHP. Sin embargo, el ejemplo que se encuentra más abajo utiliza la función send para mostrar dentro del mismo PHP el mensaje del correo electrónico en formato HTML y Texto Plano. */
function enviarCorreo() {
	enviar_btn.enabled = false;
	enviar_lv.nombre = nombre_txt.text;
	enviar_lv.correo = correo_txt.text;
	enviar_lv.sexo = sexoGroup.selection.data;
	enviar_lv.pais = pais_cb.selectedItem.label;
	enviar_lv.temas = temas;
	enviar_lv.comentarios = comentarios_txt.text;
	enviar_lv.sendAndLoad(&quot;enviar_formulario_de_contacto.php&quot;, resultado_lv, &quot;POST&quot;);
}
/* El evento onLoad del objeto resultado_lv es invocado cuando la llamada a los métodos load() o sendAndLoad() ha sido terminada. Asignamos el resultado regresado por el PHP a la variable respuesta. Si la llamada fue exitosa, vemos si la respuesta es igual a 'S', si es así mostramos un mensaje señalando que el mensaje ha sido enviado y llamamos a la función reestablecerForma para borrar los datos ingresados por el usuario. Si la respuesta es distinto a 'S' o bien si la llamada no fue exitosa, mostramos un mensaje señalando que hubo un error en el envío. Por último, volvemos a activar el botón de enviar. */
resultado_lv.onLoad = function(success:Boolean)
{
	var respuesta = this.resultado;
	if(success)
	{
		if(respuesta == &quot;S&quot;)
		{
			Alert.show(&quot;Su mensaje ha sido enviado.&quot;, &quot;Gracias&quot;, Alert.OK, null, &quot;alerta&quot;, Alert.OK);
			reestablecerForma();
		}
		else
		{
			Alert.show(&quot;Hubo un error en el envío del mensaje, por favor intente más tarde.&quot;, &quot;Error&quot;, Alert.OK, null, &quot;alerta&quot;, Alert.OK);
		}
	}
	else
		Alert.show(&quot;Hubo un error en el envío del mensaje, por favor intente más tarde.&quot;, &quot;Error&quot;, Alert.OK, null, &quot;alerta&quot;, Alert.OK);
        enviar_btn.enabled = true;
};
/* Esta función borra los datos introducidos por el usuario. */
function reestablecerForma() {
	nombre_txt.text = &quot;&quot;;
	correo_txt.text = &quot;&quot;;
	desactivarSexo();
	desactivarTemas();
	pais_cb.selectedIndex = 0;
	comentarios_txt.text = &quot;&quot;;
}
/* Su función es poner todos los botones de radio como no seleccionados */
function desactivarSexo() {
	for(var i = 1; i &lt; 3; i++) {
		this[&quot;radio&quot; + i].selected = false;
	}
}
/* Su función es poner todos los CheckBox(es) como no seleccionados */
function desactivarTemas() {
	for(var i = 1; i &lt; 6; i++) {
		this[&quot;check&quot; + i].selected = false;
	}
}
</pre>
<p style="text-align: left;">Ese es todo el código que deberá llevar el documento de Flash.</p>
<p style="text-align: left;"><strong>II. Programando el script en <span style="color: #993300;">PHP</span> para el envío del correo</strong></p>
<p style="text-align: left;">A continuación pegaré todo el código del archivo enviar_formulario_de_contacto.php. Dentro del código están los comentarios para que puedas entender qué hace cada línea de código.</p>
<pre class="brush: php;">
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php
/**
 * @author Carla Macías
 * @copyright 2008
 * @url http://codigometropoli.com/
 */
/* 1. Recibimos las variables que mandamos por Flash.
 	  Para recibirlas usaremos la matriz asociativa $_POST, la cual contiene los valores del formulario enviados por medio de LoadVars.
	  Importante: Los nombres de variables que recibe $_POST deberán ser
	  iguales a las variables enviadas por Flash. Con lo anterior, me refiero a la variable que está dentro de los [] de $_POST. */
$nombre = stripslashes($_POST[&quot;nombre&quot;]); /* Campo de texto corto (TextField) */
$correo = $_POST[&quot;correo&quot;]; /* Campo de texto corto (TextField) */
$sexo   = $_POST[&quot;sexo&quot;]; /* Botón de Radio. Esta variable trae la etiqueta del botón de radio seleccionado por el usuario. Debido a que el usuario solamete puede escoger una opción, basta con recibir el valor por medio de $_POST */
$pais   = $_POST[&quot;pais&quot;]; /* ComboBox. Igual que en el anterior, estamos recibiendo el valor de la etiqueta de la opción seleccionada por el usuario; basta con recibirla por medio de $_POST */
$temas  = explode(',',$_POST[&quot;temas&quot;]); /* CheckBox. Debido a que el usuario pudo haber seleccionado más de una opción, esta variable hay que tratarla de forma distinta. Esta variable trae todos los valores del arreglo (que usamos para guardar los valores de los checkbox seleccionados) separados por comas. Por ejemplo: opcion 1,opcion 2,opcion 3.
En este ejemplo, vamos a mostrar los temas en forma de lista, por lo que haremos uso del método explode en PHP. Para más información sobre el método explode visita http://www.php.net/manual/es/function.explode.php para más información  */
$comentarios = $_POST[&quot;comentarios&quot;]; /* TextArea. Es posible que la información en este campo introducida por el usuario sea larga y que lleve saltos de línea. Para mostrarlo de igual forma en el correo usaremos la función nl2br (ver más adelante). */
$formatos = array(&quot;text/html&quot;, &quot;text/plain&quot;); /* No modificar, solamente estoy declarando un arreglo */
/* 2. Declaramos las variables sobre el correo electrónico. */
$remitente = &quot;no-reply@codigometropoli.com&quot;; /* Cuenta de correo de donde se &quot;manda&quot;&quot; el mail. En este caso no importa que la cuenta de correo exista, ni que sea similar a no-reply@, web@, contacto@, etc ya que este formulario de contacto le estaría llegando al webmaster o los de ventas, relaciones públicas, etc. */
$para = &quot;msj1@codigometropoli.com,msj2@codigometropoli.com&quot;; /* Cuenta de correo a donde se enviarán los mails. Separar por comas en caso de que sean más de uno. */
$asunto = &quot;Mensaje desde Código Metrópoli&quot;; /* Asunto que aparecerá en el correo electrónico */
$formato_correo = 0; /* IMPORTANTE: Aquí pon el valor de 0 si quieres que el formato del correo sea HTML y 1 si quieres que sea texto plano. 0 --&gt; HTML,    1 -&gt; Texto Plano */
&lt;p&gt;/* 3. Establecemos las cabeceras (headers) del mail. &quot;Bcc: &quot; . $cc . */
$header  = &quot;MIME-Version: 1.0\r\n&quot;;
$header .= &quot;Content-type: &quot; . $formatos[$formato_correo] . &quot;; charset=iso-8859-1\r\n&quot;;
$header .= &quot;From: &quot; . $remitente . &quot;\n&quot;;
/* Nota: Si deseas agregar correos de copia o copia oculta, descomenta las siguientes líneas (es decir, borra las // de las siguientes dos líneas) */
//$header .= &quot;Cc: copia1@codigometropoli.com,copia2@codigometropoli.com \n&quot;;
//$header .= &quot;Bcc: copiaoculta1@codigometropoli.com,copiaoculta2@codigometropoli.com \n&quot;;
if($nombre != &quot;&quot; &amp;&amp; $correo != &quot;&quot;) { // Siempre es bueno asegurarse que recibimos los datos más importantes para no mandar correos vacíos
	if($formato_correo == 0) { /* HTML */
		$mensaje = '
&lt;style type=&quot;text/css&quot;&gt;
		&lt;!--
		.Estilo1 {
			font-family: Arial;
			font-size: 14px;
		}
		.Tabla_Contacto td {
			padding:5px 5px 10px 5px;
		}
		.Estilo2 {
			color: #990000;
			font-weight: bold;
		}
		hr {
			color:#003366;
			background-color:#003366;
			height:5px;
			width:450px;
			margin-left:0px;
		}
		--&gt;
		&lt;/style&gt;
&lt;p&gt;		&lt;span class=&quot;Estilo1&quot;&gt;&lt;span class=&quot;Estilo2&quot;&gt;' . $asunto . '&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;table width=&quot;438&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; class=&quot;Tabla_Contacto&quot;&gt;
&lt;tr&gt;
&lt;td width=&quot;111&quot; class=&quot;Estilo1&quot;&gt;&lt;strong&gt;Nombre:&lt;/strong&gt;&lt;/td&gt;
&lt;td width=&quot;327&quot; class=&quot;Estilo1&quot;&gt;' . $nombre . '&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;Estilo1&quot;&gt;&lt;strong&gt;Email:&lt;/strong&gt;&lt;/td&gt;
&lt;td class=&quot;Estilo1&quot;&gt;' . $correo . '&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;Estilo1&quot;&gt;&lt;strong&gt;Sexo:&lt;/strong&gt;&lt;/td&gt;
&lt;td class=&quot;Estilo1&quot;&gt;' . $sexo . '&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;Estilo1&quot;&gt;&lt;strong&gt;Pa&amp;iacute;s:&lt;/strong&gt;&lt;/td&gt;
&lt;td class=&quot;Estilo1&quot;&gt;' . $pais . '&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;Estilo1&quot;&gt;&lt;strong&gt;Temas:&lt;/strong&gt;&lt;/td&gt;
&lt;td class=&quot;Estilo1&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;Estilo1&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td class=&quot;Estilo1&quot;&gt;';
				for($i = 0; $i &lt; count($temas); $i++) {
					$mensaje .= $temas[$i] . &quot;&lt;br /&gt;&quot;;
				} $mensaje .=  '&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;Estilo1&quot;&gt;&lt;strong&gt;Comentarios:&lt;/strong&gt;&lt;/td&gt;
&lt;td class=&quot;Estilo1&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;2&quot; class=&quot;Estilo1&quot;&gt;' . nl2br(stripslashes($comentarios)) . '&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;hr style=&quot;height:10px&quot; /&gt;';
	}
	else { /* Texto Plano */
$mensaje = &quot;
----------------------------------------------------------------------------\n
Nombre: &quot; . $nombre . &quot;\n
Email: &quot; . $correo . &quot;\n
Sexo: &quot; . $sexo . &quot;\n
País: &quot; . $pais . &quot;\n
Temas: &quot;;
		for($i = 0; $i &lt; count($temas); $i++) {
			$mensaje .= $temas[$i] . &quot;\n&quot;;
		} $mensaje .=  &quot;
Comentarios: &quot; . $comentarios . &quot;\n
----------------------------------------------------------------------------\n&quot;;
	}
}
if($mensaje != &quot;&quot;)
{
	if(mail($para, $asunto, $mensaje, $header))
		echo '&amp;resultado=S&amp;;';
	else
		echo '&amp;resultado=N&amp;';
}
else
	echo '&amp;resultado=N&amp;';
?&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p style="text-align: left;">Hemos llegado al final de este largo tutorial. No olvides ver el ejemplo y bajar el archivo.</p>
<p style="text-align: left;"><img style="float: left; padding-right: 5px;" src="../images/nota.jpg" alt="Nota" />Como lo dije al principio del tutorial, por razones de seguridad, el ejemplo que se encuentra a continuación no enviará  ningún correo electrónico (para evitar que se llene el buzón o llegue puro correo basura). En lugar de mandar el correo electrónico mostraré el resultado final de cómo se vería el correo electrónico (tanto en formato HTML como en formato de texto plano). Sin embargo, los archivos de esta entrada y el código pegado anteriormente, sí tienen la instrucción para enviar el correo electrónico.</p>
<div align="center"><script type="text/javascript"><!--
    google_ad_client = "pub-5808310808246221";
    /* 250x250, Posts */
    google_ad_slot = "8254875600";
    google_ad_width = 250;
    google_ad_height = 250;
// --></script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></div>
<div align="center" style="margin-top:30px; margin-bottom:20px;">
<object width="420" height="380">
<param name="movie" value="http://codigometropoli.com/wp-content/uploads/2008/07/Enviar_Correo.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<embed type="application/x-shockwave-flash" width="420" height="380" src="http://codigometropoli.com/wp-content/uploads/2008/07/Enviar_Correo.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</div>
<div align="center" style="margin-top:30px; margin-bottom:20px;">
<table border="0" cellspacing="0" cellpadding="0" width="180">
<tbody>
<tr>
<td valign="top"><a href="http://www.megaupload.com/?d=AX90OBE0"><img src="../images/descargar.png" alt="Descargar Archivo" /></a></td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.codigometropoli.com/enviar-formulario-de-contacto/feed/</wfw:commentRss>
		<slash:comments>127</slash:comments>
		</item>
	</channel>
</rss>

