Enviar correo electrónico utilizando el servidor GMail SMTP desde una página PHP


389

Estoy tratando de enviar un correo electrónico a través del servidor SMTP de GMail desde una página PHP, pero aparece este error:

error de autenticación [SMTP: el servidor SMTP no admite autenticación (código: 250, respuesta: mx.google.com a su servicio, [98.117.99.235] TAMAÑO 35651584 8BITMIME STARTTLS MEJORADO CÓDIGOS DE ESTADO PIPELINING)]

¿Alguien puede ayudar? Aquí está mi código:

<?php
require_once "Mail.php";

$from = "Sandra Sender <sender@example.com>";
$to = "Ramona Recipient <ramona@microsoft.com>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "smtp.gmail.com";
$port = "587";
$username = "testtest@gmail.com";
$password = "testtest";

$headers = array ('From' => $from,
  'To' => $to,
  'Subject' => $subject);
$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'port' => $port,
    'auth' => true,
    'username' => $username,
    'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
  echo("<p>" . $mail->getMessage() . "</p>");
 } else {
  echo("<p>Message successfully sent!</p>");
 }
?>

Respuestas:


357
// Pear Mail Library
require_once "Mail.php";

$from = '<fromaddress@gmail.com>';
$to = '<toaddress@yahoo.com>';
$subject = 'Hi!';
$body = "Hi,\n\nHow are you?";

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => 'johndoe@gmail.com',
        'password' => 'passwordxxx'
    ));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
    echo('<p>' . $mail->getMessage() . '</p>');
} else {
    echo('<p>Message successfully sent!</p>');
}

141
que es Mail.php?? ¿de dónde obtengo este archivo?
Zain Shaikh

18
alguien podría darme un enlace donde pueda obtener el archivo Mail.php. Porque lo intenté y no funcionaría Gracias
Yoosuf

11
¿Dónde están los símbolos @ en este ejemplo anterior? ¡No veo uno solo allí!
darkAsPitch

66
Creo que myaccount.gmail.com es lo mismo que myaccount@gmail.com en los estándares de correo electrónico.
Sherwin Flight

3
No necesita incluir @gmail si tiene el servidor especificado. Simplemente escriba myaccountpara nombre de usuario.
Jack

106

Usando el correo Swift , es bastante fácil enviar un correo a través de las credenciales de Gmail:

<?php
require_once 'swift/lib/swift_required.php';

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, "ssl")
  ->setUsername('GMAIL_USERNAME')
  ->setPassword('GMAIL_PASSWORD');

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance('Test Subject')
  ->setFrom(array('abc@example.com' => 'ABC'))
  ->setTo(array('xyz@test.com'))
  ->setBody('This is a test mail.');

$result = $mailer->send($message);
?>

2
Esto funcionó "al primero" simplemente cambiando las direcciones GMAIL_USERNAME, GMAIL_PASSWORD y From y To. Ninguna otra solución funcionó para mí. Gracias.
Marco Muciño

77
Estoy de acuerdo, el correo rápido es una solución de envío de correo mucho más fácil que jugar con Pear. No olvide habilitar la extensión php_openssl de PHP.
Soth

1
¡Buena solución con SwiftMailer! +1
Amal Murali

1
arrrgh. No puedo conseguir que Swiftmailer funcione. no sé cómo usar ese "compositor", así que acabo de descargar el zip swiftmailer de github, luego habilité open_ssl y luego proporcioné mi correo electrónico y contraseña de gmail, pero aún así no funcionó.
boi_echos

3
Ah, perdón por mi estupidez. debe abrir su cuenta de gmail porque hay un correo electrónico que le indica que habilite la "aplicación menos segura". entonces ahora funciona jejeh
boi_echos


33

No recomiendo Pear Mail. No se ha actualizado desde 2010. También lea los archivos de origen; el código fuente está casi desactualizado, escrito en estilo PHP 4 y se han publicado muchos errores / errores (Google). Estoy usando Swift Mailer.

