¿Cómo enviar un correo electrónico usando PHP?

312

Estoy usando PHP en un sitio web y quiero agregar la funcionalidad de correo electrónico.

Tengo instalado WAMPSERVER.

¿Cómo envío un correo electrónico usando PHP?

usuario590849
fuente
19
Leer el manual
diEcho

Respuestas:

443

Usando la mail()función de PHP es posible. Recuerde que la función de correo no funcionará en un servidor local.

<?php
$to      = '[email protected]';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: [email protected]' . "\r\n" .
    'Reply-To: [email protected]' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?> 

Referencia:

Muthu Kumaran
fuente
66
¿Qué pasa si necesito enviar un correo electrónico desde el servidor local? Quiero decir, ¿hay alguna forma de acceder al servidor de correo más cercano y hacer que envíe un correo por mí? Quiero decir que puedo encontrar la dirección de un servidor de correo de Yahoo y luego uso ese servidor para fines de correo ... ¿Es esto posible?
user590849
19
Necesita configurar SMTP en su servidor local. Echa un vistazo a esta publicación similar, stackoverflow.com/questions/4652566/php-mail-setup-in-xampp
Muthu Kumaran
Hola @MuthuKumaran, si eso entra en el correo basura, ¿hay alguna buena solución para resolverlo? Responde.
Muhammad Ashikuzzaman
@MuhammadAshikuzzaman No puede resolver el problema de spam en PHP. Haga una nueva pregunta en el sitio apropiado de StackExchange si todavía es relevante.
Uli Köhler
¿Cómo asegurarme o verificar si esto funciona en mi servidor local? Si no hay métodos posibles para hacerlo, sugiera algunas alternativas por favor. gracias.
abhishah901
121

También puede usar la clase PHPMailer en https://github.com/PHPMailer/PHPMailer .

Le permite usar la función de correo o usar un servidor smtp de forma transparente. También maneja correos electrónicos y archivos adjuntos basados ​​en HTML para que no tenga que escribir su propia implementación.

La clase es estable y es utilizada por muchos otros proyectos como Drupal, SugarCRM, Yii y Joomla!

Aquí hay un ejemplo de la página anterior:

<?php
require 'PHPMailerAutoload.php';

$mail = new PHPMailer;

$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'smtp1.example.com;smtp2.example.com';  // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = '[email protected]';                 // SMTP username
$mail->Password = 'secret';                           // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable encryption, 'ssl' also accepted

$mail->From = '[email protected]';
$mail->FromName = 'Mailer';
$mail->addAddress('[email protected]', 'Joe User');     // Add a recipient
$mail->addAddress('[email protected]');               // Name is optional
$mail->addReplyTo('[email protected]', 'Information');
$mail->addCC('[email protected]');
$mail->addBCC('[email protected]');

$mail->WordWrap = 50;                                 // Set word wrap to 50 characters
$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
$mail->isHTML(true);                                  // Set email format to HTML

$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}
norteo
fuente
44
Si no está usando el compositor:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower
43

Si está interesado en el correo electrónico con formato html, asegúrese de pasar Content-type: text/html;el encabezado. Ejemplo:

// multiple recipients
$to  = '[email protected]' . ', '; // note the comma
$to .= '[email protected]';

// subject
$subject = 'Birthday Reminders for August';

// message
$message = '
<html>
<head>
  <title>Birthday Reminders for August</title>
</head>
<body>
  <p>Here are the birthdays upcoming in August!</p>
  <table>
    <tr>
      <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
    </tr>
    <tr>
      <td>Joe</td><td>3rd</td><td>August</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Additional headers
$headers .= 'To: Mary <[email protected]>, Kelly <[email protected]>' . "\r\n";
$headers .= 'From: Birthday Reminder <[email protected]>' . "\r\n";
$headers .= 'Cc: [email protected]' . "\r\n";
$headers .= 'Bcc: [email protected]' . "\r\n";

// Mail it
mail($to, $subject, $message, $headers);

Para más detalles, verifique la función de correo php .

