Реализация функции "Отправить отзыв" в настольном приложении Java

Я хотел бы реализовать опцию "Отправить отзыв" в настольном приложении Java. Тот, который выскакивает окно для ввода пользователем комментария, а затем отправляет его нам вместе со скриншотом окна приложения.

Как лучше всего передать нам данные? На ум приходят два очевидных решения:

  • Электронная почта - я думаю, что приложение подключится к настроенному нами SMTP-серверу, а имя пользователя / пароль будут каким-то образом скрыты в коде. SMTP через SSL для безопасности (не данных, которые отправляются, а имени пользователя / пароля SMTP).
  • Веб-сервис - довольно понятен.

Какой из них будет лучше, или есть лучшая альтернатива?

3 ответа

Решение

Webserivce будет гораздо лучше, так как соединение с SMTP-сервером может быть заблокировано.

Другой идеей было бы использовать Google Docs. Это было бы похоже на идею веб-сайта, но вам не нужно настраивать какие-либо вещи на стороне сервера самостоятельно. Вы можете создать электронную таблицу Документов Google с полями, которые вы будете собирать, а затем сделать так, чтобы приложение Java записало отправку в электронную таблицу с помощью API Google Docs. Затем добавьте уведомление в электронную таблицу, чтобы автоматически отправлять вам электронное письмо при написании новой строки.

Как упоминают другие, брандмауэры являются проблемой с SMTP. Тем не менее, существует простой способ доставки почты без размещения собственной инфраструктуры или "скрытых" паролей. Вы можете просто зарегистрировать бесплатную почтовую учетную запись, например, Gmail, и отправлять почту прямо на этот адрес. Поскольку вы не используете SMTP-сервер Gmail в качестве ретранслятора, вам не нужны имя пользователя и пароль.

public static String[] lookupMailHosts(final String domainName) throws NamingException {
    final InitialDirContext iDirC = new InitialDirContext();
    final Attributes attributes = iDirC
            .getAttributes("dns:/" + domainName, new String[] { "MX" });
    final Attribute attributeMX = attributes.get("MX");
    if (attributeMX == null) {
        return new String[] { domainName };
    }
    final String[][] pvhn = new String[attributeMX.size()][2];
    for (int i = 0; i < attributeMX.size(); i++) {
        pvhn[i] = ("" + attributeMX.get(i)).split("\\s+");
    }

    // sort the MX RRs by RR value (lower is preferred)
    Arrays.sort(pvhn, new Comparator<String[]>() {
        public int compare(final String[] o1, final String[] o2) {
            return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
        }
    });

    // put sorted host names in an array, get rid of any trailing '.'
    final String[] sortedHostNames = new String[pvhn.length];
    for (int i = 0; i < pvhn.length; i++) {
        sortedHostNames[i] = pvhn[i][1].endsWith(".") ? pvhn[i][1].substring(0, pvhn[i][1]
                .length() - 1) : pvhn[i][1];
    }
    return sortedHostNames;
}

например:

public static void main(String[] args) throws Exception {
    // prints [gmail-smtp-in.l.google.com, alt1.gmail-smtp-in.l.google.com, alt2.gmail-smtp-in.l.google.com, alt3.gmail-smtp-in.l.google.com, alt4.gmail-smtp-in.l.google.com]
    System.out.println(Arrays.asList(lookupMailHosts("gmail.com")));
}

поэтому вы должны использовать "gmail-smtp-in.l.google.com" в качестве первого выбора для javax.mail:

Properties props = new Properties();
props.setProperty("mail.smtp.host", lookupMailHosts("gmail.com")[0]);
// ... other properies
Session smtpSession = Session.getInstance(props, null)

Вы даже можете объединить этот подход с простым сервисом HTTP-SMTP, размещенным в AppEngine. Все, что нужно сделать, это получить HTTP-запросы POST и переслать их по электронной почте, используя метод, показанный выше.

Веб-сервис звучит более надежно и менее неуклюже. Клиент обычно может устанавливать HTTP-соединения без проблем с брандмауэром. Гораздо проще настроить, поддерживать и обрабатывать HTTP-сервер и запросы.

Другие вопросы по тегам