JavaMail: как использовать разные SOCKS5 для разных потоков? - PullRequest
1 голос
/ 24 сентября 2011

Я написал многопоточное приложение, которое подключается к некоторым учетным записям электронной почты из базы данных в каждом потоке. Я знаю, что у JavaMail нет никаких вариантов использования SOCKS5 для соединения, поэтому я решил использовать его через метод System.setProperty. Но этот метод устанавливает SOCKS5 для всего приложения, и мне нужно использовать один SOCKS5 на поток. Я имею в виду:

  • первый поток: использует SOCKS 192.168.0.1:12345 для bob @ localhost для подключить
  • второй поток: использует SOCKS 192.168.0.20:12312 для Алиса @ localhost для подключения
  • третий поток: использует SOCKS 192.168.12.:8080 для andrew @ localdomain для подключения

и так далее. Можете ли вы сказать мне, как это сделать?

1 Ответ

2 голосов
/ 24 сентября 2011

Вам нужно создать свой собственный сокет, используя нужный прокси:

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;
    }
}

Это все не проверено, но я верю, что это все, что вам нужно сделать. Это должно, по крайней мере, поставить вас на правильный путь.

...