Función de correo verbosa -- php campo con validation campo con email camp codereview Relacionados El problema

Verbose mailing function


3
vote

problema

Español

Tengo múltiples formas que envían un correo electrónico. A partir de este momento tengo 3 formas que envían correo y varían solo por el número de entradas:

  • se requiere solo un correo electrónico
  • Otro requiere un nombre y un correo electrónico
  • Otro requiere el nombre, el correo electrónico y un comentario

En lugar de hacer 3 funciones separadas para enviar las entradas de distancia, pensé que podría consolidarlos en 1. El problema aquí es una gran cantidad de declaraciones . El código todo funciona, pero se extiende alrededor de 30 líneas, lo que parece demasiado.

  function sendMail() { $comment = null; $to =  "destination@mail.com"; $copy = "mymail@mail.com"; $subject = "Email.."; if (isset($_POST["contactSubscribe"]) || isset($_POST["questionSubmit"]) || isset($_POST["submit"])) {     foreach ($_POST as $field => $value) {     if ($field == "contactName") {       $contactName = $value;     }     if ($field == "email") {       $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);     }     if ($field == "comment") {       $comment = $value;     }   } } if (!is_null($contactName) && is_null($comment) ) {   $message = "Name: $contactName Email: $email";  } if (is_null($comment) && is_null($contactName)) {   $message = "inputname=i_" . $email; } if (!is_null($contactName) && !is_null($comment) ) {   $message = "Name: $contactName Email: $email Message: $comment";  } mail($to, $subject, $message); mail($copy, $subject, $message); }   
Original en ingles

I have multiple forms that send an email. As of this moment I have 3 forms that send mail and vary only by the number of inputs:

  • One requires just an email
  • Another requires a name and email
  • Another requires name, email, and a comment

Instead of making 3 separate functions to mail the inputs away, I figured I could consolidate them into 1. The issue here is a lot of if statements. The code all works, but spans around 30 lines, which seems like too much.

function sendMail() { $comment = null; $to =  "destination@mail.com"; $copy = "mymail@mail.com"; $subject = "Email.."; if (isset($_POST["contactSubscribe"]) || isset($_POST["questionSubmit"]) || isset($_POST["submit"])) {     foreach ($_POST as $field => $value) {     if ($field == "contactName") {       $contactName = $value;     }     if ($field == "email") {       $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);     }     if ($field == "comment") {       $comment = $value;     }   } } if (!is_null($contactName) && is_null($comment) ) {   $message = "Name: $contactName Email: $email";  } if (is_null($comment) && is_null($contactName)) {   $message = "inputname=i_" . $email; } if (!is_null($contactName) && !is_null($comment) ) {   $message = "Name: $contactName Email: $email Message: $comment";  } mail($to, $subject, $message); mail($copy, $subject, $message); } 
        
 
 

Lista de respuestas

3
 
vote

Puedo mejorar ligeramente su función, como esta:

  f(start) = 11  

Está claro que parece exagerar las condiciones, no se usan de manera muy efectiva. Pero creo que ha eliminado algunas partes esenciales, por lo que esto nunca va a funcionar.

Tal vez es hora de que comience a pensar en una función de correo electrónico más general, no solo una que se ajuste a sus tres formas. ¿Qué pasa si viene una cuarta forma? Tan más que mirar lo que hice, pensé en generalizar tus rutinas de correo electrónico. Podrías hacer una clase. Separar la construcción del mensaje de correo desde el envío de los correos electrónicos. Puede encontrar suficientes ejemplos aquí (buscar: 'PHP Clase de correo electrónico').

