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;
}