使用代理IP地址从PHPMailer发送电子邮件

8
我需要使用代理IP地址从PHPMailer发送电子邮件,我知道要实现这一点,我需要使用fsockopen函数连接SMTP账户,同时也知道如果我必须连接到代理,我必须再次使用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 命令是否有帮助,或者是否有其他解决方案和替代方案可以实现该功能?

2个回答

4

我最终找到了使用socat的解决方案,请按照以下步骤操作:

  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.

希望这能帮到你。

1
仅供参考,请问在您的示例命令中,哪些单词需要替换为实际IP地址? - PKHunter
谢谢,非常有帮助。@zakaria - PKHunter
2
@zakaria 你真是救了我的一天,非常感谢你。顺便说一下,如果有人对语法感到困惑,它很简单:这里的代理是您的服务器(相同或其他)将充当应用程序和SMTP服务器之间的代理/媒介。proxy_IP=您的服务器的主机名或IP。proxy_port=您服务器中任何可用端口,这将成为您的应用程序连接到的SMTP端口。host:port=这是实际的SMTP主机和端口,以该格式发送电子邮件。在您要使其成为代理的服务器上运行此命令。 - Sukanta Paul
很高兴能帮到你,兄弟。 - Zakaria Acharki

2
这不是你之前的问题重复了吗?我看并没有太大改变。
你没有正确使用代理(你不能在套接字内部使用套接字),但是PHPMailer没有任何特定的代理支持。如果有的话,我会查看在SMTPOptions中设置属性,尽管据我所知,PHP仅提供HTTP流中的代理支持,所以你可能无法解决这个问题。更容易的方法可能是运行一个本地邮件服务器来中继而不是代理。

1
感谢@Synchro的快速回复,不确定在这种情况下如何使用SOL,请添加示例(请查看我的更新)。 - Zakaria Acharki
嗯,我不认为你知道SOL是什么意思...抱歉! - Synchro
当你使用代理时,你不会直接与最终服务器通信(正如你试图做的那样)。你连接到代理,并向其发送命令,就好像你正在与真实服务器交流一样。代理将命令中继到目标服务器,并将响应中继回您。在支持代理的系统中,通常需要建立到代理的连接,并将实际要连接到的目标作为额外的包装器传递给您正在使用的任何协议。PHP不支持SMTP代理,仅支持HTTP,因此您需要编写自己的代理代码或查找代理库。 - Synchro
@Synchro,你有没有遇到过可以与PHP一起使用的代理库?对于邮件目的,谷歌并没有提供帮助。 - PKHunter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接