【问题标题】:How to let javamail support http proxy如何让javamail支持http代理
【发布时间】:2016-03-29 07:30:45
【问题描述】:

我发现javamail只支持socks。有什么解决方案可以用来支持 http 代理吗?

public class MailConnectionTest {
 public static void main(String args[]) throws MessagingException {
   Properties props = MailConnectionTest.getProperties();
   Session session = Session.getDefaultInstance(props, null);
   String protocol = "pop3";
   String host = "pop.163.com";
   String username = "email username";
   String password = "1Qaz2wsx3edc&";
   Store store = session.getStore(protocol);
   store.connect(host, username, password);
   System.out.println("Success");
}
private static Properties getProperties() {
 Properties props = System.getProperties();
 props.put("mail.debug", "false");
 // Proxy
 props.put("proxySet", "true");
 props.put("http.proxyHost", "proxyAdderss");
 props.put("http.proxyPort", "8080");
 return props;
}
}

【问题讨论】:

  • 你的问题没有意义。 HTTP 代理用于 HTTP。 JavaMail 使用 SMTP 和 POP3 和 IMAP。不是 HTTP。
  • 这就是我的观点。你的意思是javamail没有办法使用http代理。那么,javamial 可以使用 socks 代理吗?那怎么用呢?
  • 你为什么要那个? SMTP应该不错吧?
  • 我找不到你。 SMTP 是一种发送电子邮件的协议。但我的观点是使用 POP3 或 IMAP 来接收邮件。

标签: java jakarta-mail http-proxy


【解决方案1】:

根据 Javamail API 1.6.2 的最新版本,JavaMail 支持通过 Web 代理服务器访问邮件服务器,还支持对代理服务器进行身份验证。请在下面查看我的代码。

import java.io.IOException;
import java.net.Authenticator;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Flags.Flag;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.search.FlagTerm;

public class ReadMailProxy {

    public static void receiveMail(String userName, String password) {
        try {
            String proxyIP = "124.124.124.14";
            String proxyPort = "4154";
            String proxyUser = "test";
            String proxyPassword = "test123";
            Properties prop = new Properties();
            prop.setProperty("mail.imaps.proxy.host", proxyIP);
            prop.setProperty("mail.imaps.proxy.port", proxyPort);
            prop.setProperty("mail.imaps.proxy.user", proxyUser);
            prop.setProperty("mail.imaps.proxy.password", proxyPassword);

            Session eSession = Session.getInstance(prop);

            Store eStore = eSession.getStore("imaps");
            eStore.connect("imap.mail.yahoo.com", userName, password);

            Folder eFolder = eStore.getFolder("Inbox");
            eFolder.open(Folder.READ_WRITE);
            Message messages[] = eFolder.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false));
            System.out.println(messages.length);
            for (int i = messages.length - 3; i < messages.length - 2; i++) {
                Message message = messages[i];
                System.out.println("Email Number::" + (i + 1));
                System.out.println("Subject::" + message.getSubject());
                System.out.println("From::" + message.getFrom()[0]);
                System.out.println("Date::" + message.getSentDate());

                try {
                    Multipart multipart = (Multipart) message.getContent();

                    for (int x = 0; x < multipart.getCount(); x++) {
                        BodyPart bodyPart = multipart.getBodyPart(x);

                        String disposition = bodyPart.getDisposition();

                        if (disposition != null && (disposition.equals(BodyPart.ATTACHMENT))) {
                            System.out.println("Mail have some attachment : ");

                            DataHandler handler = bodyPart.getDataHandler();
                            System.out.println("file name : " + handler.getName());
                        } else {
                            System.out.println(bodyPart.getContent());
                        }

                    }
                } catch (Exception e) {
                    System.out.println("Content: " + message.getContent().toString());
                }

                message.setFlag(Flag.SEEN, true);
            }
            eFolder.close(true);
            eStore.close();

        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        receiveMail("umesh@yahoo.com", "test123");
    }

}

【讨论】:

  • 是否需要 IP 或任何主机名有效?许多公司代理都有一个 DNS 名称。
【解决方案2】:

javamail api 1.6 支持网络服务器代理

设置这些属性

mail.protocol.proxy.host

mail.protocol.proxy.port

对于 smtp 设置为

mail.smtp.proxy.host

mail.smtp.proxy.port

【讨论】:

    【解决方案3】:

    查看 JavaMail 常见问题解答:

    ... 如果没有这样的 SOCKS 服务器,如果您想使用 JavaMail 间接访问防火墙外的邮件服务器,您可以使用诸如 Corkscrewconnect 之类的程序通过HTTP 代理服务器。 JavaMail 不支持通过 HTTP 代理 Web 服务器直接访问。

    【讨论】:

    • 谢谢。我明白你的意思。我需要一个程序或工具来通过 HTTP 代理服务器建立连接。那么如何将我的 Java 代码与 Corkscrew 集成或连接为单个 Java 类?我的意思是有一个罐子可以用来让它变得简单。
    • 没有。设置这些其他程序之一后,您需要配置 JavaMail 以将它们用作 SOCKS 代理服务器。
    • 我画了一个流程。 JavaMail -> SOCKS 代理 -> Corkscrew 或连接 -> http 代理服务器。这样对吗?所以 Corkscrew 或者 connect 就像一个适配器,可以将 socks 代理转为 http 代理?
    • 是的,它一个 SOCKS 代理,流程中没有单独的 SOCKS 代理。
    • 感谢您的帮助。
    【解决方案4】:

    该实现仅支持 Web 代理的基本身份验证。您可以在 com.sun.mail.util.SocketFetcher 中找到源代码。

    由于javamail已经支持NTLM认证,所以Web代理支持NTLM认证并不难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-25
      • 2018-04-09
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多