Использование Gmails Исходящий SMTP из PHP с использованием TLS

Я отправляю электронную почту с PHP через SMTP-сервер Gmail. Я использовал компонент электронной почты CakePHP с настройками SMTP. Первоначально я работал над этим, используя SSL через порт 465, но обнаружил, что мой веб-хост не разрешает исходящий трафик через 465. Тем не менее они сказали мне, что допустимы исходящие соединения через порт 587.

Прочитав http://mail.google.com/support/bin/answer.py?answer=13287, я подумал, что это будет так же просто, как изменение номера порта и протокола, но я не могу заставить его работать.

Оскорбительная строка кода выглядит как вызов 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); 

Почему бы не использовать PEAR?

http://email.about.com/od/emailprogrammingtips/qt/PHP_Email_SMTP_Authentication.htm

Измените порт во втором примере.