Sumoanand
fuente
Hola, cansé este código, agregué 3 destinatarios, uno de Hotmail, uno de Gmail y otro de mi sitio web. Recibí todo excepto en Hotmail. ¿Tienes una idea de por qué no funciona para Hotmail?
Antf
Verifique la carpeta de spam en ese caso.
Sumo y el
Ya lo hice, no está en el spam, no está llegando en absoluto. Leí un poco más sobre el tema y parece que Hotmail requiere un encabezado especial o no permite que el correo electrónico pase a sus servidores ... Sin embargo, todavía no encontré la solución.
antf
Resolví mi problema usando PHPMailer e ingresando los datos de mi cuenta de correo electrónico con SSL en el objeto de correo electrónico de PHPMailer.
antf
¿Qué pasa si el mensaje tiene contenido HTML y PHP?
14

También mire el paquete de correo PEAR Página de correo Pear

Parece ser un poco más robusto que la función de correo estándar () incorporada (si la función estándar no es adecuada).

Aquí hay un extracto de esta página que muestra cómo se usa. Uso de PEAR Mail send ()

<?php
    include('Mail.php');

    $recipients = '[email protected]';

    $headers['From']    = '[email protected]';
    $headers['To']      = '[email protected]';
    $headers['Subject'] = 'Test message';

    $body = 'Test message';

    $smtpinfo["host"] = "smtp.server.com";
    $smtpinfo["port"] = "25";
    $smtpinfo["auth"] = true;
    $smtpinfo["username"] = "smtp_user";
    $smtpinfo["password"] = "smtp_password";


    // Create the mail object using the Mail::factory method
    $mail_object =& Mail::factory("smtp", $smtpinfo); 

    $mail_object->send($recipients, $headers, $body);
?> 
Kevin S
fuente
proporcione un enlace de descarga de su enlace mail.php usado y todos los demás archivos asociados en una carpeta. Gracias
Muhammad Ashikuzzaman
1
@Ashik El Mail.phparchivo al que se hace referencia en mi ejemplo es parte del paquete Pear Mail. Si descarga e instala el paquete Pear Mail, podrá incluirlo Mail.php. Si hace clic en el enlace 'Página de correo Pear' arriba, hay un enlace de descarga con instrucciones.
Kevin S
12

Para la mayoría de los proyectos, uso el correo Swift en estos días. Es un enfoque orientado a objetos muy flexible y elegante para enviar correos electrónicos, creado por las mismas personas que nos dieron el popular framework Symfony y el motor de plantillas Twig .


Uso básico:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

Consulte la documentación oficial para obtener más información sobre cómo usar el correo Swift.

John Slegers
fuente
Hola. Dijiste Swift_MailTransportcuando tu enlace a la documentación dice Swift_SendmailTransport. ¿Significa que te referías a una versión anterior de swift mailer o es un error tipográfico, o tal vez no entiendo algo? Necesito instalar una versión anterior de swift-mailer porque no tengo php7 en mi servidor. Así que necesito saber si la documentación de la versión actual iría con una versión anterior del paquete. Gracias.
Yevgeniy Afanasyev
1
@YevgeniyAfanasyev: Mi respuesta fue la forma correcta de hacer las cosas hace 2 años, pero Swift_MailTransport ha quedado en desuso desde Swiftmailer v5.4.5 . De todos modos, si no puede usar PHP 7 para su proyecto, debe usar Swiftmailer v5.4.9. Esa es la última versión estable que aún admite PHP 5. Para la documentación de la versión v5.4.9 o detalles sobre las diferencias entre v5.4.9 y v6.0.2, es posible que desee ponerse en contacto con Fabien Potencier o plantear un problema en Github .
John Slegers
Muchas gracias. Por lo tanto, no hay documentación disponible para versiones anteriores, cuando los distributivos están disponibles. Bueno saber.
Yevgeniy Afanasyev
7

Este es un método muy básico para enviar correos electrónicos de texto sin formato mediante la función de correo.

<?php
$to = '[email protected]';
$subject = 'This is subject';
$message = 'This is body of email';
$from = "From: FirstName LastName <[email protected]>";
mail($to,$subject,$message,$from);

fuente
5

Ejemplo de código completo.

Pruébalo una vez ...

<?php
// Multiple recipients
$to = '[email protected], [email protected]'; // note the comma

