Foros del Web » Programando para Internet » PHP »

Enviar mail con archivo adjunto con php Mailer

Estas en el tema de Enviar mail con archivo adjunto con php Mailer en el foro de PHP en Foros del Web. Estoy intentando enviar un email a un correo determinado, con archivo adjunto para el cual uso la clase phpMailer que tanto se ha comentado: El ...
  #1 (permalink)  
Antiguo 17/01/2005, 22:14
 
Fecha de Ingreso: agosto-2004
Mensajes: 27
Antigüedad: 13 años, 3 meses
Puntos: 0
Enviar mail con archivo adjunto con php Mailer

Estoy intentando enviar un email a un correo determinado, con archivo adjunto para el cual uso la clase phpMailer que tanto se ha comentado:
El script es así:

<?
//Es necesario que al menos haya algun dato solicitado
$error="";

if ($enviar) {
if ((!$nickname) && (!$suemail)) {
$error.="Debe completar alguno de los datos solicitados";
}
}

if ($enviar && !$error) {

//creamos un array que estará formado por los datos a ingresar
if ($nickname) {
$direcciones["dato1"]=$nickname;
}
if ($suemail) {
$direcciones["dato2"]=$suemail;
}


//pasamos a enviar el correo

// primero hay que incluir la clase phpmailer para poder instanciar
//un objeto de la misma
require "includes/class.phpmailer.php";

//instanciamos un objeto de la clase phpmailer al que llamamos
//por ejemplo mail
$mail = new phpmailer();

//Definimos las propiedades y llamamos a los métodos
//correspondientes del objeto mail

//Con PluginDir le indicamos a la clase phpmailer donde se
//encuentra la clase smtp que como he comentado al principio de
//este ejemplo va a estar en el subdirectorio includes
$mail->PluginDir = "includes/";

//Con la propiedad Mailer le indicamos que vamos a usar un
//servidor smtp
$mail->Mailer = "smtp";

//Asignamos a Host el nombre de nuestro servidor smtp
$mail->Host = "smtp.miservidor.com";

//Le indicamos que el servidor smtp requiere autenticación
$mail->SMTPAuth = true;

//Le decimos cual es nuestro nombre de usuario y password
$mail->Username = "[email protected]";
$mail->Password = "mipassword";

//Indicamos cual es nuestra dirección de correo y el nombre que
//queremos que vea el usuario que lee nuestro correo
$mail->From = "[email protected]";
$mail->FromName = "Mi Nombre";

//Asignamos asunto y cuerpo del mensaje
$mail->Subject = "Asunto";
$mail->Body = "Titulo";
$mail->Body .= "Nombre: " . $HTTP_POST_VARS["nickname"] . "\n";
$mail->Body .= "Email: " . $HTTP_POST_VARS["suemail"] . "\n";
//el valor por defecto 10 de Timeout es un poco escaso dado que voy a usar
//una cuenta gratuita y voy a usar attachments, por tanto lo pongo a 120
$mail->Timeout=120;

//Indicamos el fichero a adjuntar si el usuario seleccionó uno en el formulario
if ($achivo !="none") {
$mail->AddAttachment($archivo,$archivo_name);
}

//Indicamos cual es la dirección de destino del correo
$mail->AddAddress("[email protected]");

//se envia el mensaje, si no ha habido problemas la variable $success
//tendra el valor true
$exito = $mail->Send();

//Si el mensaje no ha podido ser enviado se realizaran 4 intentos mas
//como mucho para intentar enviar el mensaje, cada intento se hara 5 s
//segundos despues del anterior, para ello se usa la funcion sleep
$intentos=1;
while((!$exito)&&($intentos<5)&&($mail->ErrorInfo!="SMTP Error: Data not accepted")){
sleep(5);
//echo $mail->ErrorInfo;
$exito = $mail->Send();
$intentos=$intentos+1;
}

//La clase phpmailer tiene un pequeño bug y es que cuando envia un mail con
//attachment la variable ErrorInfo adquiere el valor Data not accepted, dicho
//valor no debe confundirnos ya que el mensaje ha sido enviado correctamente
if ($mail->ErrorInfo=="SMTP Error: Data not accepted") {
$exito=true;
}

if(!$exito)
{
echo "Problemas enviando correo electrónico a ".$valor;
echo "<br/>".$mail->ErrorInfo;
}
else
{
//Mostramos un mensaje indicando las direccion de
//destino y fichero adjunto enviado en el mensaje
$mensaje="<p>Hemos recibido sus datos y los procesaremos a la brevedad<br/>";
if ($archivo !="none") {
$mensaje.="Con su fichero adjunto".$archivo_name;
}
$mensaje.="</p>";
echo $mensaje;


}

echo "<a href='$PHP_SELF'> VOLVER AL FORMULARIO</a>";
}
else {
?>

<HTML>

<BODY>
<? If ($error) echo "<font color='red'>$error</font>";?>
<FORM ENCTYPE="multipart/form-data" METHOD="post" ACTION="<?=$PHP_SELF?>">
<TABLE BORDER=0 ALIGN="CENTER">
<TR>
<TD>Ingrese su nombre:</TD>
<TD><INPUT TYPE="text" NAME="nickname" MAXLENGTH="30" SIZE="35"></TD>
</TR>
<TD>Ingrese su direcci&oacute;n de email:</TD>
<TD><INPUT TYPE="text" NAME="suemail" MAXLENGTH="35" SIZE="35"></TD>
</TR>
<TD>Adjuntar fichero:</TD>
<input type="hidden" name="MAX_FILE_SIZE" value="307200">
<TD><INPUT TYPE="file" NAME="archivo" SIZE="35"></TD>
</TR>
<TR>
<TD COLSPAN="2" ALIGN="CENTER"><INPUT TYPE="submit" VALUE="Enviar" name="enviar"></TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
<?
}
?>

