Blog de programación, errores, soluciones

Enviar emails con PHP

En este apartado veremos como enviar emails con PHP, en un principio se iba a tratar la función mail de PHP solamente, pero esta es probable que n o sea la mejor de las herramientas para enviar emails asi que también veremos PHPMailer y como enviar mail con CURL.

Además de esto tocaremos otras librerías de terceros antes de usar PHPMailer.

Función mail()

Para usar la función mail necesitarás, sendmail, qmail, postfix o otro sistema SMTP instalado y referenciar este, esto seria en el php.ini más precisamente en sendmail.

NombrePor defectoCambiableHistorial de cambios
mail.add_x_header«0»PHP_INI_PERDIRDisponible a partir de PHP 5.3.0.
mail.logNULLPHP_INI_PERDIRDisponible a partir de PHP 5.3.0. (PHP_INI_SYSTEM|PHP_INI_PERDIR)
mail.force_extra_parametersNULLPHP_INI_PERDIRDisponible a partir de PHP 5.0.0. (PHP_INI_SYSTEM|PHP_INI_PERDIR)
SMTP«localhost»PHP_INI_ALL 
smtp_port«25»PHP_INI_ALLDisponible a partir de PHP 4.3.0.
sendmail_fromNULLPHP_INI_ALL 
sendmail_path«/usr/sbin/sendmail -t -i»PHP_INI_SYSTEM 

La manera más simple que nos permite php es usar la función mail, pero como ya describimos antes necesita de instalar un smtp en el server o sendmail para ser utlizada.

sintaxis:

mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] ) : bool

$to

Es a quien está dirigido este email (debe cumplir con RFC 2822 – Internet Message Format)

Ejemplos de un solo destinatario, fakemail es solo de ejemplo ni sé si existirá esa empresa de emails, también podría ser un nombre de empresa.

En caso de un destinatario puede usar un string «destinatario@fakemail.com»

o también podría ser

$to= "<destinatario@fakemail.com>";

En caso de ser más de un destinatario puede agregarle, entre destinatarios, por ejemplo

$to= "destinatario1@fakemail.com, destinatario2@fakemail.com, detinatario3@otroemail.com";

$subject

Título del correo electrónico a enviar.(debe cumplir con la » RFC 2047)

$subject = "Clases suspendidas";

$message

Mensaje que se le enviara al destinatario, Cada línea debería separarse con un CRLF y no deberían ocupar más de 70 caracteres.

¿Que quiere decir que cada línea debe separarse con CRLF?

bueno esto seria nueva linea \n y carrage return \r.

Bueno y como se veria un ejemplo de $message, podria ser algo asi

$message  = "Este es un mensaje de bedelia para los estudiantes de 1er semestre informando\n";
$message .= "que no se tendran que presentar a clases el dia 20 de mayo\n.";

Además en caso de utilizar Windows deberemos de tener en cuenta de que borra el punto al final

<?php
$message = str_replace("\n.", "\n..", $message);
?>

$additional_headers

Es un parámetro opcional que se usa normalmente para añadir cabeceras extra, estas pueden ser From, Bcc, Cc y otras.

From: es quien le está enviando el correo (email), puede ser un no-replay en ese caso no debería contestar a ese correo.

CC: copy carbon, el destinatario puede ver el resto de destinatarios.

Bcc: blind copy carbon, en caso de enviar múltiples copias los destinatarios no podrán ver el resto de destinatarios.

$additional_headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$additional_headers .= 'From: Recordatorio <cumples@example.com>' . "\r\n";
$additional_headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
$additional_headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";

$additional_parameters

Al igual que el anterior es opcional, este puede usarse para indicar opciones adicionales como opciones de línea de comandos al programa que está configurado para usarse cuando se envía correo, definido por la opción de configuración sendmail_path

Ejemplo completo

En esta última sección de la función de php mail() veremos un ejemplo el cual he sacado de php.net el cual muestra que también nos permite enviar mails en formato HTML.


<?php
// Varios destinatarios
$para  = 'aidan@example.com' . ', '; // atención a la coma
$para .= 'wez@example.com';

// título
$título = 'Recordatorio de cumpleaños para Agosto';

// mensaje
$mensaje = '
<html>
<head>
  <title>Recordatorio de cumpleaños para Agosto</title>
</head>
<body>
  <p>¡Estos son los cumpleaños para Agosto!</p>
  <table>
    <tr>
      <th>Quien</th><th>Día</th><th>Mes</th><th>Año</th>
    </tr>
    <tr>
      <td>Joe</td><td>3</td><td>Agosto</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17</td><td>Agosto</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// Para enviar un correo HTML, debe establecerse la cabecera Content-type
$cabeceras  = 'MIME-Version: 1.0' . "\r\n";
$cabeceras .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Cabeceras adicionales
$cabeceras .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$cabeceras .= 'From: Recordatorio <cumples@example.com>' . "\r\n";
$cabeceras .= 'Cc: birthdayarchive@example.com' . "\r\n";
$cabeceras .= 'Bcc: birthdaycheck@example.com' . "\r\n";

// Enviarlo
mail($para, $título, $mensaje, $cabeceras);
?>
Somethig wrong? If you found an error or mistake on the content you can contact me on twitter | @luisg2249_luis.
Last 4 post in same category