// Subject
$subject = 'Birthday Reminders for August';

// Message
$message = '
<html>
<head>
  <title>Birthday Reminders for August</title>
</head>
<body>
  <p>Here are the birthdays upcoming in August!</p>
  <table>
    <tr>
      <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
    </tr>
    <tr>
      <td>Johny</td><td>10th</td><td>August</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// To send HTML mail, the Content-type header must be set
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859-1';

// Additional headers
$headers[] = 'To: Mary <[email protected]>, Kelly <[email protected]>';
$headers[] = 'From: Birthday Reminder <[email protected]>';
$headers[] = 'Cc: [email protected]';
$headers[] = 'Bcc: [email protected]';

// Mail it
mail($to, $subject, $message, implode("\r\n", $headers));
?>
Sr. HK
fuente
5

Para futuros lectores: intente esto si otras respuestas no funcionan (como fue el caso conmigo):

1.) Descargue PHPMailer , abra el archivo zip y extraiga la carpeta en el directorio de su proyecto.

3.) Cambie el nombre del directorio extraído a PHPMailer y escriba el siguiente código dentro de su script php (el script debe estar fuera de la carpeta PHPMailer )

<?php
// PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer; 
use PHPMailer\PHPMailer\Exception;
// Base files 
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
// create object of PHPMailer class with boolean parameter which sets/unsets exception.
$mail = new PHPMailer(true);                              
try {
    $mail->isSMTP(); // using SMTP protocol                                     
    $mail->Host = 'smtp.gmail.com'; // SMTP host as gmail 
    $mail->SMTPAuth = true;  // enable smtp authentication                             
    $mail->Username = '[email protected]';  // sender gmail host              
    $mail->Password = 'password'; // sender gmail host password                          
    $mail->SMTPSecure = 'tls';  // for encrypted connection                           
    $mail->Port = 587;   // port for SMTP     

    $mail->setFrom('[email protected]', "Sender"); // sender's email and name
    $mail->addAddress('[email protected]', "Receiver");  // receiver's email and name

    $mail->Subject = 'Test subject';
    $mail->Body    = 'Test body';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) { // handle error.
    echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}
?>
Ahtisham
fuente
5

La función nativa de PHP mail()no funciona para mí. Emite el mensaje:

503 Este servidor de correo requiere autenticación cuando se intenta enviar a una dirección de correo electrónico no local

Entonces, usualmente uso PHPMailer paquete

He descargado la versión 5.2.23 de: GitHub .

Acabo de elegir 2 archivos y los puse en mi raíz PHP fuente

class.phpmailer.php
class.smtp.php

En PHP, el archivo debe agregarse

require_once('class.smtp.php');
require_once('class.phpmailer.php');

Después de esto, es solo código:

require_once('class.smtp.php');
require_once('class.phpmailer.php');
... 
//----------------------------------------------
// Send an e-mail. Returns true if successful 
//
//   $to - destination
//   $nameto - destination name
//   $subject - e-mail subject
//   $message - HTML e-mail body
//   altmess - text alternative for HTML.
//----------------------------------------------
function sendmail($to,$nameto,$subject,$message,$altmess)  {

  $from  = "[email protected]";
  $namefrom = "yourname";
  $mail = new PHPMailer();  
  $mail->CharSet = 'UTF-8';
  $mail->isSMTP();   // by SMTP
  $mail->SMTPAuth   = true;   // user and password
  $mail->Host       = "localhost";
  $mail->Port       = 25;
  $mail->Username   = $from;  
  $mail->Password   = "yourpassword";
  $mail->SMTPSecure = "";    // options: 'ssl', 'tls' , ''  
  $mail->setFrom($from,$namefrom);   // From (origin)
  $mail->addCC($from,$namefrom);      // There is also addBCC
  $mail->Subject  = $subject;
  $mail->AltBody  = $altmess;
  $mail->Body = $message;
  $mail->isHTML();   // Set HTML type
//$mail->addAttachment("attachment");  
  $mail->addAddress($to, $nameto);
  return $mail->send();
}

Funciona a las mil maravillas

