首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NET::SMTP SSL/TLS和SOCKS

使用NET::SMTP SSL/TLS和SOCKS
EN

Stack Overflow用户
提问于 2015-03-04 14:30:22
回答 2查看 869关注 0票数 2

我有一些绑定的实现,连接到SOCKS和SMTP服务器通过SOCKS。如何将此连接与SSL/TLS NET::SMTP连接?这个question帮不了我,因为SSL握手不能启动。

代码语言:javascript
复制
DEBUG: .../IO/Socket/SSL.pm:683: waiting for fd to become ready: SSL wants a read first
DEBUG: .../IO/Socket/SSL.pm:693: handshake failed because socket did not became ready

这里实现了通过代理连接远程服务器:

代码语言:javascript
复制
sub connect {
    my ($ip, $port, $is_ssl, $pid, $server) = @_;
    if (defined $socket) {
        my ($packed_cmd, $buffer, @data, %response);
        $packed_cmd = pack("C4Nn", 0x05, 0x01, 0x00, 0x01, $ip, $port);
        $socket->send($packed_cmd);
        if (defined $socket->recv($buffer, 1024)) {
            @data = unpack("C4 L S", $buffer);
            $response{'version'} = $data[0];
            $response{'result'} = $data[1];
            $response{'reg'} = $data[2];
            $response{'type'} = $data[3];
            $response{'ip'} = $data[4];
            $response{'port'} = $data[5];
            $socket->blocking(0);
            if ($is_ssl) {
                &debug(3, $pid, "Try start SSL handshake with [$server]\n");
                IO::Socket::SSL->start_SSL($socket, SSL_version => 'SSLv23', SSL_ca_file => SSL_CA_FILE) or &debug(3, $pid, "Cannot start SSL handshake! $@\n") and return 0; 
                &debug(3, $pid, "SSL handshake done!\n");
            }
            # TODO: Make TLS support
            return 1;
        }
    }
    &debug(3, $pid, "Cannot connect to [$server:$port] through socks server [$socks_name:$socks_server]\n");
    return 0;
}

扎袜子

代码语言:javascript
复制
sub bind_socks {
    my ($pid) = @_;
    my ($method, $packed_cmd, $buffer, @data, %response);
    $socket = IO::Socket::INET->new(
        PeerAddr => $socks_server,
        PeerPort => $socks_port,
        Proto => 'tcp',
        Timeout  => SOCKS5_CONNECT_TIMEOUT
    ) or &debug(3, $pid, "Cannot connect to the socks server [$socks_server] $@\n") and return 0;
    &debug(3, $pid, "Connected to the socks server [$socks_name:$socks_server]\n");
    $socket->blocking(1);
    if ($socks_username && $socks_password) {
        $method = 0x02;
    } else {
        $method = 0x00;
    }
    $packed_cmd = pack("C3", 0x05, 0x01, $method);
    $socket->send($packed_cmd);
    if (defined $socket->recv($buffer, 1024)) {
        @data = unpack("C2", $buffer);
        $response{'version'} = $data[0];
        $response{'method'} = $data[1];
        if ((defined $response{'version'}) && (defined $response{'method'}) && ($response{'version'} eq 5) && ($response{'method'} eq $method)) {
            if ($method == 2) {
                $packed_cmd = pack("CC", 0x01, length($socks_username)) . $socks_username . pack("C", length($socks_password)) . $socks_password;
                $socket->send($packed_cmd);
                if (defined $socket->recv($buffer, 1024)) {
                    @data = unpack("C2", $buffer);
                    $response{'version'} = $data[0];
                    $response{'status'} = $data[1];
                    return 1;
                }
            } else {
                return 1;
            }
        } else {
            &debug(3, $pid, "Cannot authenticate on socks server [$socks_name:$socks_server]\n");
            return 0;
        }
    }
    &debug(3, $pid, "Cannot authenticate on socks server [$socks_name:$socks_server]\n");
    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-12 13:43:57

Here是我通过socks代理使用SMTP的beta代码。SSL在我测试的所有服务器上都正常工作。由于TLS有时仍有问题,可能与RFC不同。

票数 0
EN

Stack Overflow用户

发布于 2015-03-11 17:40:19

如果您对IMAP (而不是SMTP )没有意见,这可能会有所帮助,但不要支持您想要的内容:

代码语言:javascript
复制
sub login() {

  ## Connect to the IMAP server via SSL
  my $socket = IO::Socket::SSL->new(PeerAddr => 'imap.gmail.com',PeerPort => 993);
  if(!$socket) {
    # handle
  }

  ## Build up a client attached to the SSL socket.
  ## Login is automatic as usual when we provide User and Password
  my $imap = Mail::IMAPClient->new(Socket   => $socket,
                                   User     => $username,
                                   Password => $password,);
  if(!$imap) {
    # handle
  }

  if(!$imap->IsAuthenticated() && ...) {
    # handle
  }

  ## good to go
  my @folders = $imap->folders();
  ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28857021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档