web-dev-qa-db-fra.com

Envoi d'e-mails via SMTP avec PHPMailer

J'essaie d'envoyer des courriers électroniques SMTP à l'aide de PHPMailer, mais je continue à recevoir ce message d'erreur. Avez-vous des idées pour vous en débarrasser?
J'essaie de me connecter via SSL sur le port 465.

SMTP -> FROM SERVER: 
SMTP -> FROM SERVER: 
SMTP -> ERROR: EHLO not accepted from server: 

Notice: fputs() [function.fputs]: send of 18 bytes failed with errno=32 Roura přerušena (SIGPIPE) in /home/www/amazonek.cz/subdomains/library/PHPMailer_v5.1/class.smtp.php on line 494
SMTP -> FROM SERVER: 
SMTP -> ERROR: HELO not accepted from server: 

Notice: fputs() [function.fputs]: send of 12 bytes failed with errno=32 Roura přerušena (SIGPIPE) in /home/www/amazonek.cz/subdomains/library/PHPMailer_v5.1/class.smtp.php on line 212
SMTP -> ERROR: AUTH not accepted from server: 
SMTP Error: Could not authenticate.

Mon code:

  require_once('../library/PHPMailer_v5.1/class.phpmailer.php');

        try{
            $mail = new PHPMailer(true);
            $mail->IsSMTP();
            $mail->SMTPAuth = true;
            $mail->Host = SMTP_SERVER;
            $mail->Port = SMTP_PORT;
            $mail->Username = SMTP_USERNAME;
            $mail->Password = SMTP_PASSWORD;
            $mail->SMTPDebug = 2;
            $mail->SetFrom(MAIL_ORDERS_ADDRESS, MAIL_ORDERS_NAME);
            $mail->Subject = 'AMAZONEK.cz - objednávka číslo '.$_SESSION['orderId'];
            $mail->MsgHTML('<b>Ahoj</b>');
            $mail->AddAddress($_SESSION['user']['email'], $_SESSION['user']['name'].' '.$_SESSION['user']['surname']);
            $mail->AddBCC(MAIL_ORDERS_ADDRESS, MAIL_ORDERS_NAME);

            if(!$mail->Send()) throw new Exception($mail->ErrorInfo);
        }
        catch(Exception $e){
            echo $e->getMessage();
        }

Définition des constantes:

define('SMTP_SERVER', 'smtp.ebola.cz');
define('SMTP_PORT', 465);
define('SMTP_USERNAME', '[email protected]');
define('SMTP_PASSWORD', '***CENSORED***');

define('MAIL_ORDERS_ADDRESS', '[email protected]');
define('MAIL_ORDERS_NAME', 'My Name');

Des idées?

14
cypher

Autant que je sache, tout va bien avec votre code. Votre erreur est:

Erreur SMTP: n'a pas pu authentifier.

Ce qui signifie que les informations d'identification que vous avez envoyées sont rejetées par le serveur SMTP. Assurez-vous que l'hôte, le port, le nom d'utilisateur et le mot de passe sont corrects.

Si vous souhaitez utiliser TLS, essayez d'ajouter:

$mail->SMTPSecure = 'tls';

Si vous voulez utiliser SSL, essayez d'ajouter:

$mail->SMTPSecure = 'ssl';

Garde en tête que:

  • Certains serveurs SMTP peuvent interdire les connexions des "étrangers".
  • Certains serveurs SMTP ne prennent pas en charge les connexions SSL (ou TLS).

Peut-être que cet exemple peut vous aider (GMail secure SMTP).

25
AlexV

Essayez d'envoyer un courrier électronique via ce serveur SMTP manuellement/à partir d'un logiciel de messagerie interactif (par exemple, Mozilla Thunderbird). Parmi les erreurs, il semble que le serveur n'accepte pas vos informations d'identification. Est-ce que SMTP s'exécute sur le port ou est-ce SSL + SMTP? Vous ne semblez pas utiliser de connexion sécurisée dans le code que vous avez posté et je ne sais pas si PHPMailer prend en charge SSL + SMTP.

