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 <[email protected]>";
$to = "Ramona Recipient <[email protected]>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "smtp.gmail.com";
$port = "587";
$username = "[email protected]";
$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>");
 }
?>
skb
fuente

Respuestas:

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

$from = '<[email protected]>';
$to = '<[email protected]>';
$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' => '[email protected]',
        'password' => 'passwordxxx'
    ));

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

if (PEAR::isError($mail)) {
    echo('<p>' . $mail->getMessage() . '</p>');
} else {
    echo('<p>Message successfully sent!</p>');
}
pavan kumar
fuente
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 [email protected] 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('[email protected]' => 'ABC'))
  ->setTo(array('[email protected]'))
  ->setBody('This is a test mail.');

$result = $mailer->send($message);
?>
shasi kanth
fuente
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('[email protected]') // 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('[email protected]' => 'Sender Name')) // can be $_POST['email'] etc...
    ->setTo(array('[email protected]' => '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 ... :)

Madan Sapkota
fuente
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   = "[email protected]";  // GMAIL username
$mail->Password   = "password";            // GMAIL password

$mail->SetFrom('[email protected]', 'PRSPS');

//$mail->AddReplyTo("[email protected]', '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 = "[email protected]";
$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!";
}

?>
Raghav profundo
fuente
¿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));
Pekka
fuente
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.

s01ipsist
fuente
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 = "[email protected]";
//Password to use for SMTP authentication
$mail->Password = "yourpassword";
//Set who the message is to be sent from
$mail->setFrom('[email protected]', 'First Last');
//Set an alternative reply-to address
$mail->addReplyTo('[email protected]', 'First Last');
//Set who the message is to be sent to
$mail->addAddress('[email protected]', '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!";
}
Bhavin Solanki
fuente
5

Tuve este problema también. Establecí la configuración correcta y habilité aplicaciones menos seguras, pero aún así no funcionó. Finalmente, habilité este https://accounts.google.com/UnlockCaptcha , y funcionó para mí. Espero que esto ayude a alguien.

Estratega
fuente
4

Gmail requiere el puerto 465, y también es el código de phpmailer :)

Peter Mortensen
fuente
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
Nahid
fuente
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 ...".

Diego Andrés Díaz Espinoza
fuente
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);
    ?>
sjuesju
fuente