2016-03-21 4 views
8

Мне нужно отправить электронную почту от PHPMailer с использованием прокси IP адресов, я знаю, что делать, мне нужно использовать fsockopen функцию, так что я могу подключиться к SMTP счета, я также знайте, что если мне нужно подключиться к прокси-серверу, я снова должен использовать функцию fsockopen. Но использование fsockopen внутри другого fsockopen не выполнимо.Отправка писем от PHPMailer с использованием прокси-серверов IP-адресов

У меня есть прозрачный прокси-сервер и не требует аутентификации. Мне нужно отправить это на удаленный SMTP-сервер внешнего поставщика услуг электронной почты.

код, который я попробовал:

<?php 

    //SMTP params 
    $server  = 'smtp.espdomain.com'; 
    $server_port = '25'; 
    $username = 'smtp_login'; 
    $password = 'smtp_pass'; 

    //Proxy 
    $proxy  = '1.1.1.1'; 
    $proxy_port = 1111; 

    //Open connection 
    $socket = fsockopen($proxy, $proxy_port); 

    //Send command to proxy 
    fputs($socket, "CONNECT $server:$server_port HTTP/1.0\r\nHost: $proxy\r\n\r\n"); 
    fgets($socket, 334); 

    //SMTP authorization 
    fputs($socket, "AUTH LOGIN\r\n"); 
    fgets($socket, 334); 

    fputs($socket, base64_encode($username)."\r\n"); 
    fgets($socket, 334); 

    fputs($socket, base64_encode($password)."\r\n"); 
    $output = fgets($socket, 235); 

    fputs($socket, "HELO $server \r\n"); 
    $output = fgets($socket, 515); 

?> 

И это не работает, я не знаю, почему?

Могут ли команды socat помочь в этой ситуации или есть ли решение или альтернативное решение для этого?

ответ

2

я, наконец, нашел решение, используя socat, Пожалуйста выполните следующие действия:

  1. Прежде всего, вам необходимо установить socat, вы можете сделать это просто с помощью приведенной ниже команды:

    yum install socat 
    
  2. Затем выполните следующую socat команду, которая будет связывать PROXY_IP:PORT с HOST_ESP:PORT:

    socat TCP4-LISTEN:proxy_port,bind=proxy_IP,fork,su=nobody TCP4:host:port,bind=proxy_IP 
    
  3. Тогда вместо того, чтобы отправить в ESP через HOST_ESP:PORT вы можете просто сделать это с помощью PROXY_IP:PORT и socat автоматически перенаправит на HOST_ESP:PORT, используя выход PROXY_IP:PORT.

Надеюсь, это поможет.

2

Разве это не повторение your earlier question? Я не вижу, что многое изменилось.

Вы не используете прокси правильно (вы не можете делать сокеты внутри сокетов), но PHPMailer не имеет какой-либо конкретной поддержки прокси. Если бы это было где угодно, я бы посмотрел на настройку свойств в SMTPOptions, хотя, насколько я вижу, PHP предлагает только proxy support in HTTP streams, поэтому вы можете быть SOL. Вероятно, проще запустить локальный почтовый сервер для ретрансляции, а не для прокси.

+1

Спасибо @Synchro за ваш быстрый повтор, не уверен, как я могу использовать SOL в этой ситуации, пожалуйста, добавьте пример, если сможете. (проверьте мое обновление). –

+0

Ум, я не думаю, что вы знаете [что означает SOL] (http://onlineslangdictionary.com/meaning-definition-of/sol) ... Извините! – Synchro

+0

Когда у вас есть прокси-сервер, вы не разговариваете с конечным сервером напрямую (как вы пытаетесь сделать). Вы подключаетесь к прокси-серверу и отправляете ему команды *, как будто * вы разговаривали с реальным сервером. Прокси-сервер передает команды на целевой сервер и передает ответы обратно вам. В системах, которые поддерживают прокси-серверы, вы обычно устанавливаете соединение с прокси-сервером и проходите по цели, которую вы действительно хотите подключить, в качестве дополнительной оболочки вокруг любого протокола, о котором вы говорите. PHP не поддерживает SMTP-прокси, а только HTTP, поэтому вам нужно будет свернуть собственный прокси-код или найти прокси-библиотеку. – Synchro

1

Вы можете попробовать это ...

<?php 

// The mailman object is used for sending and receiving email. 
$mailman = new COM("Chilkat.MailMan2"); 

// Any string argument automatically begins the 30-day trial. 
$success = $mailman->UnlockComponent('30-day trial'); 
if ($success != true) { 
    print 'Component unlock failed' . "\n"; 
    exit; 
} 

// To connect through an HTTP proxy, set the HttpProxyHostname 
// and HttpProxyPort properties to the hostname (or IP address) 
// and port of the HTTP proxy. Typical port numbers used by 
// HTTP proxy servers are 3128 and 8080. 
$mailman->HttpProxyHostname = 'www.my-http-proxy.com'; 
$mailman->HttpProxyPort = 3128; 

// Important: Your HTTP proxy server must allow non-HTTP 
// traffic to pass. Otherwise this does not work. 

// Set the SMTP server. 
$mailman->SmtpHost = 'smtp.chilkatsoft.com'; 

// Set the SMTP login/password (if required) 
$mailman->SmtpUsername = 'myUsername'; 
$mailman->SmtpPassword = 'myPassword'; 

// Create a new email object 
$email = new COM("Chilkat.Email2"); 

$email->Subject = 'This is a test'; 
$email->Body = 'This is a test'; 
$email->From = 'Chilkat Support <[email protected]>'; 
$email->AddTo('Chilkat Admin','[email protected]'); 

// Call SendEmail to connect to the SMTP server via the HTTP proxy and send. 
// The connection (i.e. session) to the SMTP server remains 
// open so that subsequent SendEmail calls may use the 
// same connection. 
$success = $mailman->SendEmail($email); 
if ($success != true) { 
    print $mailman->lastErrorText() . "\n"; 
    exit; 
} 

// Some SMTP servers do not actually send the email until 
// the connection is closed. In these cases, it is necessary to 
// call CloseSmtpConnection for the mail to be sent. 
// Most SMTP servers send the email immediately, and it is 
// not required to close the connection. We'll close it here 
// for the example: 
$success = $mailman->CloseSmtpConnection(); 
if ($success != true) { 
    print 'Connection to SMTP server not closed cleanly.' . "\n"; 
} 

print 'Mail Sent!' . "\n"; 
?>