Интернет-сокеты: TCP, UDP, SSL и TLS
PHP 4, PHP 5. ssl:// & tls:// начиная с версии PHP 4.3.0 sslv2:// & sslv3:// начиная с версии PHP 5.0.2
Замечание: Если транспортный протокол не указан, будет использован tcp://.
- 127.0.0.1
- fe80::1
- www.example.com
- tcp://127.0.0.1
- tcp://fe80::1
- tcp://www.example.com
- udp://www.example.com
- ssl://www.example.com
- sslv2://www.example.com
- sslv3://www.example.com
- tls://www.example.com
Интернет-сокеты требуют указания порта в дополнение к адресу. В случае fsockopen(), порт передается вторым параметром и не затрагивает строку адреса. При работе с stream_socket_client() и другими близкими функциями, как и в случае со стандартными URL, порт указывается в конце адреса, отделенный двоеточием.
- tcp://127.0.0.1:80
- tcp://[fe80::1]:80
- tcp://www.example.com:80
Замечание: IPv6 численные адреса с указанием порта
Во втором примере выше, в то время как IPv4 и имя хоста не изменились, за исключением добавления номера порта после двоеточия, адрес IPv6 заключен в квадратные скобки: [fe80::1]. Это сделано для того, чтобы отличить двоеточие в адресе от двоеточия при указании порта.
Протоколы ssl:// и tls:// (доступны, только если поддержка openssl включена в PHP) являются расширениями tcp://, дополняющими его SSL-шифрованием. Начиная с PHP 4.3.0, для работы с ssl-протоколами, PHP должен быть статически собран с поддержкой OpenSSL, а с версии PHP 5.0.0 он также может быть представлен и как модуль.
ssl:// будет пытаться использовать соединение SSL V2 или SSL V3, в зависимости от возможностей и настроек удаленного хоста. sslv2:// и sslv3:// позволяют явно указать использование SSL V2 или SSL V3.
Коментарии
Actually, PHP is very able to start with an unencrypted connection and then switch to an encrypted one - refer to http://php.net/stream_socket_enable_crypto .
@pablo dot livardo : I think that the problem you found is caused by the difference between the client/server encryption methods used.
The 465 port is used for SMTPS, and the server starts the encryption immediately it receives your connection. So, your code will work.
The 587 port is used for Submission (MSA or Mail Submission Agent) which works like the port 25. The server accepts your connection and doesn't activate the encryption. If you want an encrypted connection on the port 587, you must connect on it without encryption, you must start to dialog with the server (with EHLO) and after that you must ask the server to start the encrypted connection using the STARTTLS command. The server starts the encryption and now you can start as well the encryption on your client.
So, in few words, you can not use :
<?php $fp = fsockopen("tls://mail.example.com", 587, $errno, $errstr); ?>
but you can use:
<?php $fp = stream_socket_client("mail.example.com:587", $errno, $errstr); ?>
and after you send the STARTTLS command, you can enable the crypto:
<?php stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); ?>
P.S. My previous note on this page was totally wrong, so I ask the php.net admin to remove it.
:)