2012-04-17 54 views
0

我創建了一個簡單的小程序,它通過在點擊時使用smtp.gmail.com發送郵件一個按鈕「發送郵件」。它可以從Eclipse中完美運行。從日食我運行它作爲Java Applet,它發送郵件沒有任何錯誤。
但是從appletviewer中運行時,月食外,它拋出一個錯誤:java.security.AccessControlException:訪問被拒絕(java.net.SocketPermission smtp.gmail.com解析)
我簽署了我的程序的JAR 。簽名後,如果applet從Internet Explorer運行,它會發送郵件,但如果從Google Chrome瀏覽器或appletviewer運行applet,則會引發上述錯誤。Appletviewer未從命令提示符運行:java.security.AccessControlException:訪問被拒絕(java.net.SocketPermission smtp.gmail.com解析)

命令使一個密鑰: 「C:\ Program Files文件\的Java \ JRE6 \ BIN \ keytool.exe的」 -genkey -alias -validity 365 -keystore -keyalg RSA

司令部簽署的jar: \ bin \ jarsigner.exe -signedjar -keystore

JAR是通過僅從Eclipse導出相同的文件而形成的。

命令來運行小程序: 「C:\ Program Files文件\的Java \ jdk1.6.0_27 \ BIN \ appletviewer.exe」

請看看轉換成代碼,讓我知道我做錯了...

代碼的小程序

package in.appletmail; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

@SuppressWarnings("serial") 
public class SendMailApplet extends JApplet 
{ 
    boolean isStandalone = false; 
    JPanel jPanel1 = new JPanel(); 
    JTextField jTextField1 = new JTextField(); 
    JButton jButton = new JButton("Send Mail"); 
    GridBagLayout gridBagLayout1 = new GridBagLayout(); 

    // Construct the applet 
    public SendMailApplet() 
    { 
     // TODO Auto-generated constructor stub 
    } 

    // Initialize the applet 
    public void init() 
    { 
     try 
     { 
      jbInit(); 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    // Initializing the components 
    private void jbInit() throws Exception 
    { 
     this.setSize(new Dimension(500, 200)); 
     jPanel1.setLayout(gridBagLayout1); 

     jTextField1.setText("First Applet"); 
     this.getContentPane().add(jPanel1, BorderLayout.CENTER); 
     jPanel1.add(jTextField1, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, 
       GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, 
       new Insets(140, 128, 139, 132), 77, 0)); 

     jPanel1.add(jButton, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, 
       GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, 
       new Insets(140, 128, 200, 132), 77, 0)); 


     final String mailStatus = "Testing Applet Viewer"; 
     jTextField1.setText(mailStatus); 

     jButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       try 
       { 
        SendMail.mailVariable("Test mail from applet"); 
        jTextField1.setText("Mail Send"); 
       } catch (Exception e1) 
       { 
        jTextField1.setText(e1.toString()); 
       } 

      } 
     }); 
     // jTextField1.setText("Mail Send"); 
    } 

    // Start the applet 
    public void start() 
    { 

    } 

    // Stop the applet 
    public void stop() 
    { 

    } 

    // Delete the applet 
    public void destroy() 
    { 

    } 

    // Fetch applet information 
    public String getAppletInfo() 
    { 
     return "Applet-Information"; 
    } 
} 

代碼發送郵件

package in.appletmail; 

import java.util.Properties; 

