Problema con php mail

Publicado por cazador, Marzo 28, 2007, 13:08:13

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Camello_AR

El tema es que hoy viajo y no vuelvo a la Internet hasta el miercoles, así que tengo que buscar primero si esta en un CD o que y despues pasarlo aca

cazador

todo bien came, cuando puedas, de verdad, no hay drama, espero, si hasta ahora anduvo todo ok, unos dias mas puede esperar.
otra ves gracias  :up:

4kstore

interesante lo tuyo cam !!! yo tmb quiero probar eso (Y)!



Camello_AR

#18
Para los que lo pidieron aca va

(aviso modifique la parte de copyrigth poruqe tiene mi nombre personal y un mail viejo)

<?php
/*
* Class smtp_sender 
*
* (c) Camello_AR <camello.ar@gmail.com>
* Una simple clase con motor SMTP propio (una alternativa para el comando mail)
*
* Uso:
* $smtp = new smtp_sender;
* $smtp->from[name] = nombre del sender (si vacio = direccion)
* $smtp->from[dir] = direccion del sender
* $smtp->smtp_add_rcpt(dir, name, type) = a quien se envia el correo (type = 0-to, 1-cc, 2-bcc)
* $smtp->reply_to[dir][name] = direccion y nombre de respuesta (si estan vacios los toma del from)
* $smtp->server = servidor en forma IP (sino poner = gethostbyname("nombre servidor")
* $smtp->helo = nombre del host que ejecuta esta apliación
* $smtp->asunto = Asunto del Mensaje
* $smtp->body = cuerpo del mensaje (debe ser final)
* $smtp->smtp_send();
*
* TODO:
* - Mejorar el sistema de errores (estoy en eso) para armar arrays de errores 
* - Agregar un codificador para el body_gen() asi se pueden agregar archivos attach
*   Se puede usar como base la parte relativa al decodificador en la parte visor de mails
*/

Class Smtp_Sender {

    var 
$helo;
    var 
$server;
    var 
$from;
    var 
$rcpt;
    var 
$asunto;
    var 
$mail//smtp_body_gen()
    
var $body;
    var 
$socket;
    var 
$reply_to;
    var 
$rec_tot ;
    var 
$error 0;
    var 
$errores;

//$rcpt = [name] [dir] (si name vacio = dir)
//$from = [name] [dir] (si name vacio = dir)
//$reply_to = [name] [dir] (si dir vacia=$from si name vacio = dir)

/*
  Conectar Al Servidor SMTP y enviar el Mensaje
*/

    
function smtp_send() {
        
$this->errores[totales] = 0;
        
$this->socket socket_create(AF_INETSOCK_STREAMgetprotobyname("TCP"));
        if (!
$this->socket) {
            echo 
"No se abrio el socket por: ".socket_strerror($this->socket)."<br>\n";
        } else {
            
$conexion socket_connect($this->socket$this->server25);
            
$this->smtp_body_gen();
            
// var_dump($this->rcpt);
            
$this->smtp_comando("""220""No se consiguio realizar conexión con el servidor {this->server}");
            
$this->smtp_comando("HELO {$this->helo}\n""250""No se reconocio la sentencia {$this->helo} como bienvenida");
            
$this->smtp_comando("MAIL FROM: {$this->from[dir]}\n""250""El remitente ".$this->from[dir]." no fue reconocido");
            
$totales $this->rec_tot;
            for (
$i 0$i<$totales$i++) {
                
$this->smtp_comando("RCPT TO: ".$this->rcpt[dir][$i]."\n""250""El recipiente ".$this->rcpt[dir][$i]." no fue reconocido"1$i);
            }
            
$this->smtp_comando("DATA\n""354""No se puede escribir el cuerpo, no hay recipientes");
            
$this->smtp_comando("{$this->mail}\n""data""No esta listo para aceptar el correo");
            
$this->smtp_comando("\r\n.\r\n""250""");
            
$this->smtp_comando("QUIT\n""data""No se termino el cuerpo del correo");
            
socket_close($this->socket);
         }
    }

/* 
  Funcion smtp_comando
  Lee las respuestas del servidor y escribe la información despues
*/

    
function smtp_comando($buffer$cod$action$tipo 0$orden 0) {
        if (!
$this->socket) {
            echo 
"Se perdio la conexión con el servidor {$this->server}";
        } else {
            if (
$this->error == 0) {
                
//echo $buffer;
                
socket_write($this->socket$bufferstrlen($buffer));
                if (
$cod!="data") {
                    
$buf socket_read($this->socket128);
                    
//$this->rcpt[error][$orden] = "0";
                    
if (substr($buf,0,3)!=$cod) {
                        
$this->errores[totales] = $this->errores[totales] +1;
                        
$errnum $this->errores[totales];
                        
$this->errores[$errnum] = $action;
                        
//echo $action;
                        
if ($tipo == 0) {
                            
$this->error 1;
                        } else {
                            
$this->rcpt[error][$orden] = "1";
                        }
                    }
                }
            }
        }
    }

/* 
  Funcion smtp_body_gen
  Genera el Cuerpo del Mensaje con el subject, el x-origen-ip, el from, el to, etc
*/

    
function smtp_body_gen() {
        if (!
$this->from[name]) {
            
$this->from[name] = $this->from[dir];
        }
        if (!
$this->reply_to[dir]) {
            
$this->reply_to[dir] = $this->from[dir];
        }
        if (!
$this->reply_to[name]) {
            
$this->reply_to[name] = $this->from[name];
        }
        
$h_from "{$this->from[name]} <{$this->from[dir]}>";
        
$totales $this->rec_tot;
for ($i 0$i<$totales$i++) {
            if (
$this->rcpt[type][$i]==0) {
                
$dire $this->rcpt[dir][$i];
                
$nam $this->rcpt[name][$i];
                
$h_to .= $nam." <".$dire.">, ";
            } else if (
$this->rcpt[type][$i]==1) {
                
$dire $this->rcpt[dir][$i];
                
$nam $this->rcpt[name][$i];
                
$h_cc .= $nam." <".$dire.">, ";
            }
        }
        
$h_to substr($h_to0strlen($h_to)-2);
        
$h_cc substr($h_cc0strlen($h_cc)-2);
        
$h_reply_to "{$this->reply_to[name]} <{$this->reply_to[dir]}>";
        
$x_ip "X-Origen-IP: ".getenv("REMOTE_ADDR");
        
$x_ver phpversion();
        
$x_mail "X-Mailer: mailto:web - PHP/$x_ver"
        
$header "From: $h_from\r\nReply-To: $h_reply_to\r\n$x_mail\r\n$x_ip\r\nTo: $h_to\r\nCC: $h_cc\r\nSubject: {$this->asunto}\r\n\r\n";
        
$this->mail $header.$this->body;
    }

    function 
end() {
        
socket_close($this->socket);
    }

    function 
smtp_add_rcpt($dir$name$type) {
        
$ya_hay $this->rec_tot;
if (!$name) {$name $dir;}
        
$this->rcpt[dir][$ya_hay]  = $dir;
        
$this->rcpt[name][$ya_hay] = $name;
        
$this->rcpt[type][$ya_hay] = $type;
        
$this->rec_tot += 1;
    }

}
?>