(Premier résultat de la recherche sur Google du nom d'hôte de votre serveur SMTP: http://podpora.ebola.cz/idx.php/0/006/article/Strucny-technicky-popis-nastaveni-sluzeb.html semble dire "SMTP" envoi de mail: connexion sécurisée SSL, port: 465 ".)

PHPMailer semble prendre en charge SSL; au moins de ceci . Donc, vous devrez changer ceci:

define('SMTP_SERVER', 'smtp.ebola.cz');

dans ceci:

define('SMTP_SERVER', 'ssl://smtp.ebola.cz');
4
Piskvor

Cela peut sembler être un shot dans le noir mais assurez-vous que PHP a été respecté avec OpenSSL si SMTP requiert SSL.

Pour vérifier, utilisez phpinfo()

J'espère que ça aide!

2
Mikey1980

essayez le port 25 au lieu de 456.

J'ai eu la même erreur en utilisant le port 456 et en le changeant à 25, cela fonctionnait pour moi. 

2

SMTP -> FROM SERVER:
SMTP -> FROM SERVER:
SMTP -> ERREUR: EHLO non accepté du serveur:

c'est typique d'essayer de se connecter à un service SSL avec un client qui n'utilise pas SSL

Erreur SMTP: n'a pas pu authentifier.

aucune surprise n’ayant échoué à démarrer une conversation SMTP, l’authentification n’est pas une option.

phpmailer ne gère pas le protocole SSL implicite (aussi appelé TLS lors de la connexion, SMTPS).

Utilisez plutôt le port 587 avec le protocole SSL explicite (alias TLS, STARTTLS).

1
user340140

J'ai eu un problème très similaire pendant environ une heure, jusqu'à ce que je sache ce qui n'allait pas. Mon problème était que j'ai utilisé SSL, au lieu de ssl. Check est sensible à la casse dans le code. AlexV m'a guidé à la source du problème. Cela ne semble pas pertinent.

1
F-3000

Oui, vous avez besoin d'OpenSSL pour fonctionner correctement. Mon site de test de sauvegarde a fonctionné, pas mon serveur actif. Différence? Le serveur Live n’avait pas OpenSSL dans la configuration PHP.

1
Todd

Client smtp simple avec socket de flux php avec commande tls/ssl smtp STARTTLS: https://github.com/breakermind/PhpMimeParser/blob/master/PhpSmtpSslSocketClient.php

fonctionne avec gmail.com avec authentifier:

<?php
// Login email and password
$login = "[email protected]";
$pass = "123456";

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
stream_context_set_option($ctx, 'ssl', 'verify_peer_name', false);
try{
    // echo $socket = stream_socket_client('ssl://smtp.gmail.com:587', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
    echo $socket = stream_socket_client('tcp://smtp.gmail.com:587', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
    if (!$socket) {
        print "Failed to connect $err $errstr\n";
        return;
    }else{
        // Http
        // fwrite($socket, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
        // Smtp
        echo fread($socket,8192);
        echo fwrite($socket, "EHLO cool.xx\r\n");
        echo fread($socket,8192);

        // Start tls connection
        echo fwrite($socket, "STARTTLS\r\n");
        echo fread($socket,8192);

        echo stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);

        // Send ehlo
        echo fwrite($socket, "EHLO cool.xx\r\n");
        echo fread($socket,8192);

        // echo fwrite($socket, "MAIL FROM: <[email protected]>\r\n");
        // echo fread($socket,8192);

        echo fwrite($socket, "AUTH LOGIN\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, base64_encode($login)."\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, base64_encode($pass)."\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "rcpt to: <[email protected]>\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "DATA\n");
        echo fread($socket,8192);

        echo fwrite($socket, "Date: ".time()."\r\nTo: <[email protected]>\r\nFrom:<[email protected]\r\nSubject:Hello from php socket tls\r\n.\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "QUIT \n");
        echo fread($socket,8192);

        /* Turn off encryption for the rest */
        // stream_socket_enable_crypto($fp, false);

        fclose($socket);
    }
}catch(Exception $e){
    echo $e;
}
0
Max