4

我正在使用 GlassFish Server 3.1 和 Java 邮件 Api 1.4.5。

场景:我有一个小程序,点击它会发送一封电子邮件。

发送邮件在 Netbeans AppletViewer 上完美运行,但是当添加到浏览器并尝试从那里发送电子邮件时,它变成了地狱。

我已经阅读了几个小时,关于策略文件、签名/未签名的小程序......等等。

我尝试过使用签名的小程序(那里有很多用于签名的教程,使用 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 在浏览器下载它时执行,给用户任何选择,这就是为什么如果你想让你的小程序由其他人部署和执行(当小程序访问服务器而不是它被部署的服务器时)它必须被签名(自签名证书或由授权组织签名的证书,这通常意味着支付一些费用),以便用户可以“接受”使用所述 Applet 的后果,使其“脱离沙箱”。

出于某种原因,使用 keytolls 和 jarsigner 使用自我证书对其进行签名对我没有任何作用。即使当我访问该网页并且浏览器警告我执行小程序(让我选择不执行它)并且我接受了上述警告时,JApplet 似乎没有获得它的权限。

我的男朋友建议将电子邮件课程移出“沙箱”。他解决了这个问题(祝福他!),将 emailClass(使用 java 邮件 api 的那个)移动到服务器上没有任何问题。使用客户端-服务器架构的前端控制器命令,我所要做的就是使用我在问题开头发布的代码实现我的控制器类,并从我的小程序(单击按钮时)发送一个 http-request与我的 servlet 的 toEmailAddress、主题和正文。

完美运行。

于 2012-12-10T11:43:46.123 回答
2

您必须对小程序进行签名,以便它可以连接到加载它的主机以外的主机,并且您必须使用非自签名证书,或者用户必须在出现提示时接受证书。

于 2012-12-10T09:00:19.483 回答
1

用带有签名的 JNLP 分发你的程序,很容易解决这种情况。

查看有关 IDE 的 JNLP 的教程并阅读此内容以获取更多信息: http ://docs.oracle.com/javase/6/docs/technotes/guides/jweb/deployment_advice.html

于 2013-03-31T14:53:59.500 回答