【问题标题】:Using Gmails Outgoing SMTP from PHP using TLS使用 TLS 使用 Gmail 从 PHP 传出 SMTP
【发布时间】:2011-07-14 18:20:38
【问题描述】:

我正在通过 Gmail SMTP 服务器从 PHP 发送电子邮件。我一直在使用带有 SMTP 设置的 CakePHP 电子邮件组件。我最初在端口 465 上使用 SSL 一切正常,但发现我的网络主机不允许超过 465 的传出流量。但是他们确实告诉我允许通过端口 587 的传出连接。

在阅读http://mail.google.com/support/bin/answer.py?answer=13287 之后,我认为这就像更改端口号和协议一样简单,但我无法让它工作。

有问题的代码行似乎是 fsockopen 调用:

fsockopen("ssl://smtp.gmail.com", 465, $errNum, $errStr, 30); // WORKS
fsockopen("tls://smtp.gmail.com", 587, $errNum, $errStr, 30); // FAILS

给出的错误是:

Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number in Command line code on line 1

Warning: fsockopen(): Failed to enable crypto in Command line code on line 1

Warning: fsockopen(): unable to connect to tls://smtp.gmail.com:587 (Unknown error) in Command line code on line 1

这是 PHP 5.3,phpinfo 显示 OpenSSL 已启用。任何帮助将不胜感激。

【问题讨论】:

    标签: php cakephp smtp gmail ssl


    【解决方案1】:

    不确定你是否还在寻找它,但要启动 tls,你必须通过服务器的命令来完成。这是一个适用于带有 gmail 的 tls 的简单设置(如果您需要更多帮助,而不仅仅是通过 tls 连接,请开始另一个问题):

    <?php
    function get($socket,$length=1024){
        $send = '';
        $sr = fgets($socket,$length);
        while( $sr ){
            $send .= $sr;
            if( $sr[3] != '-' ){ break; }
            $sr = fgets($socket,$length);
        }
        return $send;
    }
    function put($socket,$cmd,$length=1024){
        fputs($socket,$cmd."\r\n",$length);
    }
    if (!($smtp = fsockopen("smtp.gmail.com", 587, $errno, $errstr, 15))) {
        die("Unable to connect");
    }
    echo "<pre>\n";
    echo get($smtp); // should return a 220 if you want to check
    
    $cmd = "EHLO ${_SERVER['HTTP_HOST']}";
    echo $cmd."\r\n";
    put($smtp,$cmd);
    echo get($smtp); // 250
    
    $cmd = "STARTTLS";
    echo $cmd."\r\n";
    put($smtp,$cmd);
    echo get($smtp); // 220
    if(false == stream_socket_enable_crypto($smtp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)){
        // fclose($smtp); // unsure if you need to close as I haven't run into a security fail at this point
        die("unable to start tls encryption");
    }
    
    $cmd = "EHLO ".$_SERVER['HTTP_HOST'];
    echo $cmd;
    put($smtp,$cmd);
    echo get($smtp); // 250
    
    $cmd = "QUIT";
    echo $cmd."\r\n";
    put($smtp,$cmd);
    echo get($smtp);
    
    echo "</pre>";
    
    fclose($smtp);
    

    【讨论】:

      【解决方案2】:

      为什么不使用 PEAR?

      http://email.about.com/od/emailprogrammingtips/qt/PHP_Email_SMTP_Authentication.htm

      在第二个示例中更改端口。

      【讨论】:

      • 感谢您的评论,由于无法正常工作,因此无法使用 PEAR 包进行测试。
      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2013-06-21
      • 2012-01-24
      相关资源
      最近更新 更多