Vamos a comenzar con el script php, que posiblemente sea lo mas complejo. Recordándoles que es necesaria la utilización de otra página que contenga el form.html.
Podemos copiar el texto siguiente, y guardarlo en un archivo mail.php. Cuando pulsemos enviar, en el formulario html, mediante la especificación cgi, se envían los datos del formulario. Que son procesados por este script. Puede usted utilizar como variables php los nombres de campos del formulario html con el signo $ en 1er lugar.
Quienes tengan problemas con el contenido. Un mensaje en blanco solo con las etiquetas.
<?php
##################################
## © Hector Fernandez Pereda 2003 ####
#################################
## Script formulario de correo mail.php ##
#################################
## VARIABLES
## Dirección de tu correo
$micorreo="tucuenta@tudominio.com";
## Asunto axiliar si no lo introduce un asunto que identifique la procedencia del correo.
$xasunto="Correo desde tu pagina";
## Pagina final de gracias. Si el formulario no incluye este campo oculto del formulario.
$gracias_defecto="http://www.buscarportal.com";
## Página final si se produce un error al enviar el correo
$error_correo="http://www.buscarportal.com/anuncios/error_correo.html";
## variable auxiliar, que produce un salto de línea
$retorno="\r\n";
## CABECERAS DE CORREO
## Diversas cabeceras para el correo. Luego, lo usaremos para enviar el correo.
## $nombre $correo son variables que contienen los valores de: nombre y correo del formulario.
$headers = "MIME-Version: 1.0\r\n" ;
## campos y variables nombre, $nombre y correo $correo. No puede ser modificado su nombre en el form
## Han de mantenerse en el formulario para utilizar el mismo script con distintos formularios
## Añadimos esta linea por compatibilidad,
$nombre=$HTTP_GET_VARS['nombre'];$correo=$HTTP_GET_VARS['correo'];
## Origen del mensaje
$headers .= "From: $nombre<$correo>\r\n";
## Responder al correo
$headers .= "Reply-To: $correo<$correo>\r\n";
## Otras cabeceras que pueden ponerse si ocurren problemas u omitirse si todo va bien.
## Obligatoriamente, cada elemento de la cabecera termina en \r\n Nueva línea.
## $headers .= "X-Mailer: PHP/" . phpversion();
## $headers .= "X-Sender: $correo<$correo>\r\n";
## $headers .= "Return-Path: <$correo>\r\n";
## $headers .= "Cc: $nombre<$correo>\r\n";
## CUERPO DEL MENSAJE INICIO
## Obtención de la IP del visitante
## Empezamos a contruir el mensaje final, sumando los elementos del mensaje
$mfinal.="IP visitante: ";
## Guardamos la IP del visitante
$mfinal.=$HTTP_SERVER_VARS['REMOTE_ADDR'];
$mfinal.=": ";
## Y el puerto del usuario
$mfinal.=$HTTP_SERVER_VARS['REMOTE_PORT'];
## añadimos dos retornos de línea
$mfinal.=$retorno;
$mfinal.=$retorno;
## CUERPO DEL MENSAJE AÑADIDO DE CAMPOS AL MENSAJE
## $vareliminar Número de botones del formulario y campos ocultos (últimos elementos) + 1 --> en este caso (1+1)
## Si queremos eliminar del mensaje el campo oculto de la página final $vareliminar=3;
$vareliminar=2;
## Almacenar en un array los nombres de variables del formulario enviado
$claves_array=array_keys ($HTTP_GET_VARS);
## de i=0 hasta el número de campos del formulario, - variables a eliminar
for ($i=0;$i<=(count($HTTP_GET_VARS)-$vareliminar);$i++){
## Obtenemos el nombre de cada campo en concreto
$nombrevar=$claves_array[$i];
## Sumamos el nombre de campo de formulario al mensaje final
$mfinal .= $nombrevar;
$mfinal .= ": ";
## Y añadimos el contenido que haya introducido nuestro visitante
$mfinal .= $HTTP_GET_VARS[$nombrevar];
## Separamos cada campo por dos retornos, podemos eliminar uno
$mfinal .= $retorno;
$mfinal .= $retorno;
}
## Si no hay asunto, o no contiene nada, le damos al email un asunto defecto
if (is_null($asunto)){ $asunto2="correo desde la web";}
## Si hay asunto, añadimos un prefijo propio para identificar que es correo desde la web.
else { $asunto2 ="Asunto-> $asunto"; }
## ENVÍO DEL CORREO
## Para finalizar, envíamos el correo, y comprobamos el resultado
$resultado=mail($micorreo, $asunto2, $mfinal, $headers);
## Si quisiésemos enviar un mensaje de acuso de recibo, añadimos esta línea, sabiendo que:
## tenemos que asignar estas variables $asuntoreply (Asunto), $mreply (mensaje), $headers2(mensaje)
## de modo similar a como hemos construido las variables anteriores
## $resultado2=mail($correo, $asuntoreply, $mreply, $headers2);
## COMPROBACIÓN
## Si no se ha podido enviar el correo.
if ($resultado ==true)
{
## Si no hay página de gracias carga las página de defecto
if (is_null($pagina_gracias)){ header( "Location: $gracias_defecto" );}
else{
## Si hay página de gracias, cárgala
header( "Location: $pagina_gracias" );
}
}
## Si se ha producido un error, advierte al usuario
else header( "Location: $error_correo" );
?>
Nota adicional: Para quienes reciben correos en blanco sin los datos. El tamaño de los datos que se pueden enviar, está limitado. Podéis probar con Post, que en teoría admite un mayores tamaños.. Cambiando la variable $HTTP_GET_VARS por $HTTP_POST_VARS ó $_POST. Adicionalmente podemos probar $_GET por $HTTP_GET_VARS. A mi, para get, solo me sirve la primera forma, $HTTP_GET_VARS, y la segunda forma $_POST para post.
Caracteres especiales y comillas, producen errores. Podemos arreglarlos con las funciones mysql_escape_string(), addslashes() ...
La pega, es que nos modifica el texto. Si no lo vamos a usar con echo para imprimir en pantalla, recordar esto.
Cambiar $mfinal .= $HTTP_GET_VARS[$nombrevar]; por $mfinal .= mysql_escape_string($HTTP_GET_VARS[$nombrevar]); Por último. Puedes revisar tu php.ini, puedes comprobar el estado de la configuración con la función <? phpinfo(INFO_MODULES); ?> lo guardas en una página php. Y al ejecutar, te da la información de la configuración del interprete php.
Puedes modificar la configuración de php en el archivo .htaccess que está en la dirección del raiz. Pero que puede estar en cualquier subdirectorio afectando a su comportamiento. De modo que solo afecte a los scripts de este directorio.
Antes de empezar, puede que no exista el .htaccess, o que esté oculto. Puedes acceder a el en este caso desde el sistema web de administración de archivos. Ten cuidado, porque un error, puede impedir el acceso a todo el sitio. Así que lo primero copia de seguridad.
Mejor te creas un directorio y un .htaccess inclyendo los scrpts que quieras correr con otra modificación. Debería de funcionar localmente. Si sigues recibiendo correos en blanco, prueba a poner estas dos líneas en el archivo.
php_flag register_globals On
php_flag register_argc_argv On Tal como están. El rendimiento es menor, pero admite referenciar parámetros de la página directamente sin $http_ ......
Meritos a Hector Fernandez de BuscaPortal
Ahora bien el formulario, para poder usar el script..Formulario de Correo
Veamos el formulario de correo, a incluir en nuestras páginas php, asp o html. Hemos añadido mas campos al formulario de los que solemos utilizar, para tener un ejemplo mas completo.
Este formulario, junto con el script javascript de mas adelante, lo introduciremos en nuestra página html, que queramos utilizar para incluir el formulario. El script php ó asp , va en una archivo aparte, en el achivo mail.php ó mail.asp en el mismo directorio.
Para otros lenguajes, este formulario y el script java, es idéntico. Hay que traducir el script como hemos hecho de php, a asp.
*Además, necesitarás una página de gracias con la que dar feedback al visitante, e informarle de que el correo se ha procesado. Y una página de error, esta es requerida si no se ha podido alcanzar el programa de envío de correo -mal funcionamiento del servidor-. Se puede omitir la página de gracias, y redireccionarle a otra url. Pero la de error, se requiere. Quienes quieran, pueden integrar estos resultados en el scipt, pero a mi me gusta tener páginas por separado, que es mas práctico y versatil.
*Si usted sabe poco, sepa que solo se envían al script los nombres de los campos y sus valores. Puede añadir imágenes, textos, tablas, y darle el formato que desee, es indiferente, este tipo de información, no se envía.
*Dependiendo de la configuración de su servidor. Necesitará utilizar Post ó Get. Igulamente, puede tener limitado el texto a enviar por correo. Y tampoco se puede cargar con el Quijote, que los datos, se reciben en blanco.
<!-- Encabezamiento del formulario. Antes de enviarlo, ejecuta la rutina de validación JScript -->
<!-- Si el JScript retorna falso, no se produce el envío de correo -->
<!-- Modificar la trayectoria del scipt mail.php si lo tenemos en otro directorio ACTION="directorio/mail.php" -->
<!-- para ASP, utilizar ACTION="mail.asp" -->
<!-- <FORM name = "formulario" ACTION="mail.asp" METHOD="POST" onSubmit="return validate1(this)"> -->
<FORM name = "formulario" ACTION="mail.php" METHOD="GET" onSubmit="return validate1(this)">
<!-- Los nombres de campos correo, y nombre, son obligatorios para todos los formularios -->
<font color="#000000" size="2"><b> Correo</b></font>
<input type="text" name="correo" size="52">
<BR>
<FONT color="#000000" size="2"><b>Nombre</b></FONT>
<INPUT TYPE="text" NAME="nombre" size="40">
<BR>
<!-- El resto de campos, puede tener un nombre cualquiera, mejor alguno indicativo-->
<font color="#000000" size="2"><b>Asunto</b></font>
<input type="text" name="asunto" size="52">
<!-- Puedes poner el asunto del correo, y otros campos como de tipo oculto que el usuario no ve -->
<!-- <input type="hidden" name="asunto" VALUE="Asunto que quieras poner en el mensaje"> -->
<BR>
<!-- Campo de lista de selección -->
<FONT size="2"><b>Página web</b></FONT>
<SELECT name="selectweb">
<!-- Campo seleccionado inicialmente -->
<OPTION value="Ninguna" selected>Ninguna</OPTION>
<OPTION value="Chollolinks">Chollolinks</OPTION>
<OPTION value="Eurogratis">Eurogratis</OPTION>
<OPTION value="Mycapo">Mycapo</OPTION>
<OPTION value="EBA">EBA</OPTION>
<OPTION value="Walpapers">Walpapers</OPTION>
<OPTION value="Animaciones">Animaciones</OPTION>
<OPTION value="Cholloweb">Cholloweb</OPTION>
<OPTION value="Otra">Otra</OPTION>
<!-- útil para obtener un ancho mayor para la lista de selección (toma la cadena mas grande) -->
<!-- otra alternativa es utilizar estilos css <SELECT name="selectweb" style="width:300px;"> donde px son pixeles, y 300 su ancho
o incluso puedes hacerlo mas complejo, y utiliza estilos predefinidos, pero se sale del tema estudia Cascade Style Sheets-->
<OPTION>__________________</OPTION>
</SELECT>
<BR>
<!--Campo que puede omitir, añadir, o modificar a conveniencia -->
<FONT size="2"><b>Valoracion</b></FONT>
<!-- Campo cuadro selección, permite seleccionar varios valores para este caso, no es muy apropiado, pues puede seleccionarse mas de una valoración. Está, a título ilustrativo. Sería mas correcto utilizar un grupo de opciones. Se suele usar el ejemplo de gustos en colores, frutas, ... para escoger varios gustos a la vez-->
<!-- podríamos omitir el valor, value="x ", para esta función nos basta con un nombre descriptivo ó utilizar el mismo nombre para todos los cuadros. Entonces, si que necesitamos especificar un valor -->
<B>
<!-- Inicialmente, tenemos seleccionado No sabe, no contesta-->
<INPUT name="Ns/Nc" type="checkbox" id="Ns/Nc" value="checkbox" checked> Ns/Nc
<INPUT name="v1" type="checkbox" id="v1" value="1"> 1
<INPUT name="v2" type="checkbox" id="v2" value="2"> 2
<INPUT name="v3" type="checkbox" id="v3" value="3"> 3
<INPUT name="v4" type="checkbox" id="v4" value="4"> 4
<INPUT name="v5" type="checkbox" id="v5" value="5"> 5
</B>
<BR>
<!--Campo que puede omitir, añadir, o modificar a conveniencia -->
<FONT size="2"><b>Consulta</b></FONT>
<!--Grupo de Campo Alternos. Solo permite seleccionar un estado siempre que tengan el mismo name, en este caso grupo de opciones -->
<LABEL>
<B>
<!--Inicialmente, tenemos seleccionado el valor General. Solo se envía un valor, el seleccionado-->
<INPUT type="radio" name="GrupoOpciones" value="General" checked>
General</B></LABEL>
<B>
<LABEL>
<INPUT type="radio" name="GrupoOpciones" value="Cambio Enlaces">
Cambio Enlaces</LABEL>
<LABEL>
<INPUT type="radio" name="GrupoOpciones" value="Publicidad">
Publicidad</LABEL>
</B>
<BR>
<!--Campo de líneas múltiples de 50 columnas (caracteres) y 10 filas (líneas) -->
<textarea name="mensaje" cols="50" rows="10">Contenido de tu mensaje </textarea>
<BR>
<!-- Campo oculto con la dirección de la página de gracias final-->
<!-- Permite individualizar la página final para cada formulario-->
<INPUT TYPE="hidden" NAME="pagina_gracias" VALUE="http://www.buscarportal.com/anuncios/gracias.html">
<!-- Puedes quitar variables del script, como la página de error y ponerlo como un campo oculto con el mismo nombre, pero sin $ en el caso del php. Recuerde, que php, distingue entre mayúsculas y minúsculas. -->
<!--Lo tengo así porque resulta mas sencillo. Lo importante del script, es que maneja cualquier número de campos sin modificar el script -->
<!-- Botón de enviar . Los botones siempre al final, para que los elimine nuestro script php-->
<INPUT name="submit" TYPE="submit" VALUE="Enviar">
</FORM>
Script JavaScript para el formulario
Y por último veamos el JavaScript Asociado al formulario que chequea se cubran los campos correo, nombre y contenido.
Este, habrá que modificarlo para cada formulario, según el número de campos que se quiera comprobar. Si solo se requiere chequear el nombre y correo, se puede usar para todos eliminando la línea que comprueba el campo mensaje.
<script language="JavaScript">
<!--//
// La variable form, de la función, contiene los datos del objeto formulario, y permite manipular sus propiedades.
function validate1 (form) {
// VARIABLES
// Variable para controlar si los campos estaban cumplimentados
r=1;
// TEST DE CAMPOS
// Si vale "" , se alerta, r=0, alerta al usuario y coloca el foco en el campo nombre
if (form.nombre.value==""){r=0;alert("Porfa, dime tu nombre!");form.nombre.focus};
// Comprueba si este campo de correo tiene al menos una @
if (form.correo.value.indexOf('@',0)==-1) {r=0;alert("Sin correo para responder, No te Comes Nada !");form.correo.focus};
// Para cada campo a comprobar, copiar y pegar esta línea reemplazando el nombre del campo mensaje
if (form.mensaje.value==""){r=0;alert("Me escribes ¿pero no me cuentas nada?");form.mensaje.focus};
// RETORNAR AL ENVÍO
// Si ha hay campos sin cubrir, interrumpimos el envío del correo -return false-
if (r==0) { return false; }
// Si todo está bien, te dispones a enviar el contenido del formulario al script php, -return true-
// Además, alertas al usuario para que no pulse mas veces, aún así, la gente, no se cansa.
else { alert ("con una vez es bastante gracias. Su mensaje se está procesando");return true; }
}
//---->
</script>
Nos vemos,los metiros para el mismo autor del script en php nombrado mas arriba..