使用 TLS 使用 Gmail 从 PHP 传出 SMTP

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

问题描述

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

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.

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

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.

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

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

给出的错误是:

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 已启用.任何帮助将不胜感激.

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

推荐答案

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

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 使用 Gmail 从 PHP 传出 SMTP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Convert JSON integers and floats to strings(将JSON整数和浮点数转换为字符串)
in php how do I use preg replace to turn a url into a tinyurl(在php中,如何使用preg替换将URL转换为TinyURL)
all day appointment for ics calendar file wont work(ICS日历文件的全天约会不起作用)
trim function is giving unexpected values php(Trim函数提供了意外的值php)
Basic PDO connection to MySQL(到MySQL的基本PDO连接)
PHP number_format returns 1.00(Php number_Format返回1.00)