問題描述
我通過 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的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!