如何在java邮件中设置socks代理用户名/密码

时间:2012-07-12 19:07:36

标签: proxy javamail socks

我使用javamail发送邮件(SMTP协议)如下

String host = "smtp.gmail.com";
:
props.put("mail.smtp.auth", "true");

props.put("mail.smtp.socks.host","sock_proxy_host");
props.put("mail.smtp.socks.port","sock_proxy_port");

Session session = Session.getInstance(props,new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("..", "..");
        }
});

但我使用的socks代理需要基本身份验证。我正在尝试将凭据设置为

System.setProperty("java.net.socks.username", "socks_username");             
System.setProperty("java.net.socks.password", "socks_passwd");

有没有其他方法可以设置socks代理用户名/密码(使用javamail API)?

3 个答案:

答案 0 :(得分:0)

根据the documentation,如果没有设置java.net.Authenticator,则只查询java.net.socks.username属性。也许JVM中的其他一些代码设置了默认的Authenticator?如果您有适当的权限,请尝试setting your own default java.net.Authenticator

答案 1 :(得分:0)

您应该从java.net.Authenticator:

定义一个类实现
java.net.Authenticator authenticator = new java.net.Authenticator() {

 protected java.net.PasswordAuthentication getPasswordAuthentication() {
      return new java.net.PasswordAuthentication(username, password.toCharArray());
      }
 };

System.setProperty("java.net.socks.username", username); 
System.setProperty("java.net.socks.password", password); 
java.net.Authenticator.setDefault(authenticator);

答案 2 :(得分:0)

JavaMail不支持代理身份验证,只支持匿名SOCKS代理。我不知道除Simple Java Mail之外的任何java库,它是开源的。

简单Java Mail使用a trick添加对经过身份验证的代理的支持:它运行临时匿名SOCKS服务器,以便JavaMail连接到同一主机,然后通过手动身份验证到JavaMail外部的外部SOCKS代理来中继连接

这里再次提供您的代码,但这次使用的是Simple Java Mail:

Mailer mailer = new Mailer(
        new ServerConfig("smtp.gmail.com", thePort, "..", ".."),
        TransportStrategy.SMTP_TLS,
        new ProxyConfig("sock_proxy_host", "sock_proxy_port", socks_username, socks_passwd)
);

mailer.sendMail(email);

您不需要设置任何属性或其他配置,所有这些都需要处理。