Foros del Web » Programando para Internet » PHP »

Envío de adjuntos por email desde formulario

Estas en el tema de Envío de adjuntos por email desde formulario en el foro de PHP en Foros del Web. Buenas, Llevo unos días buscando por internet cómo conseguirlo, pero no hay manera... Dispongo de un código php (que funciona en phpnuke, pero que no ...
  #1 (permalink)  
Antiguo 22/01/2008, 12:12
 
Fecha de Ingreso: diciembre-2003
Mensajes: 93
Antigüedad: 20 años, 11 meses
Puntos: 1
Envío de adjuntos por email desde formulario

Buenas,

Llevo unos días buscando por internet cómo conseguirlo, pero no hay manera...

Dispongo de un código php (que funciona en phpnuke, pero que no es relevante) que envía emails sin problemas. Dentro del index.php está el propio formulario, así como el código de envío, todo en uno.

Lo que intento, es que se pueda enviar en el mismo email archivos adjuntos, pero no consigo implementar los códigos.

Aquí os dejo mi idex.php:

Código PHP:
<?php

if (!defined('MODULE_FILE')) {
    die (
"You can't access this file directly...");
}

require_once(
"mainfile.php");
$module_name basename(dirname(__FILE__));
get_lang($module_name);

define('INDEX_FILE'true);
$subject 'Nuevo Email - '._FEEDBACK;
define('NO_EDITOR'true);

include(
"header.php");

if (!isset(
$opi) OR ($opi != "ds")) {
  
$intcookie intval($cookie[0]);
  if (!empty(
$cookie[1])) {
    
$sql "SELECT name, username, user_email FROM ".$user_prefix."_users WHERE user_id='".$intcookie."'";
    
$result $db->sql_query($sql);
    
$row $db->sql_fetchrow($result);
    
$db->sql_freeresult($result);
    if (!empty(
$row['name'])) {
        
$sender_name filter($row['name'], "nohtml");
    } else {
        
$sender_name filter($row['username'], "nohtml");
    }
    
$sender_email filter($row['user_email'], "nohtml");
  } else {
    
$sender_email "";
    
$sender_name "";
  }
}

if (!isset(
$message)) { $message ""; }
if (!isset(
$opi)) { $opi ""; }
if (!isset(
$send)) { $send ""; }
title(_FEEDBACKTITLE);

// By Phosky
//info_box("note", _FEEDBACKNOTE);
OpenTable();
echo 
_FEEDBACKNOTE;
echo 
"<br>";
CloseTable();
echo 
"<br>";
// EOF By Phosky

$form_block "
    <table border=\"0\" width=\"100%\">

    <tr><td nowrap><FORM METHOD=\"post\" ACTION=\"modules.php?name=$module_name\">
    <strong>"
._YOURNAME.":</strong></td><td><INPUT type=\"text\" NAME=\"sender_name\" VALUE=\"$sender_name\" readonly style='background-color:#CCCCCC' SIZE=30></td></tr>

    <tr><td nowrap><strong>"
._YOUREMAIL.":</strong></td><td><INPUT type=\"text\" NAME=\"sender_email\" VALUE=\"$sender_email\" readonly style='background-color:#CCCCCC' SIZE=30></td></tr>

    <tr><td>&nbsp;</td></tr>

    <tr><td nowrap><strong>"
._FORMDIVISION.":</strong></td><td>
        <select name=\"select1\">
        <option selected value='0'>Elige tu división</option>
        <option value='0'>------------------------</option>
        <option>Primera División</option>
        <option>Segunda División</option>
        <option>Tercera División</option>
        </select></td></tr>

    <tr><td nowrap><strong>"
._FORMNOMWAR.":</strong></td><td><INPUT type=\"text\" NAME=\"nombre_war\" VALUE=\"$nombre_war\" SIZE=30> <i>[Clan X vs Clan Y]</i></td></tr>

    <tr><td nowrap><strong>"
._FORMFECHA.":</strong></td><td><INPUT type=\"text\" NAME=\"fecha_war\" VALUE=\"$fecha_war\" SIZE=30></td></tr>

    <tr><td nowrap><strong>"
._FORMHORA.":</strong></td><td><INPUT type=\"text\" NAME=\"hora_war\" VALUE=\"$hora_war\" SIZE=30></td></tr>



    <tr><td><strong>"
._MESSAGE.":</strong></td><td><TEXTAREA NAME=\"message\" COLS=60 ROWS=10 WRAP=virtual>$message</TEXTAREA><br>
    <i>"
._HTMLNOTALLOWED2."</i></td></tr>

    <tr><td>&nbsp;</td><td><INPUT type=\"hidden\" name=\"opi\" value=\"ds\">
    <INPUT TYPE=\"submit\" NAME=\"submit\" VALUE=\""
._SEND."\">
    </FORM></td></tr></table>
"
;

OpenTable();
if (
$_POST['opi'] != "ds") {
    echo 
$form_block;
} else {
    if (empty(
$sender_name)) {
        
$name_err "<div align=\"center\"><span class=\"option\"><b><em>"._FBENTERNAME."</em></b></span></div>";
        
$send "no";
    } 
    if (empty(
$sender_email)) {
        
$email_err "<div align=\"center\"><span class=\"option\"><b><em>"._FBENTEREMAIL."</em></b></span></div>";
        
$send "no";
    } 

// By Phosky

    
if ($select1=="0") {
        
$seleccerror1 "<div align=\"center\"><span class=\"option\"><b><em>"._ERRORSELECCION1."</em></b></span></div><br>";
        
$send "no";
    }
    if (
$select2=="0") {
        
$seleccerror2 "<div align=\"center\"><span class=\"option\"><b><em>"._ERRORSELECCION2."</em></b></span></div><br>";
        
$send "no";
    }
    if (empty(
$nombre_war)) {
        
$nomwar_err "<div align=\"center\"><span class=\"option\"><b><em>"._FBENTERNOMWAR."</em></b></span></div><br>";
        
$send "no";
    }
    if (empty(
$fecha_war)) {
        
$fechawar_err "<div align=\"center\"><span class=\"option\"><b><em>"._FBENTERFECHAWAR."</em></b></span></div><br>";
        
$send "no";
    } 
    if (empty(
$hora_war)) {
        
$horawar_err "<div align=\"center\"><span class=\"option\"><b><em>"._FBENTERHORAWAR."</em></b></span></div><br>";
        
$send "no";
    } 
// EOF By Phosky

    
if (empty($message)) {
        
$message_err "<div align=\"center\"><span class=\"option\"><b><em>"._FBENTERMESSAGE."</em></b></span></div>";
        
$send "no";
    } 
    if (
$send != "no") {
        
$sender_name removecrlf(filter($sender_name"nohtml"));
        
$sender_email removecrlf(filter($sender_email"nohtml"));

// By Phosky        
        
$nombre_war removecrlf(filter($nombre_war"nohtml"));
        
$fecha_war removecrlf(filter($fecha_war"nohtml"));
        
$hora_war removecrlf(filter($hora_war"nohtml"));

        
$message filter($message"nohtml");
        
$msg "$sitename\n\n";
        
$msg "<HTML>\n";
        
$msg .= "<BODY>\n";
        
$msg "$sitename\n\n";
        
$msg .= "<table border='0' cellspacing='5'>\n";
        
$msg .= "<tr><td align='right'><b><b>"._SENDERNAME.":</b><td align='left'>$sender_name</td></tr>\n";
        
$msg .= "<tr><td align='right'><b>"._SENDEREMAIL.":</b><td align='left'>$sender_email</td></tr>\n";
        
$msg .= "<tr><td align='right'><b>"._SENDERWAR.":</b><td align='left'>$nombre_war</td></tr>\n";
        
$msg .= "<tr><td align='right'><b>"._SENDERFECHAWAR.":</b><td align='left'>$fecha_war</td></tr>\n";
        
$msg .= "<tr><td align='right'><b>"._SENDERHORAWAR.":</b><td align='left'>$hora_war</td></tr>\n";
        
$msg .= "<tr><td align='right'><b>"._MESSAGE.":</b><td align='left'>$message</td></tr>\n";
        
$msg .= "</table>\n";
        
$msg .= "</BODY>\n";
        
$msg .= "</HTML>\n";

        if (
$select1 == "Primera División") {
        
$to "[email protected]";
        }
        else if (
$select1 == "Segunda División") {
        
$to "[email protected]";
        }
        else if  (
$select1 == "Tercera División") {
        
$to "[email protected]";
        }
// EOF By Phosky


        
$mailheaders "From: $sender_name <$sender_email>\r\n" "Reply-To: $sender_email\r\n" "Return-path: $sender_email\r\n" "MIME-Version: 1.0\n" "Content-type: text/plain; charset=iso-8859-1";

        
mail($to$subject$msg$mailheaders);
        echo 
"<p><div align=\"center\">"._FBMAILSENT."</div></p>";
        echo 
"<p><div align=\"center\">"._FBTHANKSFORCONTACT."</div></p>";
    } elseif (
$send == "no") {
        
OpenTable2();
        if (!empty(
$name_err)) { echo "$name_err"; }
        if (!empty(
$email_err)) {echo "$email_err"; }

// By Phosky        
        
if (!empty($nomwar_err)) {echo "$nomwar_err"; }
        if (!empty(
$seleccerror1)) {echo "$seleccerror1"; }
        if (!empty(
$seleccerror2)) {echo "$seleccerror2"; }
        if (!empty(
$fechawar_err)) {echo "$fechawar_err"; }
        if (!empty(
$horawar_err)) {echo "$horawar_err"; }
// EOF By Phosky        

        
if (!empty($message_err)) {echo "$message_err"; }
        
CloseTable2();
        echo 
"<br><br>";
        echo 
$form_block;
    }
}

CloseTable();
include(
"footer.php");

?>
Este php envía por email un formulario. La complicación del archivo es que mira que no haya HTML, que no estén vacíos los campos, y que al estarlos salga un error.

Lo que intento hacer ahora, es implementar un código que envíe adjuntos por email. He probado varios códigos, y lo más próximo que he estado, ha sido que se me envíen emails sin datos, aunque sí con los adjuntos.

La cuestión es que no lo termino de implementar del todo...

El php que he estado usando ha sido este:

Código PHP:
<?php
function form_mail($sPara$sAsunto$sTexto$sDe)
{
$bHayFicheros 0;
$sCabeceraTexto "";
$sAdjuntos "";

if (
$sDe)$sCabeceras "From:".$sDe."\n";
else 
$sCabeceras "";
$sCabeceras .= "MIME-version: 1.0\n";
foreach (
$_POST as $sNombre => $sValor)
$sTexto $sTexto."\n".$sNombre." = ".$sValor;

foreach (
$_FILES as $vAdjunto)
{
if (
$bHayFicheros == 0)
{
$bHayFicheros 1;
$sCabeceras .= "Content-type: multipart/mixed;";
$sCabeceras .= "boundary=\"--_Separador-de-mensajes_--\"\n";

$sCabeceraTexto "----_Separador-de-mensajes_--\n";
$sCabeceraTexto .= "Content-type: text/plain;charset=iso-8859-1\n";
$sCabeceraTexto .= "Content-transfer-encoding: 7BIT\n";

$sTexto $sCabeceraTexto.$sTexto;
}
if (
$vAdjunto["size"] > 0)
{
$sAdjuntos .= "\n\n----_Separador-de-mensajes_--\n";
$sAdjuntos .= "Content-type: ".$vAdjunto["type"].";name=\"".$vAdjunto["name"]."\"\n";;
$sAdjuntos .= "Content-Transfer-Encoding: BASE64\n";
$sAdjuntos .= "Content-disposition: attachment;filename=\"".$vAdjunto["name"]."\"\n\n";

$oFichero fopen($vAdjunto["tmp_name"], 'r');
$sContenido fread($oFicherofilesize($vAdjunto["tmp_name"]));
$sAdjuntos .= chunk_split(base64_encode($sContenido));
fclose($oFichero);
}
}

if (
$bHayFicheros)
$sTexto .= $sAdjuntos."\n\n----_Separador-de-mensajes_----\n";
return(
mail($sPara$sAsunto$sTexto$sCabeceras));
}

//cambiar aqui el email
if (form_mail("[email protected]"$_POST[asunto],
"Los datos introducidos en el formulario son:\n\n"$_POST[email]))
echo 
"Su formulario ha sido enviado con exito";
?>
El problema es que hay varias cosas (como las cabeceras, en mi caso "mailheaders", que son diferentes a mi código, y no consigo hacer que funcione.

A ver si alguien me puede ayudar, yo ya no sé qué más hacer.

Ah, sí, no quiero usar phpMailer :S

Saludos!
  #2 (permalink)  
Antiguo 22/01/2008, 12:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: Envío de adjuntos por email desde formulario

Solo cambia la linea de mail de tu archivo (casi al final) por la función form_mail que publicas en el segundo archivo.

Saludos.
  #3 (permalink)  
Antiguo 22/01/2008, 13:52
 
Fecha de Ingreso: diciembre-2003
Mensajes: 93
Antigüedad: 20 años, 11 meses
Puntos: 1
Re: Envío de adjuntos por email desde formulario

Pero entonces al enviar el formulario, todos los headers, etc. dejarán de funcionar, para usar los del 2º archivo...

Mi intención es añadir únicamente las líneas que tengan que ver con el envío de adjuntos.

[EDITO]
De todas formas, veo que el código de los adjuntos está un poco mal estructurado... ¿Alguien podría pasarme solo lo necesario para que mi archivo (el primer código) pueda añadir adjuntos? Solo me falta eso, el resto ya está todo listo, solo con añadir 4 líneas de nada, pero que desconozco. Me sobran los headers y muchas más cosas de ese código :S

Muchas gracias.

Última edición por Phosky; 22/01/2008 a las 14:07
  #4 (permalink)  
Antiguo 22/01/2008, 14:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: Envío de adjuntos por email desde formulario

Te seria mas sencillo agregar las cabeceras al segundo archivo, pasalas como un parámetro a la función form_mail y usalas para hacer el envío desde form_mail.

Saludos.
  #5 (permalink)  
Antiguo 22/01/2008, 17:57
 
Fecha de Ingreso: diciembre-2003
Mensajes: 93
Antigüedad: 20 años, 11 meses
Puntos: 1
Re: Envío de adjuntos por email desde formulario

Lo he intentado y nada, no lo consigo. Ahora me envía correos sin asunto, y en vez de un archivo, se me envía texto ilegible, con un montón de caracteres sin sentido :S

Una ayudita más por favor... :)
  #6 (permalink)  
Antiguo 28/01/2008, 09:50
 
Fecha de Ingreso: diciembre-2003
Mensajes: 93
Antigüedad: 20 años, 11 meses
Puntos: 1
Re: Envío de adjuntos por email desde formulario

¿Nadie puede implementarme solo el código responsable del envío de ficheros adjuntos por email, en el primer código? He intentado todo lo posible, pero nada...

Lo agradecería muchísimo. 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 14:14.