Paulo Buchsbaum
fuente
2
Gracias por su respuesta. Tienes la misma sugerencia que @norteo indicó en su respuesta. Tenga en cuenta que la v5.2 está en desuso y no recibe actualizaciones de seguridad. Para v6 puede requerir directamente:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower
4

La forma principal de enviar correos electrónicos desde PHP es usar su mail()función integrada, pero hay un par de SDK listos para usar que pueden facilitar la integración:

  1. Swiftmailer
  2. PHPMailer
  3. Pepipost (funciona a través de HTTP, por lo tanto, se puede evitar el problema de bloqueo de puerto SMTP)
  4. Enviar correo

PD: Estoy empleado con Pepipost.

Dibya Sahoo
fuente
3
Estás empleado con Pepipost y pones a Pepipost en el n. ° 3. +1
GeneCode
2
@GeneCode, si algo es mejor, entonces lo es. No importa si trabajas con ellos o no :) Swiftmailer y PHPMailer, son definitivamente una de las mejores herramientas de código abierto para enviar correos electrónicos (por lo tanto, los guardé en 1 y 2). Pero, al mismo tiempo, tienen ciertas limitaciones y bloqueadores que intentamos abordar en nuestro Pepipost SDK.
Dibya Sahoo
1

Envió el correo electrónico con este script

<h2>Test Mail</h2>
<?php

if (!isset($_POST["submit"]))
  {
  ?>
  <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
  From: <input type="text" name="from"><br>
  Subject: <input type="text" name="subject"><br>
  Message: <textarea rows="10" cols="40" name="message"></textarea><br>
  <input type="submit" name="submit" value="Click To send mail">
  </form>
  <?php
  }

else

  {

  if (isset($_POST["from"]))
    {
    $from = $_POST["from"]; // sender
    $subject = $_POST["subject"];
    $message = $_POST["message"];

    $message = wordwrap($message, 70);

    mail("[email protected]",$subject,$message,"From: $from\n");
    echo "Thank you for sending an email";
    }
  }
?>

Una vez que presione el botón Enviar correo electrónico, el correo electrónico se enviará a [email protected]

Hiren Parghi
fuente
1
<?php
include "db_conn.php";//connection file
require "PHPMailerAutoload.php";// it will be in PHPMailer
require "class.smtp.php";// it will be in PHPMailer
require "class.phpmailer.php";// it will be in PHPMailer


$response = array();
$params = json_decode(file_get_contents("php://input"));

if(!empty($params->email_id)){

    $email_id = $params->email_id;
    $flag=false;
    echo "something";
    if(!filter_var($email_id, FILTER_VALIDATE_EMAIL))
    {
        $response['ERROR']='EMAIL address format error'; 
        echo json_encode($response,JSON_UNESCAPED_SLASHES);
        return;
    }
    $sql="SELECT * from sales where email_id ='$email_id' ";

    $result = mysqli_query($conn,$sql);
    $count = mysqli_num_rows($result);

    $to = "[email protected]";
    $subject = "DEMO Subject";
    $messageBody ="demo message .";

    if($count ==0){
        $response["valid"] = false;
        $response["message"] = "User is not registered yet";
        echo json_encode($response);
        return;
    }

    else {

        $mail = new PHPMailer();
        $mail->IsSMTP();
        $mail->SMTPAuth = true; // authentication enabled
        $mail->IsHTML(true); 
        $mail->SMTPSecure = 'ssl';//turn on to send html email
        // $mail->Host = "ssl://smtp.zoho.com";
        $mail->Host = "p3plcpnl0749.prod.phx3.secureserver.net";//you can use gmail 
        $mail->Port = 465;
        $mail->Username = "[email protected]";
        $mail->Password = "demopassword";
        $mail->SetFrom("[email protected]", "Any demo alert");
        $mail->Subject = $subject;

        $mail->Body = $messageBody;
        $mail->AddAddress($to);
        echo "yes";

        if(!$mail->send()) {
           echo "Mailer Error: " . $mail->ErrorInfo;
       } 
       else {
           echo "Message has been sent successfully";
      }
    }

}
else{
    $response["valid"] = false;
    $response["message"] = "Required field(s) missing";
    echo json_encode($response);
}


?>

El código anterior está funcionando para mí.

Pooja Khatri
fuente