Замените fsockopen на socket_create и socket_connect - PullRequest
2 голосов
/ 11 января 2012

Я использую phpmailer для отправки электронной почты и у меня возникли проблемы с отправкой на хостинге, когда мне нужно подключиться к удаленному почтовому серверу.Я получил информацию от технической поддержки, что мне нужно связать IP-адрес моего сервера с удаленным сервером.Это первый раз, когда я возиться с сокетами.

К сожалению, phpmailer использует fsocketopen, поэтому я изменил его:

//my replacement code
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$conn = socket_connect($socket, $host, $port);
if($conn) {
    $this->smtp_conn = $socket;
} else {
    throw new Exception("Failed to connect to server: ".socket_last_error($socket));
}

//original phpmailer code
/**
$this->smtp_conn = @fsockopen($host,    // the host of the server
                             $port,    // the port to use
                             $errno,   // error number if any
                             $errstr,  // error message if any
                             $tval);   // give up after ? secs
 */

Но после этого изменения я получаю предупреждения:

  • Предупреждение: fputs (): предоставленный ресурс не является допустимым потоковым ресурсом

  • Предупреждение: socket_get_status (): предоставленный ресурс не является допустимым потоковым ресурсом

Как создать ресурс, который будет совместим с ресурсом, возвращенным из fsockopen?Используя var_dump, он говорит, что эти две переменные являются сокетами.Но я все еще получаю предупреждения для ресурса, созданного usign socket_create.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

См. этот ответ

И вы также можете попросить у меня собственный плагин реализации класса smtp для PHPMailer, который может отправлять электронную почту с IP-адресов diffenet на одном компьютере. Смотрите контакт в моем аккаунте.

P.S. Извините за мой английский

0 голосов
/ 11 января 2012

Вам нужен возвращаемый ресурс потока, а не ресурс сокета. Попытка использования функции stream_socket_client ().

$this->smtp_conn = stream_socket_client("tcp://".$host.":".$port,
$errno,
$errstr,
$tval);

Кроме того, вы уверены, что ваш хостинг-провайдер позволяет отправлять электронную почту прямо с вашего сервера? Иногда они предоставляют сервер ретрансляции почты для использования для исходящей электронной почты.

...