Enviar mail con php

Algoritmos, estructuras de datos, estrategias o patterns. Lenguaje' de programasión, vieja! Ce, loco, Ce! Páison, y todo eso.

Enviar mail con php

Notapor Adriano el Sab Mar 31, 2007 8:57 am

Estoy revisando esta función, que parece andar correctamente, y me interesa saber si no está
  • Reinventando alguna rueda
  • Programada en modo seguro
  • Algo más, que no se me ocurra
Código: Seleccionar todo
function handler($sending) {
// Checks the conditions for sending a mail from the mail form, and then sends it.
// This is way too much, but it determines whether the main article gets printed or not.
// calls validate() and load_article().
    $to = "mail@fqdn";
    $sender = $_POST['author'];
    $sender_email = $_POST['author_email'];
    $auth = intval($_POST['authorized']);
    $message = htmlspecialchars($_POST['message']);
    $subject = $_POST['subject'];
    $mailbegin = '<div id="mail">
<h2 id="mailme">Contacto</h2>\n\n<p>Ning&uacute;n dato es necesario, salvo antispam y el texto del mensaje.</p>';
    $mailn = '<h6>Mensaje no enviado</h6>\n<p>Por favor, completa correctamente los campos requeridos.</p>';
    $maily = '<h6>Mensaje enviado</h6>\n<p>Gracias por escribirme. Tu mensaje fue enviado correctamente.</p>';
       
    if (!$sending) {
    // No message and no antispam (the user hasn't yet tried to post a message)
        global $sec, $art, $divadsense;
        load_article($sec, $art);    // calls the function to carry on loading the page.
        print($divadsense . "\n");
        print($mailbegin . "\n");
        include("mail.html");
    }
    else if ($sending) {
    // No message
    // A message, and no (or wrong) antispam
        if ((!$message) || ($message && (!$auth || ($auth != 4)))) {
            print($mailbegin . "\n". $mailn . "\n");    // incomplete or wrong
            include("mail.html");                       // the mailform
        }

        else if (($sending === 1) && $message && ($auth == 4)) {
        // We got a message and antispam is set correctly,       
        // Now we do mail() fields validation.
            if ((has_rn($subject)) || (has_rn($sender)) || (has_rn($sender_email))) {
                print("<p>Go away, nasty spammer</p>\n");
                return FALSE;
            }
            $headers = "From: " .$sender . " <" .$sender_email . ">\r\n";
            $subject .= " [Desde fqdn]";
            $message = utf8_encode($message);    // the message comes out as UTF-8.
            mail($to, $subject, $message, $headers);
           
            print($maily . "\n");
            unset($message);
            unset($subject);
            unset($headers);
            $authorized = 0;
            $sending = 0;
        }
    }
}


Chasgracias
Saludos
Adriano
Avatarde Usuario
Adriano
Administrador
 
Posts: 392
Registrado: Sab Dic 09, 2006 12:50 pm
Ubicación: Argentina

Enviar mail con php

Sponsor

Sponsor
 

Re: Enviar mail con php

Notapor Adriano el Sab Mar 31, 2007 1:12 pm

Acá está la función que uso para limpiar headers:
Código: Seleccionar todo
function has_rn(&$field) {
// checks a field in the mail() function: returns true if the field contains \r or \n.
   $field = htmlspecialchars($field);
   //strpos would be faster, but also more convoluted to use and understand.
   return ( stristr($field, "\r") || stristr($field, "\n") );
}
Saludos
Adriano
Avatarde Usuario
Adriano
Administrador
 
Posts: 392
Registrado: Sab Dic 09, 2006 12:50 pm
Ubicación: Argentina

Re: Enviar mail con php

Notapor buanzo el Sab Mar 31, 2007 1:18 pm

En vez de hacer un analisis de tu funcion, te paso algunos comentarios tipicos que DEBEN ser tenidos en cuenta, mas que nada para documentar un poco aqui...

El campo SUBJECT de mail() no DEBE contener ningun \n o \r\n. Encontrar eso en el subject arma separacion de encabezados, y existen multitud de bugs en clientes de correo y mail servers como para obviar ese detalle. Aparte, indicaria que el form no fue submiteado desde un browser (al menos, no normalmente).

Segundo: veo que no forzas hacer escaping, por singlequoting. No todos los servidores tienen php configurado para magic quotes gpc. Testea y aplica segun sea necesario, tampoco queremos un double-quoting Razz

