代码之家  ›  专栏  ›  技术社区  ›  cypher

使用PHPMailer通过SMTP发送电子邮件

  •  14
  • cypher  · 技术社区  · 16 年前

    我正在尝试使用PHPMailer发送SMTP电子邮件,但我不断收到此错误消息,有什么办法可以消除它吗?
    我正在尝试通过端口465上的SSL连接。

    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.
    

      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();
            }
    

    常量定义:

    define('SMTP_SERVER', 'smtp.ebola.cz');
    define('SMTP_PORT', 465);
    define('SMTP_USERNAME', 'myEmail@myDomain.tld');
    define('SMTP_PASSWORD', '***CENSORED***');
    
    define('MAIL_ORDERS_ADDRESS', 'myEmail@myDomain.tld');
    define('MAIL_ORDERS_NAME', 'My Name');
    

    8 回复  |  直到 16 年前
        1
  •  26
  •   AlexV    6 年前

    据我所知,你的代码一切正常。您的错误是:

    SMTP错误:无法进行身份验证。

    如果要使用STARTTLS,请尝试添加:

    $mail->SMTPSecure = 'tls';
    

    如果要使用SMTPS(SSL),请尝试添加:

    $mail->SMTPSecure = 'ssl';
    

    • 一些SMTP服务器可以禁止来自“外部”的连接。

    也许 吧 this example

    [Source]

        2
  •  4
  •   Piskvor left the building Rohit Kumar    16 年前

    尝试手动/从交互式邮件程序(如Mozilla Thunderbird)通过SMTP服务器发送电子邮件。从这些错误来看,服务器似乎不接受您的凭据。是在端口上运行的SMTP,还是SSL+SMTP?您在发布的代码中似乎没有使用安全连接,我也不确定PHPMailer是否真的支持SSL+SMTP。

    (谷歌搜索SMTP服务器主机名的第一个结果: http://podpora.ebola.cz/idx.php/0/006/article/Strucny-technicky-popis-nastaveni-sluzeb.html 似乎在说“SMTPs邮件发送:安全SSL连接,端口:465”。)

    看起来PHPMailer确实支持SSL;至少从 this

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

    对此:

    define('SMTP_SERVER', 'ssl://smtp.ebola.cz');
    
        3
  •  3
  •   Ludo - Off the record    13 年前

    尝试端口25而不是456。

        4
  •  2
  •   Mikey1980    16 年前

    这看起来像是 但是,如果SMTP需要SSL,请确保PHP符合OpenSSL。

    检查用途 phpinfo()

        5
  •  1
  •   Todd    15 年前

    是的,您需要OpenSSL才能正常工作。我的备份测试站点工作了,我的实时服务器没有。有什么区别吗?Live server在PHP配置中没有OpenSSL。

        6
  •  1
  •   user340140    14 年前


    SMTP->来自服务器:

    这是尝试使用不使用SSL的客户端连接到SSL服务的典型情况

    SMTP错误:无法进行身份验证。

    授权不是一个选项,。

    phpmailer不执行隐式SSL(又称TLS on connect,SMTPS) 缺少重写smtp.class.php如果要包括对它的支持,就没有办法按你的要求去做。

    改用带有显式SSL(又名TLS,STARTTLS)的端口587。

        7
  •  1
  •   F-3000    13 年前

    SSL协议 ,而不是 ssl协议 . 支票是 区分大小写 在密码里。 阿列克谢夫 引导我找到问题的根源。那些东西似乎无关紧要。

        8
  •  -1
  •   Max    8 年前

    https://github.com/breakermind/PhpMimeParser/blob/master/PhpSmtpSslSocketClient.php

    <?php
    // Login email and password
    $login = "your-email@cool.xx";
    $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: <hello@cool.com>\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: <to-email@boome.com>\r\n");
            echo fread($socket,8192);
    
            echo fwrite($socket, "DATA\n");
            echo fread($socket,8192);
    
            echo fwrite($socket, "Date: ".time()."\r\nTo: <to-email@boome.com>\r\nFrom:<zour-email@cool.xx\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;
    }
    
    推荐文章