El problema es que cuando lo uso con el servidor local funciona bien, pero cuando lo quiero ejecutar desde la página web no me adjunta el archivo.
Debo configurar de alguna forma el include class.phpmailer.php o qué estoy haciendo mal?

Última edición por cherubene; 17/01/2005 a las 22:17 Razón: Tenía un error
  #2 (permalink)  
Antiguo 18/01/2005, 06:25
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Y tu estás seguro que tu archivo sube a tu servidor correctamente desde tu formulario?

En principio se vé que tienes un lio con el tratamiento de tus variables externas como las del "archivo" en si .. En unos puntos usas $HTTP_POST_VARS . .en otros lo haces como gloabl $archivo_name ... Si usas un servidor con configuración (php.ini o ver en un phpinfo()) tipo register_globals a OFF .. no te va a funcionar tu código (por lo menos la parte del upload del archivo en si).. de hecho así es inseguro de por sí.

Debes usar los arrays $_FILES para trabajar con tus archivos (y los $_POST, $_GET .. etc donde correspondan).

Corrige esos problemas y luego pruebalo denuevo.

Si observas un error . .indicalo textualmente en tu pregunta .. y sobre todo explica concretamente que es "no me funciona" .. envia el e-mail? .. pero sin el archivo adjunto? .. o que es lo que realmente hace tu script.

Un saludo,

Última edición por Cluster; 18/01/2005 a las 06:26
  #3 (permalink)  
Antiguo 18/01/2005, 16:58
 
Fecha de Ingreso: agosto-2004
Mensajes: 27
Antigüedad: 13 años, 3 meses
Puntos: 0
Espero ser más claro:
Si subo el archivo desde mi servidor local llega bien tanto el mail como el archivo adjunto.
Cuando cargo el script en el servidor de la página web el mail llega pero sin el fichero adjunto.
Estoy utilizando el mismo smtp en ambos casos, es decir no modifico nada ni el script ni los includes.
  #4 (permalink)  