Tampoco olvide que lo siguiente que querrá hacer es enviar mensajes de correo electrónico HTML y agregar archivos adjuntos. Ahí es cuando se vuelve realmente complejo. El correo electrónico HTML y los archivos adjuntos son simplemente complicados. Busque una biblioteca que pueda hacer estas cosas para usted, hay algunos muy buenos por ahí ( https: // github. com / phpmailer / phpmailer , y similares).

 

I can slightly improve your function, like this:

function array_whitelist($array,$whitelist)  // only allow certain keys in an array, in reaction to comment by tim {   $list = explode(',',$whitelist);   return array_intersect_key($array,array_flip($list)); }  function sendMail() {   // check form submission   if (is_array($_POST))   {     // initialize     $to      = 'destination@mail.com';     $copy    = 'mymail@mail.com';     $subject = 'Email..';     $message = '';     // make all posted input fields into local variables     $inputs  = array_whitelist($_POST,'email,contactName,comment');     extract($inputs);     // filter email address     $email = filter_var($email,FILTER_SANITIZE_EMAIL);     // add some fields to message      if (isset($contactName)) $message .= "Name: $contactName".PHP_EOL;                         else $message .= "Name: i_".$email.PHP_EOL;     if (isset($comment)) $message .= "Message: $comment".PHP_EOL;      // send mails     mail($to, $subject, $message, "BCC: $copy");   } } 

It is clear you seem to overdo the conditions, they are not used very effectively. But I think you have removed some essential parts, so this is never going to work.

Perhaps it is time you start to think about a more general email function, not just one that will fit your three forms. What if a fourth form comes along? So more than looking at what I did, think about generalizing your email routines. You could make a class. Seperate the building of the mail message from the sending of the emails. You can find enough examples here (search for: 'PHP Email Class').

Also don't forget the next thing you will want to do is send HTML email messages, and add attachments. That's when it becomes really complex. Email HTML and attachments are just plain tricky. Look for a library that can do these things for you, there are some very good ones out there (https://github.com/PHPMailer/PHPMailer, and the like).

 
 
   
   
0
 
vote

Su función parece hacer demasiado. La entrada de manejo de tres formas relativamente diferentes en una función no es una muy buena idea.

Si extrae el manejo de la funcionalidad de formularios, su código sería un poco más limpio:

  function sendMail($email, $contactName = null, $comment = null)  {     $to =  "destination@mail.com";     $copy = "mymail@mail.com";     $subject = "Email..."      $email = filter_var($email, FILTER_SANITIZE_EMAIL);      if (is_null($contactName)) {         $message = "inputname=i_" . $email;     } else {                 $message = "Name: $contactName Email: $email";         if (!is_null($comment)) {             $message .= " Message: $comment";          }     }      mail($to, $subject, $message);     mail($copy, $subject, $message); }  // in your subscribe controller: if (isset($_POST["contactSubscribe"]) {     sendMail($_POST['email']); }  // in your submit controller: if (isset($_POST["submit"]) {     sendMail($_POST['email'], $_POST['contactName']); }  // in your question submit controller: if (isset($_POST["questionSubmit"]) {     sendMail($_POST['email'], $_POST['contactName'], $_POST['comment']); }   

Probablemente reduciría la función aún más. La construcción de los mensajes de correo electrónico probablemente debería estar sucediendo en sus propias funciones, y la función SendMail solo debe enviar el correo electrónico.

misc

  • Usa la sangría adecuada.
  • Cuando tiene múltiples SIGRARIAS SI ES MISMO CON LOS MISMOS ARGUMENTOS, DEJE LOS ARGUMENTOS EN EL MISMO ORDEN ( 99887776655443311 VS is_null($comment) && is_null($contactName) ).
  • su bucle forach parece demasiado complejo. ¿Por qué no solo preguntar if (isset($_POST["contactName"]) { $contactName = $_POST["contactName"]; } etc?
  • use en cualquier otro exclusivo exclusivo si las declaraciones.
 

Your function seems to do too much. Handling input from three relatively different forms in one function isn't a very good idea.

If you extract the handling of the forms functionality, your code would be a bit cleaner:

function sendMail($email, $contactName = null, $comment = null)  {     $to =  "destination@mail.com";     $copy = "mymail@mail.com";     $subject = "Email..."      $email = filter_var($email, FILTER_SANITIZE_EMAIL);      if (is_null($contactName)) {         $message = "inputname=i_" . $email;     } else {                 $message = "Name: $contactName Email: $email";         if (!is_null($comment)) {             $message .= " Message: $comment";          }     }      mail($to, $subject, $message);     mail($copy, $subject, $message); }  // in your subscribe controller: if (isset($_POST["contactSubscribe"]) {     sendMail($_POST['email']); }  // in your submit controller: if (isset($_POST["submit"]) {     sendMail($_POST['email'], $_POST['contactName']); }  // in your question submit controller: if (isset($_POST["questionSubmit"]) {     sendMail($_POST['email'], $_POST['contactName'], $_POST['comment']); } 

I would probably reduce the function even further. The building of the email messages should probably be happening in their own functions, and the sendMail function should only send the email.

Misc

  • use proper indentation.
  • When you have multiple if statements with the same arguments, leave the arguments in the same order (!is_null($contactName) && is_null($comment) vs is_null($comment) && is_null($contactName)).
  • your foreach loop seems overly complex. Why not just ask if (isset($_POST["contactName"]) { $contactName = $_POST["contactName"]; } etc?
  • use elseif for mutually exclusive if statements.
 
 

Relacionados problema

3  CSV Email eficiencia de guión  ( Csv email script efficiency ) 
Estoy encargado de obtener correos electrónicos de un archivo .csv y usarlos para enviar un formulario. Estoy usando el CSV y mecanogimen las bibliotecas de P...

13  Enviando un mensaje SMS en C  ( Sending an sms message in c ) 
Recientemente he estado jugando con la idea de enviar un mensaje de texto usando C. Mirando algunas opciones, pensé que usando libcurl para enviar un correo...

7  Conexión API de contactos de Gmail  ( Gmail contacts api connection ) 
He creado esta clase que se conecta a los contactos de Gmail y le permite agregar / editar / eliminar el contacto. Tengo curiosidad por ver lo que otros pie...

2  Plantilla de correo electrónico HTML  ( Html email template ) 
Basado en varias fuentes diferentes, he compilado lo siguiente como mi plantilla de correo electrónico HTML básica. Por favor, hágamelo saber si me he perdido...

2  PHP - Ahorro de correo electrónico entrante y su accesorio  ( Php saving inbound email and its attachment ) 
Tengo por debajo del código, que básicamente está manejando los correos electrónicos entrantes en mi solicitud, guarde el contenido de correo electrónico real...

3  Formulario de contacto que va a varias direcciones basadas en la selección desplegable  ( Contact form that goes to multiple addresses based on drop down selection ) 
I Siguió un tutorial para crear un formulario de contacto PHP que envía a varios correos electrónicos dependiendo de la selección de campo desplegable. ¿Está ...

7  Cifrar y carpeta de copia de seguridad para enviar un correo electrónico diariamente, cuando está en línea  ( Encrypt and backup folder to email daily when online ) 
Tengo un script de copia de seguridad que debe hacer una copia de seguridad de una carpeta y enviarla al correo electrónico. Esto debe hacerse una vez al día....

2  Solicitud de correo electrónico para E-Store  ( Mailsending application for e store ) 
Este es un programa de envío de correo electrónico ficticio para una tienda electrónica que he hecho con fines de práctica. EmailsenderProgram es un programa ...

1  Rake Tarea para enviar a los usuarios un recordatorio para publicar con condiciones  ( Rake task to send users a reminder to post with conditions ) 
Estoy implementando una característica que recuerda a los usuarios que realicen una publicación por correo electrónico si El usuario ha establecido recorda...

4  Compruebe si la dirección de correo electrónico contiene uno de los muchos dominios de una mesa, ignorando el subdominio  ( Check if email address contains one of many domains from a table ignoring the s ) 
Estoy tratando de validar las direcciones de correo electrónico como de ciertas universidades. Tengo una mesa, 9988776655544333 , que está lleno de dominios ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos