我使用的是 GlassFish Server 3.1 和 Java mail 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();
最佳答案
JApplet 位于其自身的“沙箱”中,被授予与常规应用程序不同的权限(应用程序仅在用户直接选择时执行,因此,用户接受后果)。 JApplet 在浏览器下载时执行,用户没有任何选择,这就是为什么如果您想让其他人部署和执行您的 applet(当 applet 访问服务器而不是部署它的服务器时),它必须签名(自签名证书或授权组织签名的证书,这通常意味着支付一些费用)以便用户可以“接受”使用所述小程序的后果,使其“脱离沙箱”。
出于某种原因,使用 keytolls 和 jarsigner 通过 self 证书对其进行签名对我来说不起作用。即使当我访问该网页并且浏览器警告我执行小程序时(让我选择不执行它)并且我接受了警告,但 JApplet 似乎没有获得它的权限。
我男朋友建议将电子邮件类移出“沙箱”。 他解决了它(祝福他!),将 emailClass(使用 java 邮件 api 的那个)移动到服务器没有任何问题。使用客户端-服务器架构的前端 Controller 命令,我所要做的就是使用我在问题开头发布的代码实现我的 Controller 类,并从我的小程序(单击按钮时)发送一个 http 请求将 toEmailAddress、主题和正文发送到我的 servlet。
完美运行。
关于java.security.AccessControlException : access denied ("java.net.SocketPermission" "smtp.gmail.com" "resolve"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13793578/