使用 TLS 从 PHP 使用 Gmail 传出 SMTP [英] Using Gmails Outgoing SMTP from PHP using TLS

查看:28
本文介绍了使用 TLS 从 PHP 使用 Gmail 传出 SMTP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通过 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);//作品fsockopen("tls://smtp.gmail.com", 587, $errNum, $errStr, 30);//失败

给出的错误是:

警告:fsockopen():SSL 操作失败,代码为 1.OpenSSL 错误消息:错误:1408F10B:SSL 例程:SSL3_GET_RECORD:第 1 行命令行代码中的版本号错误警告:fsockopen():无法在第 1 行的命令行代码中启用加密警告:fsockopen():无法在第 1 行的命令行代码中连接到 tls://smtp.gmail.com:587(未知错误)

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

解决方案

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

";回声获取($smtp);//如果你想检查应该返回 220$cmd = "EHLO ${_SERVER['HTTP_HOST']}";echo $cmd."
";把($smtp,$cmd);回声获取($smtp);//250$cmd = "STARTTLS";echo $cmd."
";把($smtp,$cmd);回声获取($smtp);//220if(false == stream_socket_enable_crypto($smtp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)){//fclose($smtp);//不确定是否需要关闭,因为此时我还没有遇到安全故障die("无法启动tls加密");}$cmd = "EHLO ".$_SERVER['HTTP_HOST'];回声 $cmd;把($smtp,$cmd);回声获取($smtp);//250$cmd = "退出";echo $cmd."
";把($smtp,$cmd);回声获取($smtp);echo "</pre>";fclose($smtp);

I'm sending email from PHP through the Gmail SMTP server. I've been using the CakePHP email component with SMTP settings set. I originally had it all working fine using SSL over port 465 but have found my web host doesn't allow outgoing traffic over 465. They did however tell me that outgoing connections over port 587 is allowed.

After reading http://mail.google.com/support/bin/answer.py?answer=13287 I thought it would be as easy as changing the port number and protocol but I can't get it to work.

The offending line of code seems to be a fsockopen call:

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

The errors given are:

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

This is with PHP 5.3, phpinfo shows OpenSSL is enabled. Any help would be greatly appreciated.

解决方案

Not sure if you are still looking for it, but to start tls, you have to do it from the commands with the server. Here is a simple set up that works for tls with gmail (if you want more help beyond just connecting via tls, start another question):

<?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."
",$length);
}
if (!($smtp = fsockopen("smtp.gmail.com", 587, $errno, $errstr, 15))) {
    die("Unable to connect");
}
echo "<pre>
";
echo get($smtp); // should return a 220 if you want to check

$cmd = "EHLO ${_SERVER['HTTP_HOST']}";
echo $cmd."
";
put($smtp,$cmd);
echo get($smtp); // 250

$cmd = "STARTTLS";
echo $cmd."
";
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."
";
put($smtp,$cmd);
echo get($smtp);

echo "</pre>";

fclose($smtp);

这篇关于使用 TLS 从 PHP 使用 Gmail 传出 SMTP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