Antiguo 19/01/2005, 07:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Ok, pero ya te he comentado que tienes un gran lio con el tratamiento de tus varaibles .. sobre todo la del "file" .. ¿seguistes la propuesta que te hice de usar $_FILES? .. revisastes que estado tiene la directiva: register_globals de tu servidor?

Un saludo,
  #5 (permalink)  
Antiguo 20/01/2005, 08:26
 
Fecha de Ingreso: agosto-2004
Mensajes: 27
Antigüedad: 13 años, 3 meses
Puntos: 0
Hice algunos cambios y funciona perfectamente; lo que me falta es una vez enviado el archivo (que subió a la carpeta "probeta") poder borrarlo. No sé como usar unlink() ni donde ponerlo.

Este el el formulario:
<form action="subearchivos.php" method="post" enctype="multipart/form-data">
<b>Campo de tipo texto:</b>
<br>
<input type="text" name="cadenatexto" size="20" maxlength="100">
<input type="hidden" name="MAX_FILE_SIZE" value="100000">
<br>
<strong>Tu nombre:</strong><br>
<INPUT NAME="nick" TYPE="text" id="nick" SIZE="35" MAXLENGTH="35">
<br>
<strong>Tu correo:</strong><br>
<INPUT NAME="tucorreo" TYPE="text" id="tucorreo" SIZE="35" MAXLENGTH="35">
<br>
<b>Enviar un nuevo archivo: </b>
<br>
<input name="userfile" type="file">
<br>
<input type="submit" value="Enviar">
</form>

Y subo y mando el archivo con subearchivos.php:


<?
//subo el archivo
//datos del archivo
$directorio = "probeta/";
$fichero = $HTTP_POST_FILES['userfile']['name'];
$nombre_archivo = $directorio . $fichero;
$tipo_archivo = $HTTP_POST_FILES['userfile']['type'];
$tamano_archivo = $HTTP_POST_FILES['userfile']['size'];
//compruebo si las características del archivo son las que deseo
if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg")) && ($tamano_archivo < 100000))) {
echo "La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb máximo.</td></tr></table>";
}else{
if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'],$nombre_archivo)){
echo "El archivo ha sido cargado correctamente.";
}else{
echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
}
}


?>
<?
//pasamos a enviar el correo
require "includes/class.phpmailer.php";
$mail = new phpmailer();
$mail->PluginDir = "includes/";
$mail->Mailer = "smtp";
$mail->Host = "smtp.miservidor.com";
$mail->SMTPAuth = true;

$mail->Username = "[email protected]";
$mail->Password = "mipassword";
$mail->From = "[email protected]";
$mail->FromName = "Bolsa de Trabajo";

//Asignamos asunto y cuerpo del mensaje
$mail->Subject = "Curriculum Vitae";
$mail->Body = "El curriculum adjunto pertenece a: \n";
$mail->Body .= "Nombre: ". $nick . "\n";
$mail->Body .= "Direccion de correo: ". $tucorreo . "\n";
$mail->Timeout=120;

//Indicamos el fichero a adjuntar si el usuario seleccionó uno en el formulario
if ($archivo !="none") {
$mail->AddAttachment($nombre_archivo,$nombre_archivo);
}

//Indicamos cuales son las direcciones de destino del correo y enviamos
//el mensaje
$mail->AddAddress("[email protected]");
//se envia el mensaje, si no ha habido problemas la variable $success
//tendra el valor true
$exito = $mail->Send();

//Si el mensaje no ha podido ser enviado se realizaran 4 intentos mas
//como mucho para intentar enviar el mensaje, cada intento se hara 5 s
//segundos despues del anterior, para ello se usa la funcion sleep
$intentos=1;
while((!$exito)&&($intentos<5)&&($mail->ErrorInfo!="SMTP Error: Data not accepted")){
sleep(5);
//echo $mail->ErrorInfo;
$exito = $mail->Send();
$intentos=$intentos+1;
}

