Introducción
Transferir ficheros de un ordenador a otro es una tarea que sucede millones
de veces a lo largo del día en Internet. Ya no es un problema compartir
un fichero entre dos ordenadores ubicados entre distintos puntos del
mundo. Los dos métodos más utilizados son el protocolo FTP y el correo
electrónico.
Los ficheros pueden ser transferidos simplemente dejándolos en algún
lugar público de nuestro servidor Web, o utilizando algún programa para
enviarlos. El protocolo FTP y el correo electrónico son programas independientes
que deben estar instalados en el servidor para poder usarse.
Son dos programas del tipo cliente / servidor. Para poder utilizar cualquiera
de los dos servicios anteriores debe conectarse a un servidor en un
ordenador remoto y enviar los datos.
FTP
Para utilizar el protocolo FTP tiene que tener habilitada la opción cuando
instale PHP. Puede utilizar FTP para enviar ficheros en un script escrito
en PHP desde alguna página Web.
Para conectar a un servidor tendrá que utilizar la siguiente función:
$conexión = f tp__connect ( "www. l u i s y f ernanda . net") ;
También puede utilizar una dirección IP para la conexión.
$conexión = ftp_connect ("12 7 . 0 . 0 . 1") ;
Nota:
La dirección IP identifica un único ordenador dentro de Internet.
La IP 127.0.0.1 apunta a nuestro propio ordenador.
El servidor FTP contiene un listado de usuarios a los que les permite la
conexión. Dependiendo del usuario que se conecte, el servidor le permitirá
descargar unos archivos u otros.
El siguiente paso es autentificarse como usuario del servidor de FTP con
la función:
ftp_login($conexión, $usuario, $clave);
Como parámetros tiene que pasar la conexión establecida anteriormente,
el usuario y la contraseña.
Advertencia:
El protocolo FTP no es seguro. El usuario y la contraseña se envían
en formato de texto y podrían ser capturados por algún programa
sniffer que se encuentre entre su ordenador y el servidor
de destino.
Como de costumbre, puede encapsular todas las funciones para hacer una
clase que permita conectar a un servidor.
<?php
class ftp
{
prívate $servídor;
prívate $usuario;
prívate $clave;
prívate $conexion;
prívate $login;
function construct($servidor,$usuario, $clave)
{
set_time_limit(0);
$this->servidor = $servidor;
$this->usuario = $usuario;
$this->clave = $clave;
$thís->conectar($this->servidor);
}
prívate function conectar($servidor)
{
$this->conexion = ftp_connect($servidor,21, 30) ;
}
prívate function loginFtp($usuario,$clave)
{
$this->login = ftp_login($this->conexion, {usuario,
$clave);
}
}
$ftp = new ftp("127.0.0.1","luis","secreto") ;
?>
Como puede ver, el método constructor utiliza la función set__time_
l i m i t () . Normalmente los script de PHP tienen un tiempo de vida determinado
en el fichero de configuración php . i n i . Este tiempo suele ser
de 30 segundos y es una protección para que, si un programa se queda bloqueado y su ejecución lleva más de ese tiempo, automáticamente quede
cancelada su ejecución.
La función s e t _ t i m e _ l i m i t () le da la posibilidad de ampliar el tiempo
de ejecución al número de segundos que indique como parámetro. Si
el argumento es un 0, el tiempo de ejecución será infinito.
La función f t p _ c o n n e c t () también puede llevar como parámetros el
puerto de conexión (por defecto es el 21) y el número de segundos que
tardará PHP en volver a intentar la conexión si el intento anterior ha sido
fallido.
Mostrar los archivos remotos
Después de conectar con el servidor de FTP, lo más usual es recuperar un
listado de ficheros que están en el servidor. La función f t p _ n l i s t ()
extrae el nombre de los archivos del directorio que pasemos como parámetro.
El resultado es un array.
public function ver($directorío = "./")
{
$this->archivos = ftp_nlist($this->conexion,$directorio);
foreach ($this->archívos as $archivo) {
echo "$archivo<br>";
}
}
Puede añadir el método anterior a la clase f t p . La función f t p _
n l í s t () utiliza la conexión almacenada en el constructor de la clase y
recibe un listado de ficheros que guarda como array en la variable
$this->archivos.
Más adelante, utilizando un bucle f o r e a c h podrá extraer todos los
nombres e imprimirlos en pantalla, como puede comprobar en la figura
18.1.
Si no es la primera vez que utiliza el protocolo FTP, sabrá que al conectar
con un servidor lo más común es que conecte en el sistema raíz, donde
encontrará los archivos y directorios que puede utilizar. La función
f t p _ c h d i r () permite cambiar de directorio dentro del sistema de ficheros.
Si en algún momento no sabe en qué directorio se encuentra, puede hacer
uso de la función f tp_pwd ( ) , que le dará la ruta completa de su
situación.
Descargar y Enviar ficheros
Puede descargar ficheros con la función f tp_get () . El siguiente ejemplo
descarga un fichero después de hacer la conexión:
ftp_get($conexión, "nuevoFichero.txt","Fichero.txt",FTP_ASCII);
El nombre nuevoFichero . t x t se corresponde con el nombre del fichero
que tendrá el archivo después de ser descargado y Fichero . t x t es el
archivo remoto que queremos descargar.
El último parámetro, FTP_ASCI I, le dice al FTP el tipo de archivo que va
a ser descargado. Los modos que puede elegir son FTP_ASCII o
FTP_BINARY. Los ficheros binarios son archivos escritos en el lenguaje
máquina como los archivos gráficos.
Además, puede enviar archivos al servidor con la función f tp_put () . El
siguiente ejemplo muestra cómo subir un archivo al servidor:
ftp_put($conexion, "nuevoFichero.txt","Fichero.txt",FTP_ASCII);
Como en el ejemplo anterior, nuevoFichero.txt será el nombre del
archivo en el servidor remoto y Fichero. t x t el archivo que vamos a
enviar. El ejemplo siguiente descarga todos los archivos con extensión PHP
en nuestro ordenador local.
public function descargaPHP($directorio = "./")
Correo electrónico
La aplicación más utilizada, sin duda, en Internet es el correo electrónico.
La explosión de Internet y la expansión de servidores gratuitos que ceden
cuentas de correo a todos los usuarios ha permitido que el crecimiento de
los e-tnail se dispare en estos últimos años.
Para lograr la comunicación a través del correo electrónico han de intervenir
numerosas piezas de un puzzle.
La mayor parte del modelo utiliza:
• Servidor TCP / IP: Se encarga de mantener activos para la conexión
diversos servicios como FTP, SMTP o POP.
• MTA (Mail Transfer Agent): Acepta correo de otros servidores SMTP
y busca una ruta para que los correos lleguen a su destino.
• Cola de correo: Recipiente donde se almacenan todos los correos entrantes
dirigidos a una persona.
• MUA (Mail User Agent): Programa muy liviano para leer el correo electrónico,
normalmente desde el servidor.
• Servidor POP / IMAP: Recibe peticiones de lecturas de correo. El servidor
chequea si hay correos nuevos y los envía al cliente.
• MLM (Mailing List Manager): Este software ayuda a enviar grandes
cantidades de correo.
Enviar correo desde PHP
Sólo existe una función para enviar correo electrónico desde PHP 5. La
función mail () devolverá un valor true si los datos son enviados correctamente.
La forma más sencilla de utilizar esta función la puede ver en el
ejemplo siguiente:
<?php
$resultado = mail (" luis'ánccextremadura . org" , "Ejemplo de
Asunto", "Cuerpo del mensaje");
if ($resultado) {
echo "Correo enviado correctamente";
} else {
echo "El correo no ha podido enviarse" ;
}
?>
El primer parámetro recibe el correo de la persona a la que quiere enviar
el mensaje. El segundo es un resumen del contenido de su carta electrónica
y, por último, el tercer parámetro es el mensaje que quiere transmitir.
Puede dividir la función en variables para que sea más sencillo de utilizar:
<?php
$correo = "luis@nccextremadura.org";
$asunto = "Ejemplo de Asunto";
$cuerpo = "Cuerpo del mensaje";
$resultado = mail($correo, $asunto, $cuerpo);
if ($resultado) {
echo "Correo enviado correctamente";
} else {
echo "El correo no ha podido enviarse";
}
?>
Hay veces que necesitará algo más de control sobre lo que quiera enviar,
o necesite enviar un correo a varias personas a la vez. Esto es posible añadiendo
cabeceras adicionales a la función mail:
<?php
$correo = "luis@nccextremadura.org";
$asunto = "Ejemplo de Asunto";
$cuerpo = "Cuerpo del mensaje";
$cabecera = "From:
fernanda@\r\nbcc:pedro@nccextremadura.org\r\nContent-type:
text/plain\r\nX-mailer: PHP/" . phpversion () ;
$resultado = mail($correo, $asunto, $cuerpo, $cabecera);
if ($resultado) {
echo "Correo enviado correctamente";
} else {
echo "El correo no ha podido enviarse";
}
La cabecera muestra cómo enviar, junto al correo, la dirección de la persona
que lo envía y una copia del mismo mensaje al correo pedro@ncc
extremadura.org. Es necesario añadir los separadores \r y \n para indicar
un salto de línea entre los parámetros de la cabecera.
Las cabeceras adicionales pueden añadir muchos tipos de información,
entre los que se encuentran:
• El nombre del emisor.
• Correo del emisor.
• Correo de respuesta.
• X-mailer y número de versión.
• versión MIME.
• Content-type.
• Codificación.
• Campo de copia y copia oculta.
La función mail () está preparada para emitir mensajes sencillos, pero
hay muchas características que debe implementar con cabeceras. Por eso,
han nacido una serie de librerías, escritas en PHP, que facilitan el envío
de correos.
La librería PHPMailer añade a la función mail () muchas funcionalidades,
como ficheros adjuntos o correos HTML.
PHPMailer
PHPMailer está basado en programación orientada a objetos. Contiene
varios ficheros que deben guardarse en el directorio de PHP dedicado a
librerías o en nuestro espacio de trabajo.
La construcción más básica es la siguiente:
<?php
require_once("phpmailer/class.phpmailer.php");
$correo = new phpmailer() ;
//Datos personales del emisor
$mail->From = "luis@nccextremadura.org";
$mail->FromName = "Luis Miguel Cabezas";
$mail->Subject = "Mensaje de prueba";
$mail->Body = "Cuerpo del mensaje";
//Dirección de destino
$mail->AddAddress("zeevSphp.zend.com","Zeev Suraski");
if ( l$mail->Send()) {
echo "Correo enviado correctamente";
} else {
echo "El correo no ha podido enviarse";
}
?>
Como puede ver, las propiedades de la clase p h p m a i l e r son auto explicativas.
El ejemplo va asociando cada propiedad a un dato necesario para
el envío. El método AddAddress () añade una dirección de correo a la
que enviar el mensaje y Send () lo envía a través de Internet.
Añadir un fichero adjunto
Existen tres métodos para añadir un fichero adjunto a un mensaje: dos
para archivos y otro más específico para imágenes:
• AddAttachment(ruta, nombre): Añade un fichero localizado en el
servidor. Este archivo se puede subir antes al servidor mediante un
formulario.
• AddStringAttachment(caracteres, fichero): Se puede utilizar para
enviar ficheros almacenados en variables.
• AddEmbeddedImage(ruta, cid, nombre): Añade una imagen y permite
añadirla al cuerpo de un correo HTML.
Las líneas siguientes se pueden añadir al ejemplo anterior para enviar un
fotografía almacenada en el servidor.
if (!$mail->AddAttachment("abuelo.jpg","abuelo.jpg")) {
echo "Falló al añadir un fichero adjunto";
}
Para demostrar la teoría anterior vamos a crear un pequeño formulario
que permita enviar correo. Es un código muy sencillo, pero permite enviar
mensajes escritos en HTML e incluir imágenes.
<?php
if (isset($_POST["nombre"])) {
require_once("phpmailer/class.phpmailer.php");
$correo = new phpmailer() ;
//Datos personales del emisor
$mail->From = "luis@nccextremadura.org";
$mail->Fxow£!aw>e = ""Luis Miguel Cabezas" ;
$mail->Subject = $_POST [ "asunte?" ] ;
$mail->Body = $_POST["mensaje"];
//Dirección de destino
$mail->AddAddress($_POST["nombre"],$_POST["correo"]);
if (!$mail->AddEmbeddedImage('$_FILES["imagen"]
["tmp_name"' , '12 34 5', 'imagen')) {
echo "Falló al añadir un fichero adjunto";
}
if ( !$mail->Send() ) {
echo "Correo enviado correctamente";
} else {
echo "El correo no ha podido enviarse";
}
}
?>
<html>
<body>
<form action="mail.php" method="post" enctype="multipart/formdata"
name="forml">
<table width="50%" border="0" cellspacing="0"
cellpadding="O">
<tr>
<td width="28%">Nombre:</td>
<td width="72%"xinput name="nombre" type="text"
id="nombre"></td>
</tr>
<tr>
<td>Correo:</td>
<tdxinput name="correo" type="text" id="correo"></td>
</tr>
<tr>
<td>Asunto:</td>
<tdxinput name="asunto" type="text" id= "asunto"></td>
</tr>
<tr>
<td>Mensaje:</td>
<tdxtextarea name= "mensa j e " rowS="5" id= "mensa j e " ></
textareax/td>
</tr>
<tr>
<td>Selecciona imagen: </td>
<tdxinput name="imagen" type="file" id=" imagen" x/td>
</tr>
</table>
<p>
<input type="submit" name="Submit" value="Enviar">
</P>
< /form>
</body>
</html>
Resumen
PHP se ha promovido tanto debido a las numerosas extensiones que permiten
hacer casi cualquier cosa. En concreto, las dos formas vistas para
conectarse con un servidor le serán muy útiles para ofrecer servicios innovadores
a sus usiiarios.
La mayoría de los portales Web que necesitan el registro de sus usuarios
envían por correo electrónico las contraseñas y los datos de inscripción.
La función mail () le puede servir para hacer sus pequeños controles de
usuarios.
Si se siente más ambicioso, también puede utilizar PHPMailer para construir
una página Web que permita enviar o recibir correo electrónico. La
recomendación es que continúe investigando en la clase PHPMailer y en
todo lo que ofrece que no hemos podido ver en este capítulo. |