import javax.mail.Authenticator; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public final class SendMail 
{ 
    private static final String SMTP_HOST_NAME = "smtp.gmail.com"; 
    private static final String SMTP_PORT = "587"; 
    private static final String SMTP_AUTH_USER = "username"; 
    private static final String SMTP_AUTH_PWD = "pass"; 

    private static final String emailMsgTxt = "Testing mail from Applet, Test again"; 
    private static final String emailSubjectTxt = "Test mail from Applet via Google"; 
    private static final String emailFromAddress = "[email protected]"; 

    // Add List of Email address to who email needs to be sent to 
    private static final String[] emailList = { "[email protected]" }; 

    public static String testFunctionCall() 
    { 
     return "Mailing function will be called"; 
    } 

    public static String mailVariable(String variableValue) 
      throws MessagingException 
    { 
     SendMail smtpMailSender = new SendMail(); 
     return smtpMailSender.postMail(emailList, emailSubjectTxt, emailMsgTxt 
       + "\n variable value: " + variableValue, emailFromAddress); 
    } 

    public String postMail(String recipients[], String subject, String message, 
      String from) throws MessagingException 
    { 
     StringBuffer status = new StringBuffer(); 
     boolean debug = false; 

     // Set the host smtp address 
     Properties props = new Properties(); 
     props.put("mail.smtp.starttls.enable", "true"); 
     props.put("mail.smtp.host", SMTP_HOST_NAME); 
     props.put("mail.smtp.port", SMTP_PORT); 
     props.put("mail.smtp.auth", "true"); 

     Authenticator auth = new SMTPAuthenticator(); 
     Session session = Session.getDefaultInstance(props, auth); 

     session.setDebug(debug); 
     status.append("Session set;"); 
     // create a message 
     Message msg = new MimeMessage(session); 

     // set the from and to address 
     InternetAddress addressFrom = new InternetAddress(from); 
     msg.setFrom(addressFrom); 

     InternetAddress[] addressTo = new InternetAddress[recipients.length]; 
     for (int i = 0; i < recipients.length; i++) 
     { 
      addressTo[i] = new InternetAddress(recipients[i]); 
     } 
     msg.setRecipients(Message.RecipientType.TO, addressTo); 
     status.append("Recipients set;"); 

     // Setting the Subject and Content Type 
     msg.setSubject(subject); 
     msg.setContent(message, "text/plain"); 
     status.append("Subject and Content set;"); 
     Transport.send(msg); 
     status.append("Mail send;"); 
     return status.toString(); 
    } 

    /** 
    * SimpleAuthenticator is used to do simple authentication when the SMTP 
    * server requires it. 
    */ 
    private class SMTPAuthenticator extends Authenticator 
    { 

     public PasswordAuthentication getPasswordAuthentication() 
     { 
      String username = SMTP_AUTH_USER; 
      String password = SMTP_AUTH_PWD; 
      return new PasswordAuthentication(username, password); 
     } 
    } 
} 

HTML調用的小程序:

<html> 

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<title>ABC</title> 
</head> 
<body bgcolor="#CCCCCC"> 

<table border="0" cellpadding="0" cellspacing="0" width="144" > 
    <tr> 
    <td width="10%" height="25" style= "height:25">Powered by Xpace :) 
    </td> 
    <td width="90%"style= "height:25"> 
    <APPLET CODEBASE="E:\Gunjan\Workspace\TestAppletExecution\Signed\" 
     ARCHIVE="TestApplet.jar, mail.jar" 
     CODE="in.appletmail.SendMailApplet.class" 
     NAME="Send Mail" 
     MAYSCRIPT 
     WIDTH="750" 
     HEIGHT="350" 
     HSPACE="0" VSPACE="0" ALIGN="top">   
    </APPLET> 
    </td> 
    </tr> 
</table> 
</body> 


</html> 
+0

* 「我已經簽署了JAR ..但是如果從Google Chrome瀏覽器運行applet,則會拋出上述錯誤。」*這是您應該調查的內容,因爲策略文件不適合真正的WWW部署。 – 2012-04-18 03:46:24

+0

你能不能請更多的燈光?以及如何在實際的Web服務器上進行部署?這是共享服務器還是專用服務器的問題? – Gun 2012-05-09 04:29:31

回答

2

的小程序運行在有一些限制沙箱,您必須配置文件的jre/lib/security中/添加的java.policy行:

permission java.net.SocketPermission "smtp.gmail.com:587", "listen,resolve"; 
+0

感謝diego的幫助。但它仍然不起作用。事件嘗試提供「授予java.security.AllPermission權限; };」在java.policy文件中。但沒有奏效。任何想法如何Eclipse運行appletviewer。 Eclipse的確切命令的任何想法運行相同? – Gun 2012-04-17 14:32:13

+0

嘿,它工作。我的錯誤:(我改變了jre/lib /安裝的JRE單獨安裝,而我應該改變JRE安裝的JDK,因爲它在環境變量中被定義爲JAVA_HOME,非常感謝。知道爲什麼它不能僅通過使用簽名的applet才能工作,並且我想知道是否可以使用一些可以設置權限級別的批處理腳本,因爲這將有助於自動執行生成過程。 – Gun 2012-04-17 16:02:12

+0

@Gun,你是否設法爲這個任務寫一個批處理腳本來自動化?我們現在處於同樣的狀況? – 2013-11-21 12:28:57

相關問題