JavaMail:如何为不同的线程使用不同的SOCKS5?

JavaMail:如何为不同的线程使用不同的SOCKS5?,java,multithreading,jakarta-mail,socks,Java,Multithreading,Jakarta Mail,Socks,我编写了多线程应用程序,每个线程连接到数据库中的一些电子邮件帐户。 我知道JavaMail没有任何选项可以使用SOCKS5进行连接,所以我决定通过System.setProperty方法使用它。但是这个方法为整个应用程序设置SOCKS5,我需要每个线程使用一个SOCKS5。我的意思是: 第一个线程:将SOCKS 192.168.0.1:12345用于bob@localhost到 连接 第二个线程:将SOCKS 192.168.0.20:12312用于 alice@localhost连接 第三个

我编写了多线程应用程序,每个线程连接到数据库中的一些电子邮件帐户。 我知道JavaMail没有任何选项可以使用SOCKS5进行连接,所以我决定通过System.setProperty方法使用它。但是这个方法为整个应用程序设置SOCKS5,我需要每个线程使用一个SOCKS5。我的意思是:

  • 第一个线程:将SOCKS 192.168.0.1:12345用于bob@localhost到 连接
  • 第二个线程:将SOCKS 192.168.0.20:12312用于 alice@localhost连接
  • 第三个线程:使用SOCKS 192.168.12.:8080 对于andrew@localdomain连接

等等。你能告诉我怎么做吗?

你需要使用你想要的代理创建你自己的套接字:

SocketAddress addr = new InetSocketAddress("socks.mydomain.com", 1080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr);
Socket socket = new Socket(proxy);
InetSocketAddress dest = new InetSocketAddress("smtp.foo.com", 25);
socket.connect(dest);
然后将其用于连接:

SMTPTransport transport = (SMTPTransport) session.getTransport("smtp");
transport.connect(socket);
编辑:棘手的一点是,如果发送邮件需要SMTP服务器的身份验证。如果是这种情况,则必须创建
javax.mail.Authenticator
的子类,并将其传递给
Session.getInstance()
方法:

MyAuthenticator authenticator = new MyAuthenticator();

Properties properties = new Properties();
properties.setProperty("mail.smtp.submitter",
                        authenticator.getPasswordAuthentication().getUserName());
properties.setProperty("mail.smtp.auth", "true");

Session session = Session.getInstance(properties, authenticator);
其中验证器看起来像:

private class MyAuthenticator extends javax.mail.Authenticator 
{
    private PasswordAuthentication authentication;

    public Authenticator() 
    {
         String username = "auth-user";
         String password = "auth-password";
         authentication = new PasswordAuthentication(username, password);
    }

    protected PasswordAuthentication getPasswordAuthentication() 
    {
        return authentication;
    }
}

这都是未经测试的,但我相信这是你必须做的一切。这至少会让你走上正确的道路。

非常感谢你是我潜在的救星!:)我试试看,再次谢谢!选中,Transport.connect没有套接字的实现:(嘎,抱歉-
SMTPTransport
有。在dest变量中,我需要设置smtp主机/smtp端口?对于已设置的smtp,我不应该在JavaMail的属性中设置它?正确,dest是您的smtp服务器和端口。在这种情况下,您不使用属性。棘手的一点是,如果您需要身份验证,因为您必须进行身份验证。)你自己的年龄。试图找到一个好的参考,我已经很久没有这样做了