EDIT: Este es un archivo que incorpore en una proyecto de webmail llamado "mailto:web" que nunca vio la luz (engo varios proyectos en PHP como uno que se llama DeliveryNet que es una especie de portal de compras de un comercio delivery (una pizzeria por ejemplo) que imprime los tiquet de pedido en la impresora del comercio. Para mi muchos de esos son escuelas porque es una manera de aprender a manejar los comandos e integrarlos en situaciones reales. (webmail, pedidos con impresión, uso de temas y graficos, etc)

Camello_AR

NOTAS:
1)
en * $smtp->body = cuerpo del mensaje (debe ser final)

Final significa no lo ultimo que se carga, sino que debe ser el texto codificado, formateado o como sea (dado que no recibe postproceso salvo las cabeceras)

2) Copiar el texto pegarlo en un archivo de texto y renombralo a .php (darle el nombre que quieran, el original es "smtp.php") y luego incluirlo en el archivo que llame a la clase (o si tienen un framework o archivo que llama las funciones y eso se puede agregar ahi) con el comando
include("smtp.php");

ACLARACION: Doble post para que estas notas no se pierdan

Camello_AR

EJEMPLO DE USO

Este es un archivo que recibe los datos de un formulario, si manejan un poco de PHP y HTML enseguida se daran cuenta de la extructura

header.php, ss.txt y barra.php son archivos que hacen a la visualización de la page (un poco lo que hablaba de un framework)

