我编写了多线程应用程序,它连接到每个线程数据库中的一些电子邮件帐户。 我知道JavaMail没有任何选项可以使用SOCKS5进行连接,所以我决定通过System.setProperty方法使用它。但是这个方法为整个应用程序设置了SOCKS5,我需要为每个线程使用一个SOCKS5。我的意思是:
等等。你能告诉我怎么做吗?
答案 0 :(得分:2)
您需要使用所需的代理创建自己的套接字:
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;
}
}
这都是未经测试的,但我相信这是你必须做的一切。它至少应该让你走上正确的道路。