如何通过代理服务器以Java(JSP)发送电子邮件?

时间:2015-07-06 05:46:08

标签: java jsp email proxy javamail

我正在使用JavaMail API在J中发送电子邮件。如果我在没有代理的情况下通过网络使用它,它的工作正常,但我们的大学使用代理服务器,这就是为什么它不能在大学里工作。我认为我们的大学代理服务器仅支持HTTP和HTTPS代理,而不支持SOCKS代理。 我用过

    props.put("http.proxyHost", "XXX.XXX.XXX.XXX");
    props.put("http.proxyPort", "XXXX");
    props.put("https.proxyHost", "XXX.XXX.XXX.XXX");
    props.put("https.proxyPort", "XXXX");

我也尝试设置

    props.put("mail.smtp.socks.host","XXX.XXX.XXX.XXX");
    props.put("mail.smtp.socks.port","XXXX");

但仍然没有工作会产生错误,如

javax.mail.MessagingException: Could not connect to SMTP host: smtp.mail.yahoo.com, port: 465;
  nested exception is:
    java.net.SocketException: Malformed reply from SOCKS server
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1972)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:642)
    at javax.mail.Service.connect(Service.java:317)
    at javax.mail.Service.connect(Service.java:176)
    at javax.mail.Service.connect(Service.java:125)
    at javax.mail.Transport.send0(Transport.java:194)
    at javax.mail.Transport.send(Transport.java:124)
    at EmailUtil.sendEmail(EmailUtil.java:33)
    at SSLEmail.main(SSLEmail.java:57)
Caused by: java.net.SocketException: Malformed reply from SOCKS server
    at java.net.SocksSocketImpl.readSocksReply(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:319)
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:233)
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1938)
    ... 8 more

我知道JavaMail不支持通过Web代理服务器访问邮件服务器。请建议如何重新获得它?或者请建议其他机制,API用于通过Java JSP发送电子邮件。并且还提出了通过Java(JSP)发送SMS的一些想法。

2 个答案:

答案 0 :(得分:0)

请参阅:JAVA mail API FAQ ,尽管它可以使用SOCKS代理服务器。

  

如果您的代理服务器支持SOCKS V4或V5协议   (http://www.socks.nec.com/aboutsocks.html,RFC1928)并允许   匿名连接,您正在使用JDK 1.5或更高版本和JavaMail   1.4.5或更新版本,您可以通过设置" mail.smtp.socks.host"在每个会话,每个协议的基础上配置SOCKS代理。财产   在com.sun.mail.smtp包的javadocs中描述。类似   属性存在于" imap"和" pop3"协议

答案 1 :(得分:0)

您可以尝试Simple Java Mail,这是一个活跃的开源库,您可以使用它轻松配置SOCKS5代理(甚至是经过身份验证的代理!)。

Mailer mailer = new Mailer(
        new ServerConfig(smtpHost, smtpPort, smtpUser, smtpPassword),
        TransportStrategy.SMTP_PLAIN,
        new ProxyConfig(proxyHost, proxyPort /*, proxyUser, proxyPassword */)
);