web-dev-qa-db-fra.com

SMTP connect () a échoué PHPmailer - PHP

Je suis nouveau en PHP. J'essayais de m'envoyer un exemple de courrier électronique via PHPmailer. J'utilise le serveur smtp de gmail. J'essaie d'envoyer un exemple de courrier de mon compte gmail à mon compte yahoo. Mais j'obtiens l'erreur: Mailer Error: SMTP connect() failed. 
Voici le code: 

<?php

require "class.phpmailer.php";
$mail = new PHPMailer(); 
$mail->IsSMTP();                              // send via SMTP
$mail->Host = "ssl://smtp.gmail.com";
$mail->SMTPAuth = true;                       // turn on SMTP authentication
$mail->Username = "[email protected]";        // SMTP username
$mail->Password = "mypassword";               // SMTP password
$webmaster_email = "[email protected]";       //Reply to this email ID
$email="[email protected]";                // Recipients email ID
$name="My Name";                              // Recipient's name
$mail->From = $webmaster_email;
$mail->Port = 465;
$mail->FromName = "My Name";
$mail->AddAddress($email,$name);
$mail->AddReplyTo($webmaster_email,"My Name");
$mail->WordWrap = 50;                         // set Word wrap
$mail->IsHTML(true);                          // send as HTML
$mail->Subject = "subject";
$mail->Body = "Hi,
This is the HTML BODY ";                      //HTML Body 
$mail->AltBody = "This is the body when user views in plain text format"; //Text Body 

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

J'utilise le serveur WAMP sur un ordinateur Windows 7 64 bits. Quel pourrait être le problème?
S'il vous plaît, aidez-moi à résoudre ce problème. Merci! 

12
Chinmay Dabke

Vous devez ajouter le paramètre Host

$mail->Host = "ssl://smtp.gmail.com"; 

Vérifiez également si vous avez activé open_ssl.

<?php
echo !extension_loaded('openssl')?"Not Available":"Available";
9

La solution de ce problème est vraiment très simple. En fait, Google commence à utiliser un nouveau mécanisme d'autorisation pour son utilisateur. vous avez peut-être vu une autre ligne dans la console de débogage vous invitant à vous connecter à votre compte à l'aide de n'importe quel navigateur.! ceci est dû au nouveau mécanisme d'authentification XOAUTH2 que Google utilise depuis 2014 . souvenez-vous de… n'utilisez pas le ssl sur le port 465, mais plutôt tls sur 587. c'est simplement à cause du mécanisme d'authentification XOAUTH2. si vous utilisez ssl au-dessus de 465, votre demande sera renvoyée.

connectez-vous à votre compte Google et ouvrez l’adresse suivante https://www.google.com/settings/security/lesssecureapps et vérifiez activer vous devez le faire pour vous permettre de vous connecter au SMTP de Google car, selon le nouveau mécanisme d'authentification, Google renvoie toutes les demandes de toutes ces applications qui ne suivent aucune technique de cryptage standard .. après vérification, activez .. vous êtes prêt à go .. voici le code qui a bien fonctionné pour moi ..

require_once 'C:\xampp\htdocs\email\vendor\autoload.php';

define ('GUSER','[email protected]');
define ('GPWD','your password');


// make a separate file and include this file in that. call this function in that file.

function smtpmailer($to, $from, $from_name, $subject, $body) { 
    global $error;
    $mail = new PHPMailer();  // create a new object
    $mail->IsSMTP(); // enable SMTP
    $mail->SMTPDebug = 2;  // debugging: 1 = errors and messages, 2 = messages only
    $mail->SMTPAuth = true;  // authentication enabled
    $mail->SMTPSecure = 'tls'; // secure transfer enabled REQUIRED for GMail
    $mail->SMTPAutoTLS = false;
    $mail->Host = 'smtp.gmail.com';
    $mail->Port = 587;

    $mail->Username = GUSER;  
    $mail->Password = GPWD;           
    $mail->SetFrom($from, $from_name);
    $mail->Subject = $subject;
    $mail->Body = $body;
    $mail->AddAddress($to);
    if(!$mail->Send()) {
        $error = 'Mail error: '.$mail->ErrorInfo; 
        return false;
    } else {
        $error = 'Message sent!';
        return true;
    }
}
15
Rizwan Akhwandzada

Résolution d'un problème presque identique en ajoutant ces lignes à la configuration standard de PHPMailer. Fonctionne comme un charme.

$mail->SMTPKeepAlive = true;   
$mail->Mailer = “smtp”; // don't change the quotes!

Je suis tombé sur ce code (de Simon Chen) alors qu'il recherchait une solution ici, https://webolio.wordpress.com/2008/03/02/phpmailer-and-smtp-on-1and1-shared-hosting/#comment- 89

4
Lynton Black

Dépannage

Vous avez ajouté ce code:

 $mail->SMTPOptions = array(
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        )
    );

Et Activer Autoriser les applications moins sécurisées : "Résoudra généralement le problème pour PHPMailer, mais ne rendra pas votre application beaucoup moins sécurisée. alors ne vous attendez pas à une solution immédiate "

Ce travail pour moi!

2
Jhonattan

