Home » Php » php – Sending emails from PHPMailer using proxies IP addresses

php – Sending emails from PHPMailer using proxies IP addresses

Posted by: admin July 12, 2020 Leave a comment


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 :


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

    $proxy      = '';
    $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?

How to&Answers:

I finally found the solution using socat, Kindly follow these steps :

  1. First of all, you’ll need to install socat on the server, you can do that simply using the command below :

    yum install socat
  2. 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
  3. 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…


//  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";

//  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";

//  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";