I need to send emails from PHPMailer using proxies IP addresses, I know that to do so, I need to use the fsockopen function so I can connect to the SMTP account, I also know that if I have to connect to the proxy I have to use the fsockopen function again. But using it fsockopen inside another fsockopen is not doable.
I have transparent proxy and require no authentication. I need to send this to a distant SMTP server of an external Email Service Provider.
The code I have tried :
<?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);
?>
And it's not working I'm not sure why?
Could socat
commands help in this situation or is there any solution or alternative solution to achieve that?
I finally found the solution using socat, Kindly follow these steps :
First of all, you'll need to install socat
on the server, you can do that simply using the command below :
yum install socat
Then run the following socat
command that will bind PROXY_IP:PORT
with HOST_ESP:PORT
:
socat TCP4-LISTEN:proxy_port,bind=proxy_IP,fork,su=nobody TCP4:host:port,bind=proxy_IP
Then instead of making a send to the ESP through HOST_ESP:PORT
you could just make it using PROXY_IP:PORT
and socat
will do the redirection automatically towards HOST_ESP:PORT
using the output of PROXY_IP:PORT
.
Hope this helps.
Isn't this a repeat of your earlier question? I don't see that much has changed.
You are not using the proxy correctly (you can't do sockets inside sockets), but PHPMailer doesn't have any specific proxy support. If it was going to be anywhere, I'd look at setting properties in SMTPOptions
, though as far as I can see PHP only offers proxy support in HTTP streams so you may be SOL. It's probably easier to run a local mail server to relay rather than proxy.
Can you Try this...
<?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 (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";
?>