//La clase phpmailer tiene un pequeño bug y es que cuando envia un mail con
//attachment la variable ErrorInfo adquiere el valor Data not accepted, dicho
//valor no debe confundirnos ya que el mensaje ha sido enviado correctamente
if ($mail->ErrorInfo=="SMTP Error: Data not accepted") {
$exito=true;
}

if(!$exito)
{
echo "Problemas enviando correo electrónico a ".$valor;
echo "<br/>".$mail->ErrorInfo;
}
else
{
//Mostramos un mensaje indicando las direccion de
//destino y fichero adjunto enviado en el mensaje
$mensaje="<p>Has enviado un mensaje a Bolsa de Trabajo:<br/>";
$mensaje.=$valor." ";
if ($archivo !="none") {
$mensaje.="Con un archivo adjunto llamado ".$nombre_archivo;
}
$mensaje.="</p>";
echo $mensaje;
}

?>
  #6 (permalink)  
Antiguo 20/01/2005, 08:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En principio .. podrías probar a tomar tu archivo para adjuntarlo en el e-mail de:

$HTTP_POST_FILES['userfile']['tmp_name'],

que es donde queda temporalmente cuando lo subes.

Código PHP:
$mail->AddAttachment($HTTP_POST_FILES['userfile']['tmp_name'],$HTTP_POST_FILES['userfile']['name']); 
(no sé el orden de addattachment() ahora .. pero donde diga la ruta del archivo . .usa "tmp_name" .. el otro parámetro es el nombre que le vas a dar cuando llegue por e-mail .. )

Si eso te dá problemas de seguridad (de permisos de acceso al archivo) .. sigue como lo haces actualmente (que por otro lado sería lo más standard y seguro).

Si quieres usar unlink() .. fijate bien que en:
$nombre_archivo

tienes el nombre de tu archivo y ruta .. pues es ahí donde lo usas para "moverlo" con la función move_uploaded_file() .. así que eso es lo que debes usar al final de tu script (tras enviado tu e-mail ..)

Código PHP:
unlink($nombre_archivo); 
Un saludo,

Última edición por Cluster; 20/01/2005 a las 08:40
  #7 (permalink)  
Antiguo 20/01/2005, 09:47
 
Fecha de Ingreso: agosto-2004
Mensajes: 27
Antigüedad: 13 años, 3 meses
Puntos: 0
Gracias Cluster funciona 10 puntos.
  #8 (permalink)  
Antiguo 26/01/2005, 06:34
 
Fecha de Ingreso: agosto-2004
Mensajes: 27
Antigüedad: 13 años, 3 meses
Puntos: 0
Para quienes me pidieron el código final del script para subir archivos, ahí va:

El formulario formulario.php

<html>
<link rel="STYLESHEET" type="text/css" href="estilo.css">
<font size="5"><strong>ENVIENOS SU FOTO<br>
<font size="1">Por favor complete sus datos y adjunte su FOTO.</font></strong></font>
<form action="subearchivo.php" method="post" enctype="multipart/form-data">
<br>
<font size="1">Tu nombre:</font><br>
<INPUT NAME="nick" TYPE="text" id="nick" SIZE="35" MAXLENGTH="35">
<br>
<font size="1">Tu direcci&oacute;n de correo:</font><br>
<INPUT NAME="tucorreo" TYPE="text" id="tucorreo" SIZE="35" MAXLENGTH="35">
<br>
<font size="1">Enviar archivo: </font><br>
<input name="userfile" type="file">
<br>
<input type="submit" value="Enviar">
</form>
<p><font size="1">(*) Datos obligatorios.<br>
Su foto debe tener extension jpg, jpeg &oacute; gif.</font><font size="1"><br>
Sólo se permiten archivos 100kb de tamaño máximo.</font></p>
</html>


A continuación: el script subearchivo.php

