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

Posted

技术标签:

【中文标题】JavaMail:如何为不同的线程使用不同的 SOCKS5?【英文标题】:JavaMail: How to use different SOCKS5 for different threads? 【发布时间】:2011-09-24 18:20:11 【问题描述】:

我编写了多线程应用程序,它从每个线程的数据库中连接到一些电子邮件帐户。 我知道 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 连接

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

【问题讨论】:

【参考方案1】:

您需要使用所需的代理创建自己的套接字:

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 没有实现 Socket :( 呸,抱歉 - SMTPTransport 确实如此。 在 dest 变量中我需要设置 smtp 主机/smtp 端口吗?并且设置了 smtp 我不应该在 JavaMail 的属性中设置它? 正确,dest 是您的 smtp 服务器和端口。在这种情况下,您不使用属性。棘手的一点是如果您需要身份验证,因为您必须自己管理。试图找到一个好的参考,我已经很久没有做过了

以上是关于JavaMail:如何为不同的线程使用不同的 SOCKS5?的主要内容,如果未能解决你的问题,请参考以下文章

Javamail 中的线程安全

如何为 iPad 加载不同的笔尖?

如何为 .NET 中的不同环境使用不同的 .settings 文件?

如何为不同的 QWebEnginePage 实例设置不同的代理?

如何为不同的组使用不同的颜色创建散点图? [复制]

如何为不同的 UITableView 部分使用不同的表格视图单元格类