【问题标题】:Sending emails from PHPMailer using proxies IP addresses使用代理 IP 地址从 PHPMailer 发送电子邮件
【发布时间】:2016-07-08 08:56:43
【问题描述】:

我需要使用代理 IP 地址从 PHPMailer 发送电子邮件,我知道要这样做,我需要使用 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 命令可以在这种情况下提供帮助吗?或者是否有任何解决方案或替代解决方案可以实现这一目标?

【问题讨论】:

    标签: php email proxy phpmailer fsockopen


    【解决方案1】:

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

    1. 首先,您需要在服务器上安装socat,只需使用以下命令即可:

      yum install socat
      
    2. 然后运行以下socat 命令将PROXY_IP:PORTHOST_ESP:PORT 绑定:

      socat TCP4-LISTEN:proxy_port,bind=proxy_IP,fork,su=nobody TCP4:host:port,bind=proxy_IP
      
    3. 然后,您可以使用 PROXY_IP:PORTsocat 进行重定向,而不是通过 HOST_ESP:PORT 发送到 ESP使用 PROXY_IP:PORT 的输出自动朝向 HOST_ESP:PORT

    希望这会有所帮助。

    【讨论】:

    • 只是我的无知,您的示例命令中的哪些单词需要替换为实际 IP?
    • 谢谢,非常有帮助。 @zakaria
    • @zakaria 你刚刚拯救了我的一天,我非常感谢你。顺便说一句,如果有人对语法有混淆,这很简单:这里的 proxy 是您的服务器(相同或任何其他),它将充当您的应用程序和 SMTP 服务器之间的代理/媒介. proxy_IP = 您的服务器的主机名或 IP。 proxy_port = 服务器中的任何可用端口,这将成为应用程序中要连接的 SMTP 端口。 host:port = 这是您发送电子邮件所用格式的实际 SMTP 主机和端口。在您要创建代理的服务器上运行此命令。
    • 很高兴能帮到兄弟。
    【解决方案2】:

    这不是your earlier question的重复吗?我没有看到有太大的变化。

    你没有正确使用代理(你不能在套接字里面做套接字),但是 PHPMailer 没有任何特定的代理支持。如果要在任何地方,我会考虑在SMTPOptions 中设置属性,尽管据我所知PHP 只提供proxy support in HTTP streams,所以你可能是SOL。运行本地邮件服务器进行中继而不是代理可能更容易。

    【讨论】:

    • 感谢@Synchro 的快速回放,不知道在这种情况下如何使用 SOL,如果可以,请添加示例。 (查看我的更新)。
    • 嗯,我想你不知道what SOL means...对不起!
    • 当您有代理时,您不会直接与最终服务器对话(正如您正在尝试做的那样)。您连接到代理并向其发送命令就像您正在与真实服务器交谈。代理将命令中继到目标服务器,并将响应中继回您。在支持代理的系统中,您通常会建立与代理的连接并传递您真正想要连接的目标,作为您正在谈论的任何协议的附加包装器。 PHP 不支持 SMTP 代理,只有 HTTP,所以你需要自己编写代理代码,或者找一个代理库。
    • @Synchro 您是否遇到过与 PHP 一起使用的代理库? Google 对邮件用途没有帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2021-09-13
    • 2014-04-11
    相关资源
    最近更新 更多