Мне нужно отправить электронные письма с PHPMailer с помощью IP-адресов прокси, я знаю, что для этого мне нужно использовать функцию fsockopen, чтобы я мог подключиться к учетной записи SMTP, я также знаю, что если мне нужно подключиться к прокси-серверу, я должен снова используйте функцию fsockopen. Но использование fsockopen внутри другого fsockopen не выполнимо.
Я имею прозрачный прокси и не требую аутентификации. Мне нужно отправить это на удаленный 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
помочь в этой ситуации или есть какое-либо решение или альтернативное решение для достижения этого?
Разве это не повторение вашего предыдущего вопроса ? Я не вижу, что многое изменилось.
Вы не используете прокси правильно (вы не можете делать сокеты внутри сокетов), но у PHPMailer нет определенной поддержки прокси. Если бы это было где угодно, я бы посмотрел на настройку свойств в SMTPOptions
, хотя, насколько я вижу, PHP предлагает поддержку прокси в потоках HTTP, поэтому вы можете быть SOL. Вероятно, проще запустить локальный почтовый сервер для ретрансляции, а не для прокси.
Я, наконец, нашел решение с помощью socat , пожалуйста, выполните следующие действия:
Прежде всего, вам нужно будет установить socat
на сервер, вы можете сделать это, просто используя следующую команду:
yum install socat
Затем запустите следующую команду socat
которая будет связывать PROXY_IP:PORT
с HOST_ESP:PORT
:
socat TCP4-LISTEN:proxy_port,bind=proxy_IP,fork,su=nobody TCP4:host:port,bind=proxy_IP
Затем вместо того, чтобы отправлять ESP через HOST_ESP:PORT
вы можете просто сделать это с помощью PROXY_IP:PORT
и socat
автоматически перенаправят на HOST_ESP:PORT
используя вывод PROXY_IP:PORT
.
Надеюсь это поможет.
Вы можете попробовать это …
<?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 <support@chilkatsoft.com>'; $email->AddTo('Chilkat Admin','admin@chilkatsoft.com'); // Call SendEmail to connect to the SMTP server via the HTTP proxy and send. // The connection (ie 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"; ?>