Java-апплет, встроенный в HTML, вешает браузер при отправке электронной почты - PullRequest
0 голосов
/ 04 декабря 2011

Я пытаюсь создать сайт, который отправляет мне электронное письмо, когда кто-то открывает его.Он хранится локально, поэтому я не могу использовать php.Я решил пойти с Java-апплетом, и после большой работы (у Firefox есть некоторые серьезные проблемы с апплетами), это почти работает.Апплет полностью загружен, инициализирован, запущен и реагирует на кнопку html.

Я использую Javamail 1.4.4, и происходит то, что Firefox и Opera (оба браузера реагируют одинаково) зависают и примерно после20 секунд они снова работают нормально, но почта не отправляется.Это трассировка стека:

DEBUG: setDebug: JavaMail version 1.4.4
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true
network: Cache entry not found [url: http://smtp.gmail.com/crossdomain.xml, version: null]
network: Connecting http://smtp.gmail.com/crossdomain.xml with proxy=DIRECT
network: Connecting http://smtp.gmail.com:80/ with proxy=DIRECT
java.security.PrivilegedActionException: java.net.ConnectException: Connection timed out: connect
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.deploy.net.CrossDomainXML.check(Unknown Source)
    at com.sun.deploy.net.CrossDomainXML.check(Unknown Source)
    at sun.plugin2.applet.SecurityManagerHelper.checkConnectHelper(Unknown Source)
    at sun.plugin2.applet.AWTAppletSecurityManager.checkConnect(Unknown Source)
    at java.net.InetAddress.getAllByName0(Unknown Source)
    at java.net.InetAddress.getAllByName(Unknown Source)
    at java.net.InetAddress.getAllByName(Unknown Source)
    at java.net.InetAddress.getByName(Unknown Source)
    at java.net.InetSocketAddress.<init>(Unknown Source)
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:288)
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:231)
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1900)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638)
    at javax.mail.Service.connect(Service.java:295)
    at mai.Mai$1.run(Mai.java:66)
    at mai.Mai$1.run(Mai.java:42)
    at java.security.AccessController.doPrivileged(Native Method)
    at mai.Mai.send(Mai.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass$MethodInfo.invoke(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass$MemberBundle.invoke(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass.invoke0(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass.invoke(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$DefaultInvocationDelegate.invoke(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo.doObjectOp(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$LiveConnectWorker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.<init>(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
    at com.sun.deploy.net.CrossDomainXML$2.run(Unknown Source)
    ... 39 more
java.security.AccessControlException: access denied ("java.net.SocketPermission" "smtp.gmail.com" "resolve")
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkConnect(Unknown Source)
    at sun.plugin2.applet.SecurityManagerHelper.checkConnectHelper(Unknown Source)
    at sun.plugin2.applet.AWTAppletSecurityManager.checkConnect(Unknown Source)
    at java.net.InetAddress.getAllByName0(Unknown Source)
    at java.net.InetAddress.getAllByName(Unknown Source)
    at java.net.InetAddress.getAllByName(Unknown Source)
    at java.net.InetAddress.getByName(Unknown Source)
    at java.net.InetSocketAddress.<init>(Unknown Source)
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:288)
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:231)
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1900)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638)
    at javax.mail.Service.connect(Service.java:295)
    at mai.Mai$1.run(Mai.java:66)
    at mai.Mai$1.run(Mai.java:42)
    at java.security.AccessController.doPrivileged(Native Method)
    at mai.Mai.send(Mai.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass$MethodInfo.invoke(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass$MemberBundle.invoke(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass.invoke0(Unknown Source)
    at sun.plugin2.liveconnect.JavaClass.invoke(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$DefaultInvocationDelegate.invoke(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo.doObjectOp(Unknown Source)
    at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$LiveConnectWorker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

, и это код моего апплета (я где-то читал, что должен использовать doPrivileged (), но, похоже, в трассировке стека это не имеет значения):

package mai;

import java.applet.Applet;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;



public class Mai extends Applet{

    private static final String SMTP_HOST_NAME = "smtp.gmail.com";
    private static final int SMTP_HOST_PORT = 465;
    private static final String SMTP_AUTH_USER = "myMail@gmail.com";
    private static final String SMTP_AUTH_PWD = "myPassword";

    @Override
    public void init(){
        System.out.println("init");
    }

    public void send(){
        System.out.println("send");

        AccessController.doPrivileged(new PrivilegedAction<String>() {

                @Override
                public String run() {
                     try{

                        Properties props = new Properties();

                        props.put("mail.transport.protocol", "smtps");
                        props.put("mail.smtps.host", SMTP_HOST_NAME);
                        props.put("mail.smtps.auth", "true");
                        // props.put("mail.smtps.quitwait", "false");

                        Session mailSession = Session.getDefaultInstance(props);
                        mailSession.setDebug(true);
                        Transport transport = mailSession.getTransport();

                        MimeMessage message = new MimeMessage(mailSession);
                        message.setSubject("Testing SMTP-SSL");
                        message.setContent("This is a test", "text/plain");

                        message.addRecipient(Message.RecipientType.TO,
                             new InternetAddress("myMaill@gmail.com"));

                        transport.connect
                          (SMTP_HOST_NAME, SMTP_HOST_PORT, SMTP_AUTH_USER, SMTP_AUTH_PWD);

                        transport.sendMessage(message,
                            message.getRecipients(Message.RecipientType.TO));
                        transport.close();
                    }catch(Exception e){

                        e.printStackTrace();
                    }finally{
                         return "send";
                     }
                }
            });


    }
}

Я также читал, что могу подписать свой апплет, но он будет вызывать всплывающее окно каждый раз, когда загружается мой апплет, что невозможно, поскольку он должен быть немного скрыт.

Есть идеи, что я делаю не так?

(Если вы считаете, что использование апплета здесь слишком сложно, пожалуйста, покажите мне лучший способ. Из того, что я знаю, JavaScript не может отправлять электронную почту, у меня нет сервера, поэтому я не могу использовать phpили что-то вроде node.js и всех других библиотек, которые отправляют информацию, требуют входа пользователя).

1 Ответ

1 голос
/ 04 декабря 2011

Добро пожаловать в клуб разработчиков вредоносного кода (где вредоносные программы включают отслеживание). Вы находитесь в противоречии с политикой того же происхождения браузеров w.r.t. новые сетевые подключения. Это означает, что единственное место, к которому можно подключиться без подписи, - это хост, обслуживающий исходную страницу.

...