Enviar un correo electrónico
Información general
Un sitio interactivo a menudo necesita enviar correos electrónicos a los usuarios, por ejemplo, para confirmar una compra, un registro o enviar un boletín de noticias.
La función mail, propuesta por PHP, permite responder de manera simple a este tipo de necesidad. En esta sección se explica cómo utilizar esta función; en primer lugar, para enviar mensajes de texto (sin datos adjuntos) y, a continuación, para enviar mensajes en formato MIME (Multipurpose Internet Mail Extensions).
Además, PHP ofrece una biblioteca potente, pero más compleja de usar, para gestionar mensajes mediante el protocolo IMAP (Internet Message Access Protocol). Esta biblioteca no se tratará en este libro, ya que no es esencial para satisfacer las necesidades descritas anteriormente.
Enviar un mensaje de texto sin archivos adjuntos
La función mail permite enviar un mensaje de correo electrónico.
Sintaxis
booleano mail(cadena destinatario, cadena objeto, cadena mensaje
[, cadena encabezado])
destinatario |
Dirección de correo electrónico del destinatario. Es posible especificar varios destinatarios separados con comas. |
objeto |
Asunto del mensaje. |
mensaje |
Texto del mensaje. |
encabezado |
Encabezados adicionales, en forma de cadena de caracteres o de una tabla. |
La función mail envía el mensaje caracterizado por los diferentes parámetros a un servidor de correo definido por las directivas de configuración siguientes:
Win32 |
SMTP |
Dirección del servidor SMTP (Simple Mail Transfer Protocol) al cual enviar el mensaje. Ejemplo: smtp.wanadoo.es |
sendmail_from |
Dirección de correo electrónico del remitente. Ejemplo: webmaster@misitio.com Esta directiva debe estar presente, incluso aunque esté vacía. |
|
Unix |
sendmail_path |
Ruta de acceso al ejecutable del servidor de correo (puede incluir parámetros). Ejemplo: sendmail -t -i |
La función mail devuelve TRUE si el mensaje se ha podido enviar al servidor (lo cual no garantiza que este último haya podido enviarlo con éxito) y FALSE en caso contrario. No hay manera de saber si el mensaje ha sido enviado con éxito; esta verificación debe llevarse a cabo fuera de PHP.
El cuarto parámetro permite especificar información adicional que se envía en el encabezado del mensaje (From, Reply-To, etc.). El caso de utilizar una cadena de caracteres, la...
Enviar un mensaje en formato MIME
1. Preámbulo
En esta sección vamos a explicar cómo enviar mensajes con formato MIME, o más generalmente en formato Multipart MIME.
El formato MIME permite enviar un mensaje con un formato diferente al de texto: HTML, imágenes...
El formato Multipart MIME permite enviar un mensaje compuesto de varias partes, cada una con un formato diferente (texto más una imagen, por ejemplo) y una de las "partes" puede ser un archivo adjunto.
El objetivo de este punto, sin entrar en detalles sobre el formato MIME (se puede encontrar más información en los numerosos RFC que tratan este tema), es mostrar concretamente cómo proceder en dos casos típicos, el envío de un mensaje en formato HTML y el envío de un mensaje con datos adjuntos.
2. Mensaje en formato HTML
El caso del envío de un mensaje en formato HTML permite ilustrar el uso del formato MIME simple.
Ejemplo (fuente de un mensaje MIME en formato HTML)
From: "Olivier" <olivier@diane.com>
To: "Xavier" <xavier@zeus.es>
Subject: ¡Hola!
Date: Mon, 10 Sep 2001 09:24:13 -0100
Message-ID: <3b9c6a403d9f000b@hermes.diane.com>
MIME-Version: 1.0
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 8bit
<html>
<head><title>¡Hola!</title></head>
<body>
<font color="green">¡Hola!</font>
</body>
</html>
Un mensaje MIME simple incluye los encabezados estándar de un mensaje; a continuación, tres líneas de encabezados adicionales (en negrita) que indican que el mensaje está en formato MIME y, finalmente, el cuerpo del mensaje propiamente dicho.
Las tres líneas de encabezados adicionales son las siguientes:
MIME-Version |
Indica que el mensaje está en formato MIME y especifica la versión. |
Content-Type |
Indica el tipo MIME del contenido. |
Content-Transfer-Encoding |
Indica el tipo de cifrado. |
Algunos tipos MIME habituales:
text/plain |
Texto simple. El juego de caracteres utilizado se puede especificar con la opción charset (por ejemplo, iso-8859-1 o UTF-8). |
text/html |
Documento en formato HTML El juego de caracteres utilizado se puede especificar con la opción charset (por ejemplo, iso-8859-1 o UTF-8). |
image/jpeg... |
Ejercicio 15: enviar un correo electrónico
En este ejercicio, vamos a crear un formulario que permita enviar un mensaje electrónico.
Indicaciones:
-
En un nuevo directorio, cree un nuevo script PHP mail.php. En este nuevo script, rellene el código HTML que permita mostrar una página HTML llamada «Nuevo mensaje», conteniendo un formulario con el siguiente aspecto:
![images/20.png](https://www.eni-training.com/download/74e1440d-6b0e-4af9-a157-0d3a7851889f/images/20.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
-
Los campos «A», «De» y «Asunto» son de tipo texto, con un tamaño de 40, y se llaman respectivamente a, de y asunto (atributo name). El campo «Texto» es de tipo textArea, de tamaño 20 líneas y 80 columnas y se llama texto (atributo name). El botón «Enviar» se llama ok (atributo name). La alineación de los campos se obtiene gracias a la utilización del código CSS aplicado a las etiquetas <label> (el diseño del formulario es secundario en la realización de este ejercicio).
-
Este formulario se tratará por el script PHP mail.php.
-
Al inicio del script, inserte una sección de código PHP que compruebe si el script se llama durante el tratamiento del formulario; si es el caso:
-
Recupere el contenido de los campos en las variables.
-
Defina una variable de tipo tabla que va a contener los encabezados adicionales enviados en el mensaje.
-
Envíe el mensaje.
Ejemplo
<?php
// Tratamiento del formulario.
if (isset($_POST['ok']))...