<?
include("header.txt");
include("smtp.php");
$page = "sendmail";
require_once("barra.php");
//
$cc = explode(", ", $HTTP_POST_VARS["ccopy"]);
$to = explode(", ", $HTTP_POST_VARS["to"]);
$de = $HTTP_POST_VARS["from"];
$smtp = new Smtp_Sender;
$smtp->from[dir] = $de;
$smtp->from[name] = ucfirst($usr);
if ($HTTP_POST_VARS[to]!="") {
for ($i=0 ; $i<count($to); $i++) {
$smtp->smtp_add_rcpt($to[$i], $to[$i], 0);
}
}
if ($HTTP_POST_VARS[ccopy]!="") {
for ($i=0 ; $i<count($cc); $i++) {
$smtp->smtp_add_rcpt($cc[$i], $HTTP_POST_VARS[$i], 1);
}
}
$smtp->server = "127.0.0.1";
$smtp->helo = getenv("SERVER_NAME");
$smtp->asunto = $HTTP_POST_VARS["subject"];
$smtp->body = $HTTP_POST_VARS["msg"];
$totales = $smtp->rec_tot;
for ($i = 0; $i<$totales; $i++) {
    $para .= $smtp->rcpt[dir][$i].", ";
}
$para = substr($para, 0, strlen($para)-2);
$smtp->smtp_send();
/*
$ip = getenv("REMOTE_ADDR");
$de = $HTTP_POST_VARS[from];
$para  = $HTTP_POST_VARS[to];
$motivo  = $HTTP_POST_VARS[subject];
$mensaje  = $HTTP_POST_VARS[msg];
$cc = $HTTP_POST_VARS[ccopy];
if (!$cc) {
$cch = "";
} else {
$para = $para.",".$cc;
$cch = "\nCC: ".$cc;
}
$cabecera = "From: ".$de."\nReply-To: ".$de.$cch."\nX-Mailer: mailto:web - PHP/" . phpversion()."\nX-Origen-IP: ".$ip;
mail($para, $motivo, $mensaje, $cabecera);
*/
?>
<font face=Verdana>
<h1>Envio de Correo Electronico de **SITIO**.Com.Ar</h1>
<p><small>
<?
if ($smtp->error == 1) {
    echo "Error enviando el mensaje<br>";
    $tot = $smtp->errores[totales];
    if ($tot >= 1) {
        for ($n = 1; $n <= $tot; $n++) {
            echo "<i>".$smtp->errores[$n]."</i><br>";
        }
    }
}
for ($i = 0; $i<$totales; $i++) {
    $para = $smtp->rcpt[dir][$i];
    if ($smtp->rcpt[error][$i] == 1) {
        echo "No se pudo enviar el mensaje a <b><i>".$para."</b></i><BR>";
        if ($smtp->error == 0) {
            $tot = $smtp->errores[totales];
            if ($tot >= 1) {
                for ($n = 1; $n <= $tot; $n++) {
                    echo "<i>".$smtp->errores[$n]."</i><br>";
                }
            }
        }
    } else {
        echo "Se envio el mensaje a <b><i>".$para."</b></i> correctamente<BR>";
    }
}
?>
</small></p>

<?
echo $barran;
include("ss.txt");
?>
</font>

elrosti

Muy bueno Camello !!!.

PD: che.... ¿ vos no eras abogado ?  :jaja:  :jaja:, porque tenes mas pinta de programador que de abogado...
Yo no lo quería creer..... pero ella me convenció.

Camello_AR

Es que antes de ser abogado soy informatico. De hecho estuve 2 años intentando estudiar ing. en sistemas, y por suerte compatibilizo los dos gustos

EDIT: Me gustaría que prueben la clase y me avisen como les anda

cazador

gracias camellin, en cuanto pueda la mando al foro mio

salutes

Camello_AR


cazador

en sintesis, ara redondear,y lo tuyo came, kede de primera, yo tengo el foro SMF, del cual no puedo mandar mails ni via PHP ni via SMTP.
Lo que vos pones es para que arme un archivo nuevo, que modifique uno existente, de ser nuevo, tendria que modificar alguno existente o no? ni idea de esto de la programacion. me lo podes explicar un poquitin mas camellin.
mil gracias  :up:

elrosti

Cazador: creo que para tus necesidades deberias modificar a mano SMF ( lo cual luego lleva problemas y laburo en mantenimiento, pero eso ya es otro tema).

En cada lugar que SMF intenta mandar un mail ( ejemplo al momento de pedir la confirmación para el registro) deberias modificar el codigo y remplazar la llamada a la función por la función de Camello.

Todo eso suponiendo que lo que te estan restringiendo es el acceso al SMTP configurado en PHP. Para estar seguro te acnosejo subir un pequeño ejemplo atu servidor y tratar de usarlo.

Aunque, Cazador, Con todo respeto, con tus conocimientos de programación dudo mucho que puedas meterle mano a SMF para hacer todas las modificaciones necesarias.

Saludos.
Yo no lo quería creer..... pero ella me convenció.

cazador

gracias rosti por la sinceridad  :jaja:

elrosti

Yo no lo quería creer..... pero ella me convenció.

cazador

por otro lado, camellin, que me podra decir al respecto??