【问题标题】:How to set socks proxy username/password in java mail如何在 java 邮件中设置 socks 代理用户名/密码
【发布时间】:2012-07-12 19:07:36
【问题描述】:

我使用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)吗?

【问题讨论】:

  • JavaMail 使用 java.net.Proxy 类来提供 SOCKS 支持,遗憾的是它不允许指定代理的用户名和密码。希望按照以下建议设置身份验证器。

标签: proxy jakarta-mail socks


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您应该从 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);
    

    【讨论】:

      【解决方案3】:

      JavaMail 不支持代理认证,只支持匿名 SOCKS 代理。除了Simple Java Mail,我不知道有任何java库,它是开源的。

      Simple 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);
      

      您无需设置任何属性或其他配置,一切都已处理完毕。

      【讨论】:

        猜你喜欢
        • 2017-01-20
        • 2018-12-22
        • 2014-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多