public Settings discoverSettings()

in server/src/main/java/org/apache/hupa/server/utils/SettingsDiscoverer.java [34:167]


    public Settings discoverSettings(String email) {

        if (!email.matches("^(.*<)?[A-Za-z0-9._%'*/=+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(>)?\\s*$")) {
            return new SettingsImpl();
        }

        String domain = email.replaceFirst("^.*@", "");

        Settings s = validConfigs.get(domain);
        if (s != null) {
            return s;
        }

        String [] mxHosts = null;
        try {
            mxHosts = lookupMailHosts(domain);
        } catch (Exception e) {
            mxHosts = new String[0];
        }

        s = settingsProvider != null ? settingsProvider.get() : new SettingsImpl();

        if (email.matches(".*@gmail.com") || isValidMx(".*google.*.com", mxHosts)) {
            s.setImapServer("imap.gmail.com");
            s.setImapPort(993);
            s.setImapSecure(true);
            s.setSmtpServer("smtp.gmail.com");
            s.setSmtpPort(587); //465
            s.setSmtpSecure(true);
            s.setSmtpAuth(true);
            s.setInboxFolderName("INBOX");
            s.setSentFolderName("[Gmail]/Sent");
            s.setTrashFolderName("[Gmail]/Trash");
            s.setDraftsFolderName("[Gmail]/Drafts");
        } else if (email.matches(".*@(yahoo|ymail)\\....?") || isValidMx(".*google.*\\....?", mxHosts)) {
            s.setImapServer("imap.mail.yahoo.com");
            s.setImapPort(993);
            s.setImapSecure(true);
            s.setSmtpServer("smtp.mail.yahoo.com");
            s.setSmtpPort(465);
            s.setSmtpSecure(true);
            s.setSmtpAuth(true);
            s.setInboxFolderName("INBOX");
            s.setSentFolderName("Sent");
            s.setTrashFolderName("Trash");
            s.setDraftsFolderName("Templates");
        } else if (email.matches(".*@(hotmail|outlook|live).com")) {
            s.setImapServer("imap-mail.outlook.com");
            s.setImapPort(993);
            s.setImapSecure(true);
            s.setSmtpServer("smtp-mail.outlook.com");
            s.setSmtpPort(587);
            s.setSmtpSecure(true);
            s.setSmtpAuth(true);
            s.setInboxFolderName("INBOX");
            s.setSentFolderName("Sent");
            s.setTrashFolderName("Trash");
            s.setDraftsFolderName("Templates");
        } else {
            String[] hostNames = new String[]{"imap." + domain, "smtp." + domain, "www." + domain, "mail." + domain, domain};
            String[] hosts = (String[])ArrayUtils.addAll(hostNames, mxHosts);

            Integer[] imapPorts = new Integer[]{993, 585, 143};
            Integer[] smtpPorts = new Integer[]{465, 587, 25};
            Integer[] ports = (Integer[])ArrayUtils.addAll(imapPorts, smtpPorts);

            final List<String> validPorts = new ArrayList<String>();
            ExecutorService es = Executors.newCachedThreadPool();
            for (final String h : hosts) {
                if (isValidHostName(h)) {
                    for (final Integer p : ports) {
                        es.execute(new Runnable() {
                            public void run() {
                                if (isValidPort(h, p)) {
                                    validPorts.add(h + ":" + p);
                                }
                            }
                        });
                    }
                }
            }

            try {
                es.awaitTermination(1500, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("ValidPorts: " + domain + " -> "+ validPorts);

            boolean imapdone = false;
            loop: for (final String h : hosts) {
                for (final Integer p : imapPorts) {
                    if (validPorts.contains(h + ":" + p)) {
                        s.setImapServer(h);
                        s.setImapPort(p);
                        s.setImapSecure(p != 143);
                        imapdone = true;
                        break loop;
                    }
               }
            }
            if (!imapdone) {
                s.setImapServer("");
                s.setImapPort(0);
                s.setImapSecure(false);
            }

            boolean smtpdone = false;
            loop: for (final String h : hosts) {
                for (final Integer p : smtpPorts) {
                    if (validPorts.contains(h + ":" + p)) {
                        s.setSmtpServer(h);
                        s.setSmtpPort(p);
                        s.setSmtpSecure(p != 25);
                        smtpdone = true;
                        break loop;
                    }
               }
            }
            if (!smtpdone) {
                s.setSmtpServer("");
                s.setSmtpPort(0);
                s.setSmtpSecure(false);
            }

            s.setSmtpAuth(true);
            s.setInboxFolderName("INBOX");
            s.setSentFolderName("Sent");
            s.setTrashFolderName("Trash");
            s.setDraftsFolderName("Drafts");
            System.out.println("Returning config: \n" + s);
        }
        return s;
    }