如何在 SOCKS 代理上使用 Net::SMTP?

How to use Net::SMTP over SOCKS proxy?

我正在这样做,在 Ruby 2.6:

require 'net/smtp'
Net::SMTP.start('smtp.gmail.com', 457).do |smtp|
  smtp.helo('gmail.com')
end

现在我想做完全相同的事情,但要通过 SOCKS4/5 代理。我在文档中找不到任何内容。

查看 Net::SMTP 的源代码,它似乎没有 built-in 对 SOCKS 代理的支持。

几个想法:

  1. 您的 Ruby 解释器是否支持 SOCKS?如果是,那么您可以使用 SOCKSSocket class. Create a subclass of Net::SMTP and override tcp_socket method 来使用 SOCKSSocket 而不是 TCPSocket.
  2. 使用ruby-proxifiergem(虽然看起来比较旧)
  3. Re-implement SOCKSSocket in pure Ruby(通过 SOCKS4 连接并不难,SOCKS5 稍微复杂一些,参考 this example)或者找一个现有的实现(虽然我没能找到一个)。