Si quelqu'un ne parvient toujours pas à résoudre le problème, veuillez consulter le fil suivant et suivre la réponse de callmebob.

PHPMailer - SMTP ERROR: La commande de mot de passe a échoué lors de l'envoi de courrier électronique depuis mon serveur

1
A.M.N.Bandara

si tout échoue, pour Gmail, vous devez activer l'accès aux applications tierces pour vous connecter à votre compte gmail.

https://www.google.com/settings/security/lesssecureapps // tournez-le sur

1
user889030

Il vous manque la directive indiquant que la connexion utilise SSL

require ("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP(); 
$mail->SMTPAuth = true;     // turn of SMTP authentication
$mail->Username = "YAHOO ACCOUNT";  // SMTP username
$mail->Password = "YAHOO ACCOUNT PASSWORD"; // SMTP password
$mail->SMTPSecure = "ssl";
$mail->Host = "YAHOO Host"; // SMTP Host
$mail->Port = 465;

Ajoutez ensuite les autres parties

$webmaster_email = "[email protected]";       //Reply to this email ID
$email="[email protected]";                // Recipients email ID
$name="My Name";                              // Recipient's name
$mail->From = $webmaster_email;
$mail->FromName = "My Name";
$mail->AddAddress($email,$name);
$mail->AddReplyTo($webmaster_email,"My Name");
$mail->WordWrap = 50;                         // set Word wrap
$mail->IsHTML(true);                          // send as HTML
$mail->Subject = "subject";
$mail->Body = "Hi,
This is the HTML BODY ";                      //HTML Body 
$mail->AltBody = "This is the body when user views in plain text format"; //Text Body 

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

En passant, j'ai eu du mal à utiliser Body + AltBody ensemble, bien qu'ils soient censés fonctionner. En conséquence, j’ai écrit la fonction d’emballage suivante qui fonctionne parfaitement.

<?php
require ("class.phpmailer.php");

// Setup Configuration for Mail Server Settings
$email['Host']          = 'smtp.email.com';
$email['port']          = 366;
$email['user']          = '[email protected]';
$email['pass']          = 'from password';
$email['from']          = 'From Name';
$email['reply']         = '[email protected]';
$email['replyname']     = 'Reply To Name';

$addresses_to_mail_to = '[email protected];[email protected]';
$email_subject = 'My Subject';
$email_body = '<html>Code Here</html>';
$who_is_receiving_name = 'John Smith';

$result = sendmail(
    $email_body,
    $email_subject,
    $addresses_to_mail_to,
    $who_is_receiving_name
);

var_export($result);


function sendmail($body, $subject, $to, $name, $attach = "") {

  global $email;
  $return = false;

  $mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch
  $mail->IsSMTP(); // telling the class to use SMTP
  try {
    $mail->Host       = $email['Host']; // SMTP server
//    $mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
    $mail->SMTPAuth   = true;                  // enable SMTP authentication
    $mail->Host       = $email['Host']; // sets the SMTP server
    $mail->Port       = $email['port'];                    // set the SMTP port for the GMAIL server
    $mail->SMTPSecure = "tls";
    $mail->Username   = $email['user']; // SMTP account username
    $mail->Password   = $email['pass'];        // SMTP account password
    $mail->AddReplyTo($email['reply'], $email['replyname']);
    if(stristr($to,';')) {
      $totmp = explode(';',$to);
      foreach($totmp as $destto) {
        if(trim($destto) != "") {
          $mail->AddAddress(trim($destto), $name);
        }
      }
    } else {
      $mail->AddAddress($to, $name);
    }
    $mail->SetFrom($email['user'], $email['from']);
    $mail->Subject = $subject;
    $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
    $mail->MsgHTML($body);
    if(is_array($attach)) {
        foreach($attach as $attach_f) {
            if($attach_f != "") {
              $mail->AddAttachment($attach_f);      // attachment
            }
        }
    } else {
        if($attach != "") {
          $mail->AddAttachment($attach);      // attachment
        }
    }
    $mail->Send();
  } catch (phpmailerException $e) {
    $return = $e->errorMessage();
  } catch (Exception $e) {
    $return = $e->errorMessage();
  }

  return $return;
}
1
Kraang Prime

S'il vous plaît regarder cela

Je l'ai corrigé ...

Activez cet accès et profitez-en ..! C'est sur les paramètres du compte Gmail.

https://github.com/PHPMailer/PHPMailer/tree/5.2-stable

<?php
require 'PHPMailerAutoload.php';

$mail = new PHPMailer;

//$mail->SMTPDebug = 3;                               // Enable verbose debug output

$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com';  // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = '[email protected]';                 // SMTP username
$mail->Password = 'pass';                           // SMTP password
//$mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
$mail->Port = 25;                                    // TCP port to connect to

$mail->setFrom('[email protected]', 'Mailer');
$mail->addAddress('[email protected]', 'User');     // Add a recipient

$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';
}

0
Musab ibnu Siraj

Si vous utilisez VPS et avec le service httpd, veuillez vérifier si votre httpd_can_sendmail est activé.

getsebool -a | grep mail

mettre sur

setsebool -P httpd_can_sendmail on
0
Maki92