Using Gmails Outgoing SMTP from PHP using TLS(使用 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 TLS 使用 Gmail 从 PHP 传出 SMTP
基础教程推荐
- 通过 PHP SoapClient 请求发送原始 XML 2021-01-01
- 在多维数组中查找最大值 2021-01-01
- Libpuzzle 索引数百万张图片? 2022-01-01
- mysqli_insert_id 是否有可能在高流量应用程序中返回 2021-01-01
- 在 Woocommerce 中根据运输方式和付款方式添加费用 2021-01-01
- 超薄框架REST服务两次获得输出 2022-01-01
- WooCommerce 中选定产品类别的自定义产品价格后缀 2021-01-01
- 在 PHP 中强制下载文件 - 在 Joomla 框架内 2022-01-01
- 如何在 PHP 中的请求之间持久化对象 2022-01-01
- XAMPP 服务器不加载 CSS 文件 2022-01-01