<?
if(trim($nick != "") && trim($tucorreo != ""))
{
//subo el archivo
//datos del archivo, "probeta"es el directorio donde se alojará temporalmente el archivo
$directorio = "probeta/";
$fichero = $HTTP_POST_FILES['userfile']['name'];
$nombre_archivo = $directorio . $fichero;
$tipo_archivo = $HTTP_POST_FILES['userfile']['type'];
$tamano_archivo = $HTTP_POST_FILES['userfile']['size'];
//compruebo si las características del archivo son las que deseo
if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg")) && ($tamano_archivo < 100000))) {
echo "La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb máximo.</td></tr></table>";
}else{
if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'],$nombre_archivo)){
echo "El archivo ha sido cargado correctamente.";


//pasamos a enviar el correo
require "includes/class.phpmailer.php";
$mail = new phpmailer();
$mail->PluginDir = "includes/";
$mail->Mailer = "smtp";
// el siguiente es dato del servidor
$mail->Host = "smtp.miservidor.com";
//Le indicamos que el servidor smtp requiere autenticación si no requiere borramos la siguiente línea
$mail->SMTPAuth = true;
//Le decimos cual es nuestro nombre de usuario y password del correo que envia el email
$mail->Username = "[email protected]";
$mail->Password = "mipassword";
//Indicamos cual es nuestra dirección de correo y el nombre que
//queremos que vea el usuario que lee nuestro correo
$mail->From = "[email protected]";

$mail->FromName = "Fotos Locas";

//Asignamos asunto y cuerpo del mensaje
$mail->Subject = "Hemos recibido tu foto";
$mail->Body = "Esta foto pertenece a: \n";
$mail->Body .= "Nombre: ". $nick . "\n";
$mail->Body .= "Direccion de correo: ". $tucorreo . "\n";
$mail->Timeout=120;

//Indicamos el fichero a adjuntar si el usuario seleccionó uno en el formulario
if ($archivo !="none") {
$mail->AddAttachment($nombre_archivo,$fichero);
}

//Indicamos cuales son las direcciones de destino del correo y enviamos
//el mensaje
$mail->AddAddress("[email protected]");
//se envia el mensaje, si no ha habido problemas la variable $success
//tendra el valor true
$exito = $mail->Send();

//Si el mensaje no ha podido ser enviado se realizaran 4 intentos mas
//como mucho para intentar enviar el mensaje, cada intento se hara 5 s
//segundos despues del anterior, para ello se usa la funcion sleep
$intentos=1;
while((!$exito)&&($intentos<5)&&($mail->ErrorInfo!="SMTP Error: Data not accepted")){
sleep(5);
//echo $mail->ErrorInfo;
$exito = $mail->Send();
$intentos=$intentos+1;
}


//borramos el archivo del directorio "probeta"
unlink($nombre_archivo);
//La clase phpmailer tiene un pequeño bug y es que cuando envia un mail con
//attachment la variable ErrorInfo adquiere el valor Data not accepted, dicho
//valor no debe confundirnos ya que el mensaje ha sido enviado correctamente
if ($mail->ErrorInfo=="SMTP Error: Data not accepted") {
$exito=true;
}

if(!$exito)
{
echo "Problemas enviando correo electrónico a ".$valor;
echo "<br/>".$mail->ErrorInfo;
}
else
{
//Mostramos un mensaje indicando las direccion de
//destino y fichero adjunto enviado en el mensaje
$mensaje="<p>Has enviado un mensaje a Fotos Locas:<br/>";
$mensaje.=$valor." ";
if ($archivo !="none") {
$mensaje.="Con un archivo adjunto llamado ".$fichero;
}
$mensaje.="</p>";
echo $mensaje;
}
}else{
echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
}

}
}
else{
echo "ERROR. Por favor, complete los DATOS OBLIGATORIOS <br>";
echo "<a href='formulario.php'> VOLVER AL FORMULARIO</a>";
}
?>

Espero que les sirva. Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:50.