Swift Mailer se integra en cualquier aplicación web escrita en PHP 5, ofreciendo un enfoque flexible y elegante orientado a objetos para enviar correos electrónicos con una multitud de características.

Envíe correos electrónicos utilizando SMTP, sendmail, postfix o una implementación de transporte personalizada propia.

Soporta servidores que requieren nombre de usuario y contraseña y / o cifrado.

Protéjase de los ataques de inyección de encabezado sin quitar el contenido de los datos de la solicitud.

Envíe correos electrónicos HTML / multiparte compatibles con MIME.

Use complementos controlados por eventos para personalizar la biblioteca.

Maneje archivos adjuntos grandes e imágenes en línea / incrustadas con poco uso de memoria.

Es un código abierto y gratuito que puede descargar Swift Mailer y cargar en su servidor. (La lista de funciones se copia del sitio web del propietario).

El ejemplo de trabajo de Gmail SSL / SMTP y Swift Mailer está aquí ...

// Swift Mailer Library
require_once '../path/to/lib/swift_required.php';

// Mail Transport
$transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
    ->setUsername('username@gmail.com') // Your Gmail Username
    ->setPassword('my_secure_gmail_password'); // Your Gmail Password

// Mailer
$mailer = Swift_Mailer::newInstance($transport);

// Create a message
$message = Swift_Message::newInstance('Wonderful Subject Here')
    ->setFrom(array('sender@example.com' => 'Sender Name')) // can be $_POST['email'] etc...
    ->setTo(array('receiver@example.com' => 'Receiver Name')) // your email / multiple supported.
    ->setBody('Here is the <strong>message</strong> itself. It can be text or <h1>HTML</h1>.', 'text/html');

// Send the message
if ($mailer->send($message)) {
    echo 'Mail sent successfully.';
} else {
    echo 'I am sure, your configuration are not correct. :(';
}

Espero que esto ayude. Feliz codificación ... :)


1
Esto ya no funciona, siempre recibo el mensaje de respuesta "535-5.7.8 Nombre de usuario y contraseña no aceptados". Mis credenciales están bien y configuré "permitir aplicaciones menos seguras" en ON. Alguien sabe una solución a esto?
AndrewB

Swift no parece funcionar en PHP 5.x - no entiende el ?? fusionarse, simplemente explota.
HerrimanCoder

28
<?php
date_default_timezone_set('America/Toronto');

