4

Javaデスクトップアプリケーションに「フィードバックの送信」オプションを実装したいと思います。ユーザーがコメントを入力するためのボックスをポップアップし、アプリケーションウィンドウのスクリーンショットと一緒にそれを私たちに送信するもの。

データを私たちに伝えるための最良の方法はどのようになりますか?2つの明らかな解決策が思い浮かびます。

  • 電子メール-アプリケーションは、ユーザー名/パスワードがコードに隠された状態で、私たちが設定したSMTPサーバーに接続すると思います。セキュリティのためのSMTPoverSSL(送信されるデータではなく、SMTPユーザー名/パスワード)。
  • Webサービス-かなり自明です。

これらのどれが最良でしょうか、それともより良い代替案がありますか?

4

3 に答える 3

7

SMTP サーバーへの接続がブロックされる可能性があるため、Web サービスの方がはるかに優れています。

もう 1 つのアイデアは、Google ドキュメントを使用することです。これはウェブサイトのアイデアに似ていますが、サーバー側のものを自分で設定する必要はありません. 収集するフィールドを含む Google ドキュメント スプレッドシートを作成し、Google ドキュメント API を使用して、Java アプリでスプレッドシートに送信内容を書き込むことができます。次に、スプ​​レッドシートに通知を追加して、新しい行が書き込まれたときに自動的に電子メールを送信します。

于 2010-02-18T16:23:25.737 に答える
1

Web サービスはより信頼性が高く、扱いにくいように思えます。クライアントは通常、ファイアウォールの問題なしで HTTP 接続を確立できます。HTTP サーバーとリクエストのセットアップ、保守、処理がはるかに簡単です。

于 2010-02-18T16:21:17.237 に答える
1

他の人が言及しているように、ファイアウォールは SMTP の問題です。それでも、独自のインフラストラクチャや「隠し」パスワードをホストせずに、メールを配信する簡単な方法があります。gmail などの無料のメール アカウントを登録して、このアドレスに直接メールを送信するだけです。Gmail の SMTP サーバーをリレーとして使用していないため、ユーザー名とパスワードは必要ありません。

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

したがって、javax.mail の最初の選択肢として「gmail-smtp-in.l.google.com」を使用します。

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

このアプローチを、AppEngine でホストされる単純な HTTP から SMTP への種類のサービスと組み合わせることもできます。HTTP POST リクエストを受信し、上記の方法を使用して電子メールとして転送するだけです。

于 2010-02-18T16:33:14.667 に答える