php - 使用 Gmail 使用 TLS 从 PHP 传出 SMTP

标签 php cakephp smtp gmail ssl

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

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

有问题的代码行似乎是 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 已启用。任何帮助将不胜感激。

最佳答案

不确定您是否仍在寻找它,但要启动 tls,您必须通过服务器的命令来执行此操作。这是一个适用于 tls 和 gmail 的简单设置(如果您需要除了通过 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);

关于php - 使用 Gmail 使用 TLS 从 PHP 传出 SMTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5294751/

相关文章:

php - MySQL 只更新表中的某些字段

php - 设法将 Mysql 时间戳格式化为英国日期格式,但无法包含时间

php - 慢速 S3 -> EC2 传输。错误代码?

php - CakePHP 中的多重计数

powershell - 使用 powershell 脚本制作批处理文件

python - 使用 Python 发送 Outlook 电子邮件的方法差异

PHP:php 找不到 include() 脚本中定义的类

php - CakePHP 允许使用 API 按字段搜索吗?

php - CakePHP 2 - 验证密码字段

PHPMAILER 不发送且不给出错误