require_once('class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail             = new PHPMailer();

$body             = "gdssdh";
//$body             = eregi_replace("[\]",'',$body);

$mail->IsSMTP(); // telling the class to use SMTP
//$mail->Host       = "ssl://smtp.gmail.com"; // SMTP server
$mail->SMTPDebug  = 1;                     // enables SMTP debug information (for testing)
                                           // 1 = errors and messages
                                           // 2 = messages only
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->SMTPSecure = "ssl";                 // sets the prefix to the servier
$mail->Host       = "smtp.gmail.com";      // sets GMAIL as the SMTP server
$mail->Port       = 465;                   // set the SMTP port for the GMAIL server
$mail->Username   = "user@gmail.com";  // GMAIL username
$mail->Password   = "password";            // GMAIL password

$mail->SetFrom('contact@prsps.in', 'PRSPS');

//$mail->AddReplyTo("user2@gmail.com', 'First Last");

$mail->Subject    = "PRSPS password";

//$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

$mail->MsgHTML($body);

$address = "user2@yahoo.co.in";
$mail->AddAddress($address, "user2");

//$mail->AddAttachment("images/phpmailer.gif");      // attachment
//$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

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

?>

¿Por qué configura el host dos veces y cuál es el correcto?
Emile Bergeron

¿Dónde obtengo el archivo class.phpmailer.php? Pegar solo el código no es tan útil, ¡los pls también incluyen más descripción sobre el código!
GeneCode

Si bien parte de la sintaxis está desactualizada, PHPMailer terminó siendo la mejor solución para mí, +1
zoltar

20

SwiftMailer puede enviar correos electrónicos utilizando servidores externos.

Aquí hay un ejemplo que muestra cómo usar un servidor de Gmail:

require_once "lib/Swift.php";
require_once "lib/Swift/Connection/SMTP.php";

//Connect to localhost on port 25
$swift =& new Swift(new Swift_Connection_SMTP("localhost"));


//Connect to an IP address on a non-standard port
$swift =& new Swift(new Swift_Connection_SMTP("217.147.94.117", 419));


//Connect to Gmail (PHP5)
$swift = new Swift(new Swift_Connection_SMTP(
    "smtp.gmail.com", Swift_Connection_SMTP::PORT_SECURE, Swift_Connection_SMTP::ENC_TLS));

14

El código que figura en la pregunta necesita dos cambios.

$host = "ssl://smtp.gmail.com";
$port = "465";

Se requiere el puerto 465 para una conexión SSL.


6

Enviar correo usando la biblioteca phpMailer a través de Gmail Descargue los archivos de la biblioteca de Github

<?php
/**
 * This example shows settings to use when sending via Google's Gmail servers.
 */
//SMTP needs accurate times, and the PHP time zone MUST be set
//This should be done in your php.ini, but this is how to do it if you don't have access to that
date_default_timezone_set('Etc/UTC');
require '../PHPMailerAutoload.php';
//Create a new PHPMailer instance
$mail = new PHPMailer;
//Tell PHPMailer to use SMTP
$mail->isSMTP();
//Enable SMTP debugging
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug = 2;
//Ask for HTML-friendly debug output
$mail->Debugoutput = 'html';
//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';
// use
// $mail->Host = gethostbyname('smtp.gmail.com');
// if your network does not support SMTP over IPv6
//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$mail->Port = 587;
//Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'tls';
//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication - use full email address for gmail
$mail->Username = "username@gmail.com";
//Password to use for SMTP authentication
$mail->Password = "yourpassword";
//Set who the message is to be sent from
$mail->setFrom('from@example.com', 'First Last');
//Set an alternative reply-to address
$mail->addReplyTo('replyto@example.com', 'First Last');
//Set who the message is to be sent to
$mail->addAddress('whoto@example.com', 'John Doe');
//Set the subject line
$mail->Subject = 'PHPMailer GMail SMTP test';
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
//Attach an image file
$mail->addAttachment('images/phpmailer_mini.png');
//send the message, check for errors
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}



4

Para instalar Mail.php de PEAR en Ubuntu, ejecute el siguiente conjunto de comandos:

    sudo apt-get install php-pear
    sudo pear install mail
    sudo pear install Net_SMTP
    sudo pear install Auth_SASL
    sudo pear install mail_mime

0

Tengo una solución para cuentas GSuite que no tiene el sufijo "@ gmail.com". También creo que funcionará para cuentas GSuite con @ gmail.com pero no lo he probado. Primero debe tener los privilegios para cambiar la opción "aplicación menos segura" para su cuenta GSuite. Si tiene los privilegios (puede verificar la configuración de la cuenta-> seguridad), entonces debe desactivar "autenticación de factor de dos pasos", vaya al final de la página y establezca "sí" para permitir aplicaciones menos seguras. Eso es todo. Si no tiene privilegios para cambiar esas opciones, la solución para este hilo no funcionará. Consulte https://support.google.com/a/answer/6260879?hl=es para realizar cambios en la opción "permitir menos ...".


0

Intenté la sugerencia ofrecida por @shasi kanth, pero no funcionó. Leí la documentación y hay pocos cambios realizados. Así que logré enviar correo a través de Gmail usando este código, donde vendor / autoload.php es obtenido por compositor con compositor que requiere "swiftmailer / swiftmailer: ^ 6.0":

<?php
     require_once 'vendor/autoload.php';
     $transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl'))->setUsername ('SendingMail')->setPassword ('Password');

     $mailer = new Swift_Mailer($transport);

     $message = (new Swift_Message('test'))
      ->setFrom(['Sending mail'])
      ->setTo(['Recipient mail'])
      ->setBody('Message')
  ;

     $result = $mailer->send($message);
    ?>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.