2012-01-11 2 views
1

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

К сожалению 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 говорит, что эти два vars являются сокетами. Но я все еще получаю предупреждения для созданного ресурса usign socket_create.

ответ

0

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

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

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

+0

Спасибо за ответ, но в прямом эфире относительно технической поддержки я должен сокет_bind мой ip с удаленным почтовым сервером. Используя stream_socket_client, я уже создаю соединение. Или, может быть, я свяжусь после подключения? Извините за столько вопросов, я не мастер по сетевым проблемам. –

+0

Вы не привязываетесь к IP при подключении к клиенту. Связывание предназначено для создания прослушивающего соединения, а затем «bind()» на локальный интерфейс/адрес для прослушивания входящих подключений. На исходящем клиентском соединении вы предоставляете хост (IP) и порт назначения, и он будет подключаться к службе дальнего конца. У вас есть какие-либо ошибки или журналы, которые показывают больше информации? – ddubs

+0

Так мне нужна эта «привязка» для отправки SMTP-сообщения? Имеет ли смысл какой-либо смысл или техническая поддержка моего хоста? Дополнительная информация из telnet-соединения: 450 Клиентский хост отклонен: не удается найти ваше имя хоста, [213.134.162.98] 421 server.na.me Ошибка: превышен тайм-аут –

0

См this answer

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

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

Смежные вопросы