Использование Gmails Исходящий SMTP из PHP с использованием TLS - PullRequest
2 голосов
/ 14 марта 2011

Я отправляю почту из 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 включен.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

5 голосов
/ 17 декабря 2011

Не уверен, если вы все еще ищете его, но чтобы запустить tls, вы должны сделать это с помощью команд с сервером. Вот простая настройка, которая работает для tls с gmail (если вам нужна дополнительная помощь, помимо простого подключения через tls, начните другой вопрос):

<code><?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 "
"; fclose ($ SMTP);
1 голос
/ 26 мая 2011

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

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

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

...