4

GlassFishServer3.1とJavaメールApi1.4.5を使用しています。

シナリオ:アプレットがあり、クリックすると電子メールメッセージが送信されます。

メールの送信はNetbeansAppletViewerで完全に機能しますが、ブラウザに追加してそこからメールを送信しようとすると、地獄に変わります。

ポリシーファイル、署名付き/署名なしアプレットなどについて、何時間も読んでいます。

署名されたアプレットを使用してみました(署名するためのチュートリアルがたくさんありますが、Javaのkeytoolsを使用すると非常に簡単でした)。ブラウザで実行すると、自己署名証明書であるため許可を求められますが、許可を与えますが、それでも同じ例外が発生します。

また、java.poilcyファイルの追加を変更してみました

パーミッションjava.net.SocketPermission"smtp.gmail.com:587"、 "listen、resolve";

しかし、何もありません。

JavaコントロールパネルでJavaコンソールをアクティブ化したので、その例外であることはわかっています。私は本当に他に何をすべきかわかりません。

メールを送信するコードは次のとおりです。

    String host = "smtp.gmail.com";
    String from = *****;
    String pass = ******;
    Properties props = new Properties();
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.user", from);
    props.put("mail.smtp.password", pass);
    props.put("mail.smtp.port", "587");
    props.put("mail.smtp.auth", "true");

    Session session = Session.getDefaultInstance(props, null);
    this.message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));

    InternetAddress toAddress = new InternetAddress(this.to);
    this.message.addRecipient(Message.RecipientType.TO, toAddress);

    this.message.setSubject(this.subject);

    this.message.setText(this.body);

    Transport transport = session.getTransport("smtp");
    transport.connect(host, from, pass);
    transport.sendMessage(this.message, this.message.getAllRecipients());
    transport.close();
4

4 に答える 4

3

JAppletはそれ自体が「サンドボックス」にあり、通常のアプリケーションとは異なるアクセス許可が与えられます(アプリケーションは、ユーザーが直接選択した場合にのみ実行されるため、ユーザーは結果を受け入れます)。JAppletは、ブラウザがダウンロードしたときに実行され、ユーザーにオプションを提供しません。そのため、アプレットを他の人に展開して実行させたい場合(アプレットが展開元のサーバー以外のサーバーにアクセスする場合)、JAppletを実行する必要があります。ユーザーが前述のアプレットを使用した結果を「受け入れ」、「サンドボックスから」許可できるように、署名されている(自己署名証明書または認定された組織によって署名された証明書。通常は料金の支払いを意味します)。

何らかの理由で、keytollsとjarsignerを使用して自己証明書で署名しても、私にはまったく機能しませんでした。Webページにアクセスし、ブラウザがアプレットの実行について警告し(実行しないオプションを表示)、その警告を受け入れたにもかかわらず、JAppletがアプレットのアクセス許可を取得していないようでした。

私のボーイフレンドは、メールクラスを「サンドボックス」から移動することを提案しました。彼はそれを解決し(彼を祝福します!)、emailClass(java mail apiを使用するもの)をサーバーに移動しても問題はありませんでした。クライアントサーバー構造のフロントコントローラーコマンドを使用して、質問の最初に投稿したコードを使用してコントローラークラスを実装し、アプレットから(ボタンがクリックされたときに)http-requestを送信するだけで済みました。 toEmailAddress、subject、およびbodyをサーブレットに追加します。

完璧に動作します。

于 2012-12-10T11:43:46.123 に答える
2

アプレットがロード元以外のホストに接続できるようにアプレットに署名する必要があります。また、自己署名証明書を使用するか、プロンプトが表示されたらユーザーが証明書を受け入れる必要があります。

于 2012-12-10T09:00:19.483 に答える
1

注目すべきいくつかのこと:

1)アプレットの署名が正しいことを再確認し、確認します。

2)crossdomain.xmlを見てください:

3)applet.policyを見てください

于 2012-12-10T01:03:56.990 に答える
1

署名付きのJNLPを使用してプログラムを配布すると、このような状況を簡単に解決できます。

IDEのJNLPに関するチュートリアルを確認し、詳細についてはこれをお読みください: http: //docs.oracle.com/javase/6/docs/technotes/guides/jweb/deployment_advice.html

于 2013-03-31T14:53:59.500 に答える