Tercero: aunque suena logico definir el From: con los datos ingresados por el cliente, yo usaria valores fijos, y pondria al from dentro del cuerpo del mensaje. Ojo me refiero al texto del from y no a la direccion de mail <>. Lo que pones entre <> deberia ser matcheado contra una regex. Si queres una regex de direcciones de mail piola, armate otro thread y la publico ahi. Tambien podes armar el From: totalmente fijo, y usar Reply-To con esos datos, pero bien escapados. De esta manera, siempre podes whitelistear el from en tu mail server, y evitar perder mails.

Un consejo en general: usa regex para toda validacion, evitate la busqueda de caracteres "a mano".

Saludos


Cuarto: Te recomiendo usar wordwrap() sobre el cuerpo del mensaje.
Avatarde Usuario
buanzo
Administrador
 
Posts: 673
Registrado: Sab Dic 09, 2006 11:17 am
Ubicación: Buanzonia (ok, Florida, Buenos Aires)

Re: Enviar mail con php

Notapor Adriano el Sab Mar 31, 2007 1:30 pm

buanzo escribió:El campo SUBJECT de mail() NO DEBE contener ningun \n o \r\n. Encontrar eso en el subject arma separacion de encabezados, y existen multitud de bugs en clientes de correo y mail servers como para obviar ese detalle. Aparte, indicaria que el form no fue submiteado desde un browser (al menos, no normalmente).

Sí, eso lo sabía, como ves en la función has_rn(), que posteé mientras respondías. Race condition entre foristas!

buanzo escribió:Segundo: veo que no forzas hacer escaping, por singlequoting. No todos los servidores tienen php configurado para magic quotes gpc. Testea y aplica segun sea necesario, tampoco queremos un double-quoting Razz

No es lo que hace htmlspecialchars?

buanzo escribió:Tercero: aunque suena logico definir el From: con los datos ingresados por el cliente, yo usaria valores fijos, y pondria al from dentro del cuerpo del mensaje.

No, no me interesa controlar el mail de From, sé que la regex completa es un monstruo y no vale la pena para el caso. Si la gente quiere respuestas, que ponga mails reales, qué joder. En realidad, poner los datos fijos en from, headers y demás era lo que hacía esta función antes, es sólo que ahora me gustaría algo más simple para el procesamiento humano.

buanzo escribió:Cuarto: Te recomiendo usar wordwrap() sobre el cuerpo del mensaje.

Es una buena idea, sí. ahora la agrego.
Saludos
Adriano
Avatarde Usuario
Adriano
Administrador
 
Posts: 392
Registrado: Sab Dic 09, 2006 12:50 pm
Ubicación: Argentina

Re: Enviar mail con php

Notapor dualbyte el Vie Feb 29, 2008 1:07 pm

mira yo programo en php y te recominedo que si vas a usar el envio de emails y queres que resulte uses la libreria phpmailer hay manuales por toda internet solo busca en google...

las posibilidades y ventajas que tenes son las siguientes:

1- los mails se envian desde cualquier cuenta que tenga servidor smtp (ejemplo gmail )
2-los mails llegan a la bandeja de entrada, si usas envios con la funcion mail(); o similar casi nunca llegan a la bandeja de entrada en especial de cuentas de hotmail y yahoo (gmail casi siempre las aceptas si aclaras que fue generada por php en los headers, si queres despues te pongo headers de ejemplo ... )
3-se encarga d ela gestion de headers (solo escribis el cuerpo asunto y el remitente)

las limitaciones que tiene es que si estas en un hosting, tenes que pedir que te abran el puerto 465 apuntando hacia smtp.gmail.com ,, hay algunos hostings que los abren otros que no...

desde ya si tenes alguna duda con la libreria decime...
dualbyte
 
Posts: 3
Registrado: Vie Feb 29, 2008 3:09 am

Re: Enviar mail con php

Notapor buanzo el Sab Mar 01, 2008 9:41 am

Por el tema del hsoting Adriano safa: Su sitio esta en mi server dedicado de alemania.
Avatarde Usuario
buanzo
Administrador
 
Posts: 673
Registrado: Sab Dic 09, 2006 11:17 am
Ubicación: Buanzonia (ok, Florida, Buenos Aires)


Volver a Programación y Diseño de Sófwer.

¿Quién está conectado...?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron