2012-04-17 6 views
0

У меня есть простой апплет, который отправляет почту с помощью smtp.gmail.com при нажатии кнопку «Отправить почту». Он отлично работает от Eclipse. Из eclipse Я запускаю его как Java-апплет и отправляет почту без каких-либо ошибок.
Но при запуске из AppletViewer, вне затмения он выдает ошибку: java.security.AccessControlException: доступ запрещен (java.net.SocketPermission smtp.gmail.com разрешаемыми)
Я подписал БАНКУ моей программы , После подписания он отправляет почту, если апплет запущен из Internet Explorer, но выдает указанную выше ошибку, если апплет запущен из браузера Google Chrome или appletviewer.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

команды подписать банку: \ 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». Это то, что вы должны исследовать, поскольку файлы политики не подходят для реального развертывания WWW. –

+0

Не могли бы вы рассказать об этом еще немного? И как продвигаться вперед с развертыванием на реальном веб-сервере? Будет ли это проблемой с общим сервером или с выделенным сервером? – Gun

ответ

2

Апплет работает в песочнице с некоторыми ограничениями, вы должны настроить файл JRE/LIB/безопасность/java.policy добавив строку:

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

Спасибо, Диего, за помощь. Но он все еще не работает. Событие попробовало предоставить «grant { разрешение java.security.AllPermission; };" в файле java.policy. Но не получилось. Любая идея, как Eclipse работает appletviewer. Любая идея точной команды, используемой Eclipse для запуска того же самого? – Gun

+0

Эй, это сработало. Мой плохой :(Я менялся в jre/lib/security JRE, который был установлен отдельно. В то время как я должен был меняться в JRE, установленном JDK, поскольку в переменных среды он определен как JAVA_HOME. Большое спасибо. знаю, почему он не может работать только с помощью подписанного апплета. И с этим я хотел бы знать, может ли у нас быть какой-то пакетный скрипт, который может устанавливать уровни разрешений, поскольку это поможет автоматизировать процесс сборки. – Gun

+0

@Gun, вам удалось написать пакетный скрипт для автоматизации этой задачи? Мы сейчас в такой ситуации? –