PHP
Enviando email
Buscar..
Parámetros
Parámetro | Detalles |
---|---|
string $to | La dirección de correo electrónico del destinatario |
string $subject | La linea de asunto |
string $message | El cuerpo del email. |
string $additional_headers | Opcional: encabezados para agregar al correo electrónico. |
string $additional_parameters | Opcional: argumentos para pasar a la aplicación de envío de correo configurada en la línea de comandos |
Observaciones
Correo electrónico que estoy enviando a través de mi script nunca llega. ¿Qué tengo que hacer?
Asegúrese de tener activado el informe de errores para ver cualquier error.
Si tiene acceso a los archivos de registro de errores de PHP, verifique esos.
¿El comando
mail()
configurado correctamente en su servidor ? (Si estás en un alojamiento compartido, no puedes cambiar nada aquí).Si los correos electrónicos están desapareciendo, inicie una cuenta de correo electrónico con un servicio de correo electrónico gratuito que tenga una carpeta de correo no deseado (o use una cuenta de correo electrónico que no filtre el correo basura). De esta manera, puede ver si el correo electrónico no se envía, o tal vez se envía, pero se filtra como correo no deseado.
¿Revisó la dirección "de:" que utilizó para los posibles correos "devueltos al remitente"? También puede configurar una dirección de rebote separada para los correos de error.
El correo electrónico que estoy enviando se está filtrando como spam. ¿Qué tengo que hacer?
¿La dirección del remitente ("De") pertenece a un dominio que se ejecuta en el servidor desde el que envía el correo electrónico? Si no, cambia eso.
Nunca use direcciones de remitentes como
[email protected]
. Utilicereply-to
si necesita respuestas para llegar a una dirección diferente.¿Está su servidor en una lista negra? Esta es una posibilidad cuando estás en un alojamiento compartido cuando los vecinos se comportan mal. La mayoría de los proveedores de listas negras, como Spamhaus , tienen herramientas que le permiten buscar la IP de su servidor. También hay herramientas de terceros como MX Toolbox.
Algunas instalaciones de PHP requieren establecer un quinto parámetro en mail () para agregar una dirección de remitente. Ver si este podría ser el caso para usted.
Si todo lo demás falla, considere usar el correo electrónico como un servicio como Mailgun , SparkPost , Amazon SES , Mailjet , SendinBlue o SendGrid, para nombrar algunos, en su lugar. Todos ellos tienen API que se pueden llamar usando PHP.
Envío de correo electrónico: conceptos básicos, más detalles y un ejemplo completo
Un correo electrónico típico tiene tres componentes principales:
- Un destinatario (representado como una dirección de correo electrónico)
- Un sujeto
- Un cuerpo de mensaje
Enviar correo en PHP puede ser tan simple como llamar a la función incorporada mail()
. mail()
toma hasta cinco parámetros, pero los tres primeros son todo lo que se requiere para enviar un correo electrónico (aunque los cuatro parámetros se usan comúnmente como se demostrará a continuación). Los tres primeros parámetros son:
- La dirección de correo electrónico del destinatario (cadena)
- El asunto del correo electrónico (cadena)
- El cuerpo del correo electrónico (cadena) (por ejemplo, el contenido del correo electrónico)
Un ejemplo mínimo se asemejaría al siguiente código:
mail('[email protected]', 'Email Subject', 'This is the email message body');
El ejemplo simple anterior funciona bien en circunstancias limitadas, como codificar una alerta de correo electrónico para un sistema interno. Sin embargo, es común colocar los datos pasados como parámetros para mail()
en variables para hacer que el código sea más limpio y fácil de administrar (por ejemplo, generar dinámicamente un correo electrónico desde un envío de formulario).
Además, mail()
acepta un cuarto parámetro que le permite recibir encabezados de correo adicionales con su correo electrónico. Estos encabezados pueden permitirle establecer:
- la
From
nombre y dirección de correo electrónico que el usuario verá - el
Reply-To
dirección de correo electrónico se enviará la respuesta del usuario a - encabezados adicionales no estándares como
X-Mailer
que pueden indicar al destinatario que este correo electrónico se envió a través de PHP
$to = '[email protected]'; // Could also be $to = $_POST['recipient'];
$subject = 'Email Subject'; // Could also be $subject = $_POST['subject'];
$message = 'This is the email message body'; // Could also be $message = $_POST['message'];
$headers = implode("\r\n", [
'From: John Conde <[email protected]>',
'Reply-To: [email protected]',
'X-Mailer: PHP/' . PHP_VERSION
]);
El quinto parámetro opcional se puede usar para pasar banderas adicionales como opciones de línea de comando al programa configurado para ser usado al enviar correo, según lo definido por la configuración de sendmail_path
. Por ejemplo, esto se puede usar para configurar la dirección del remitente del sobre cuando se usa sendmail / postfix con la opción -f
sendmail.
$fifth = '[email protected]';
Aunque el uso de mail()
puede ser bastante confiable, de ninguna manera se garantiza que se enviará un correo mail()
cuando se llame a mail()
. Para ver si hay un error potencial al enviar su correo electrónico, debe capturar el valor de retorno de mail()
. TRUE
será devuelto si el correo fue aceptado exitosamente para su entrega. De lo contrario, recibirá FALSE
.
$result = mail($to, $subject, $message, $headers, $fifth);
NOTA : aunque mail()
puede devolver TRUE
, no significa que el correo electrónico fue enviado o que el destinatario lo recibirá. Solo indica que el correo se entregó con éxito al sistema de correo de su sistema con éxito.
Si desea enviar un correo electrónico HTML, no hay mucho trabajo que deba hacer. Necesitas:
- Añadir el encabezado de la
MIME-Version
- Añadir el encabezado de
Content-Type
- Asegúrese de que su contenido de correo electrónico es HTML
$to = '[email protected]';
$subject = 'Email Subject';
$message = '<html><body>This is the email message body</body></html>';
$headers = implode("\r\n", [
'From: John Conde <[email protected]>',
'Reply-To: [email protected]',
'MIME-Version: 1.0',
'Content-Type: text/html; charset=ISO-8859-1',
'X-Mailer: PHP/' . PHP_VERSION
]);
Aquí hay un ejemplo completo de cómo usar la función mail()
PHP mail()
<?php
// Debugging tools. Only turn these on in your development environment.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
// Special mail settings that can make mail less likely to be considered spam
// and offers logging in case of technical difficulties.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
// The components of our email
$to = '[email protected]';
$subject = 'Email Subject';
$message = 'This is the email message body';
$headers = implode("\r\n", [
'From: [email protected]',
'Reply-To: [email protected]',
'X-Mailer: PHP/' . PHP_VERSION
]);
// Send the email
$result = mail($to, $subject, $message, $headers);
// Check the results and react accordingly
if ($result) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
// Your mail was not sent. Check your logs to see if
// the reason was reported there for you.
}
Ver también
Documentacion oficial
Preguntas relacionadas sobre el desbordamiento de pila
- Formulario de correo PHP no completa el envío de correo electrónico
- ¿Cómo se asegura de que el correo electrónico que envíe programáticamente no se marque automáticamente como spam?
- Cómo usar SMTP para enviar correos electrónicos
- Configuración del sobre de la dirección
Mailers alternativos
Servidores de correo electrónico
Temas relacionados
Enviando correo electrónico HTML usando correo ()
<?php
$to = '[email protected]';
$subject = 'Sending an HTML email using mail() in PHP';
$message = '<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>';
$headers = implode("\r\n", [
"From: John Conde <[email protected]>",
"Reply-To: [email protected]",
"X-Mailer: PHP/" . PHP_VERSION,
"MIME-Version: 1.0",
"Content-Type: text/html; charset=UTF-8"
]);
mail($to, $subject, $message, $headers);
Esto no es muy diferente a enviar un correo electrónico de texto sin formato . Las diferencias clave en cuanto al cuerpo del contenido están estructuradas como un documento HTML y hay dos encabezados adicionales que deben incluirse para que el cliente de correo electrónico sepa que el correo electrónico es trender como HTML. Son:
- Versión MIME: 1.0
- Tipo de contenido: texto / html; conjunto de caracteres = UTF-8
Enviar correo electrónico de texto sin formato utilizando PHPMailer
Email basico de texto
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->Subject = "Subject Text";
$mail->Body = "This is a sample basic text email using PHPMailer.";
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Mailer Error: " . $mail->ErrorInfo;
}
Adición de destinatarios adicionales, destinatarios CC, destinatarios BCC
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->addAddress("[email protected]", "Recepient Name");
$mail->addAddress("[email protected]");
$mail->addCC("[email protected]");
$mail->addBCC("[email protected]");
$mail->Subject = "Subject Text";
$mail->Body = "This is a sample basic text email using PHPMailer.";
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Error: " . $mail->ErrorInfo;
}
Enviar correo electrónico con un archivo adjunto utilizando correo ()
<?php
$to = '[email protected]';
$subject = 'Email Subject';
$message = 'This is the email message body';
$attachment = '/path/to/your/file.pdf';
$content = file_get_contents($attachment);
/* Attachment content transferred in Base64 encoding
MUST be split into chunks 76 characters in length as
specified by RFC 2045 section 6.8. By default, the
function chunk_split() uses a chunk length of 76 with
a trailing CRLF (\r\n). The 76 character requirement
does not include the carriage return and line feed */
$content = chunk_split(base64_encode($content));
/* Boundaries delimit multipart entities. As stated
in RFC 2046 section 5.1, the boundary MUST NOT occur
in any encapsulated part. Therefore, it should be
unique. As stated in the following section 5.1.1, a
boundary is defined as a line consisting of two hyphens
("--"), a parameter value, optional linear whitespace,
and a terminating CRLF. */
$prefix = "part_"; // This is an optional prefix
/* Generate a unique boundary parameter value with our
prefix using the uniqid() function. The second parameter
makes the parameter value more unique. */
$boundary = uniqid($prefix, true);
// headers
$headers = implode("\r\n", [
'From: [email protected]',
'Reply-To: [email protected]',
'X-Mailer: PHP/' . PHP_VERSION,
'MIME-Version: 1.0',
// boundary parameter required, must be enclosed by quotes
'Content-Type: multipart/mixed; boundary="' . $boundary . '"',
"Content-Transfer-Encoding: 7bit",
"This is a MIME encoded message." // message for restricted transports
]);
// message and attachment
$message = implode("\r\n", [
"--" . $boundary, // header boundary delimiter line
'Content-Type: text/plain; charset="iso-8859-1"',
"Content-Transfer-Encoding: 8bit",
$message,
"--" . $boundary, // content boundary delimiter line
'Content-Type: application/octet-stream; name="RenamedFile.pdf"',
"Content-Transfer-Encoding: base64",
"Content-Disposition: attachment",
$content,
"--" . $boundary . "--" // closing boundary delimiter line
]);
$result = mail($to, $subject, $message, $headers); // send the email
if ($result) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
// Your mail was not sent. Check your logs to see if
// the reason was reported there for you.
}
Codificaciones de transferencia de contenido
Las codificaciones disponibles son 7bit , 8bit , binary , quoted-printable , base64 , ietf-token y x-token . De estas codificaciones, cuando un encabezado tiene un Tipo de contenido de varias partes , la Codificación de transferencia de contenido no debe tener ningún otro valor que no sea 7bit , 8bit o binario como se indica en RFC 2045, sección 6.4.
Nuestro ejemplo elige la codificación de 7 bits, que representa los caracteres US-ASCII, para el encabezado de varias partes porque, como se señala en la sección 6 de RFC 2045, algunos protocolos solo admiten esta codificación. Los datos dentro de los límites se pueden codificar parte por parte (RFC 2046, sección 5.1). Este ejemplo hace exactamente esto. La primera parte, que contiene el mensaje de texto / sin formato, se define como 8 bits, ya que puede ser necesario admitir caracteres adicionales. En este caso, se está utilizando el conjunto de caracteres Latin1 (iso-8859-1). La segunda parte es el archivo adjunto y, por lo tanto, se define como una aplicación codificada en base64 / flujo de octetos. Como base64 transforma datos arbitrarios en el rango de 7 bits, puede enviarse en transportes restringidos (RFC 2045, sección 6.2).
Envío de correo electrónico HTML utilizando PHPMailer
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->addAddress("[email protected]", "Recepient Name");
$mail->addAddress("[email protected]");
$mail->addCC("[email protected]");
$mail->addBCC("[email protected]");
$mail->Subject = "Subject Text";
$mail->isHTML(true);
$mail->Body = "<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>";
$mail->AltBody = "This paragraph is not bold.\n\nThis text is not italic.";
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Error: " . $mail->ErrorInfo;
}
Envío de correo electrónico con un archivo adjunto utilizando PHPMailer
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->Subject = "Subject Text";
$mail->Body = "This is a sample basic text email with an attachment using PHPMailer.";
// Add Static Attachment
$attachment = '/path/to/your/file.pdf';
$mail->AddAttachment($attachment , 'RenamedFile.pdf');
// Add Second Attachment, run-time created. ie: CSV to be open with Excel
$csvHeader = "header1,header2,header3";
$csvData = "row1col1,row1col2,row1col3\nrow2col1,row2col2,row2col3";
$mail->AddStringAttachment($csvHeader ."\n" . $csvData, 'your-csv-file.csv', 'base64', 'application/vnd.ms-excel');
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Error: " . $mail->ErrorInfo;
}
Enviar correo electrónico de texto sin formato utilizando Sendgrid
Email basico de texto
<?php
$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email = new SendGrid\Email();
$email->addTo("[email protected]")
->setFrom("[email protected]")
->setSubject("Subject Text")
->setText("This is a sample basic text email using ");
$sendgrid->send($email);
Adición de destinatarios adicionales, destinatarios CC, destinatarios BCC
<?php
$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email = new SendGrid\Email();
$email->addTo("[email protected]")
->setFrom("[email protected]")
->setSubject("Subject Text")
->setHtml("<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>");
$personalization = new Personalization();
$email = new Email("Recepient Name", "[email protected]");
$personalization->addTo($email);
$email = new Email("RecepientCC Name", "[email protected]");
$personalization->addCc($email);
$email = new Email("RecepientBCC Name", "[email protected]");
$personalization->addBcc($email);
$email->addPersonalization($personalization);
$sendgrid->send($email);
Enviar correo electrónico con un archivo adjunto utilizando Sendgrid
<?php
$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email = new SendGrid\Email();
$email->addTo("[email protected]")
->setFrom("[email protected]")
->setSubject("Subject Text")
->setText("This is a sample basic text email using ");
$attachment = '/path/to/your/file.pdf';
$content = file_get_contents($attachment);
$content = chunk_split(base64_encode($content));
$attachment = new Attachment();
$attachment->setContent($content);
$attachment->setType("application/pdf");
$attachment->setFilename("RenamedFile.pdf");
$attachment->setDisposition("attachment");
$email->addAttachment($attachment);
$sendgrid->send($email);