PHPMailer sur OVH en SMTP/POP3

Suite au fait que les emails envoyés par certains de mes sites ne sont plus reçus, j’ai cherché et trouvé une solution qui fonctionne conformément à mes attentes.

Contexte : VPS sur OVH, domaine OVH qui pointe vers ce VPS.

Première chose, j’utilisais déjà PHPMailer, une version précédente et domaine configuré pour SPF et DKIM. Donc mise à jour vers la source github de PHPMailer.

OVH n’est pas clair dans sa documentation quand vous en trouvez une qui est cohérente avec le reste et à jour. Basez vous sur le mail reçus lorsque vous créez votre compte. Le mail vous donne les ports et adresses à utiliser ainsi que l’indication très importante : connexion POP3 avant SMTP.

Par bonheur, la doc de PHPMailer fourni un exemple complet en ce sens.

//Authenticate via POP3.
//After this you should be allowed to submit messages over SMTP for a while.
//Only applies if your host supports POP-before-SMTP.
$pop = POP3::popBeforeSmtp('pop3.example.com', 110, 30, 'username', 'password', 1);

//Create a new PHPMailer instance
//Passing true to the constructor enables the use of exceptions for error handling
$mail = new PHPMailer(true);
try {
    $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 = "mail.example.com";
    //Set the SMTP port number - likely to be 25, 465 or 587
    $mail->Port = 25;
    //Whether to use SMTP authentication
    $mail->SMTPAuth = false;
    //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 POP-before-SMTP test';
    //Read an HTML message body from an external file, convert referenced images to embedded,
    //and convert the 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
    //Note that we don't need check the response from this because it will throw an exception if it has trouble
    $mail->send();
    echo "Message sent!";
} catch (phpmailerException $e) {
    echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
    echo $e->getMessage(); //Boring error messages from anything else!
}

Il vous suffit de mettre les valeurs qui vous sont transmise et … ça n’ira pas encore.

Il va vous falloir vous connecter également à SMTP.

//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication
$mail->Username = "yourname@example.com";
//Password to use for SMTP authentication
$mail->Password = "yourpassword";

Il vous suffit de modifier SMTPAuth de false à true et d’ajouter les 2 lignes et c’est fini !

Badawok

Note à ceux qui utilisent le framework badawok (v7 dans mon cas), vous aurez un conflit entre votre classe mailer et base_mailer car badawok utilise déjà un PHPMailer.

Supprimez l’extend de la classe base_mailer et ajouter les require_once des classes : phpmailer, smtp et pop3. Créez un répertoire vendor dans votre projet pour y mettre proprement les 3 classes de PHPMailer et le tour sera facilement joué.

La v7 étant uniquement patchée pour le moment, cette modification ne sera pas répercutée.

4 réflexions au sujet de « PHPMailer sur OVH en SMTP/POP3 »

  1. j’ai suivi ton tuto mais j’arrive toujours pas a envoyer l’email voici l’erreur
    Server -> Client: +OK Welcome to OVH Mail server 181 Server -> Client: +OK Server -> Client: +OK Logged in. SMTP ERROR: Failed to connect to server: Connection timed out (110)
    SMTP connect() failed.

    1. Pour t’aider il me faudrait ta portion de code.
      De plus on dirait une erreur de credentials.
      Tu as vérifié tes paramètres ?

    2. 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 = « ns0.ovh.net »;
      //Set the SMTP port number – likely to be 25, 465 or 587
      $mail->Port = 2525;
      $mail->setLanguage(‘fr’, ‘language’);
      //Whether to use SMTP authentication
      $mail->SMTPAuth = true;
      $mail->Username = « x@domaine.com »; // GMAIL username
      $mail->Password = « mdp »;
      //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(‘x@dotmain.com’, ‘John Doe’);
      //Set the subject line
      $mail->Subject = ‘PHPMailer POP-before-SMTP test’;
      //Read an HTML message body from an external file, convert referenced images to embedded,
      //and convert the 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->Body = « 587 »;
      $mail->AltBody = ‘This is a plain-text message body’;
      //Attach an image file
      //$mail->addAttachment(‘images/phpmailer_mini.png’);
      //send the message
      //Note that we don’t need check the response from this because it will throw an exception if it has trouble
      $mail->send();
      echo « Message sent! »;
      } catch (phpmailerException $e) {
      echo $e->errorMessage(); //Pretty error messages from PHPMailer
      } catch (Exception $e) {
      echo $e->getMessage(); //Boring error messages from anything else!
      }

      ?>

    3. Salut,

      Ça répond pas vraiment à la question, le copié-collé n’aide pas. Fait un différentiel de code pour indiquer ce que tu modifié / adapté. Et as-tu vérifié tes paramètres : login, pw, serveur, … ? As-tu configuré sur le manager OVH ton e-mail et récupéré le mails ? Les infos sont dedans.

      Courage

Les commentaires sont fermés.