Как отправить почту с помощью Java Mail вне IDE - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь отправить электронное письмо в приложении JavaFX Все работает отлично, электронная почта отправляется в Reciepent, я не получаю никаких исключений и ошибок, когда запускаю его в IDE (InteliJ), но когда я запускаю приложение вне Intelij, оно не работает. Я сделал простую регистрационную форму, которая сохраняет данные из полей в моей базе данных:

String username;
String password;
String email;
Random rd = new Random();
int ID;
public void registerUser(javafx.event.ActionEvent ab) {
     username = textUser.getText();
     password = textPass.getText();
     email = textEmail.getText();

    ID = rd.nextInt(999999999);
    Connection connectt = null;


    try {

        Class.forName("org.sqlite.JDBC");
        connectt = DriverManager.getConnection("jdbc:sqlite:C:\\Users\\barte\\OneDrive\\Desktop\\sqlite databases\\PRODUCTS\\Products.db");
        String s = "INSERT INTO Users(Username,Password,Email,UserID)  VALUES (?,?,?,?) ";
        PreparedStatement registera = connectt.prepareStatement(s);
        registera.setString(1, username);
        registera.setString(2, password);
        registera.setString(3, email);
        registera.setInt(4, ID);

        System.out.println(username);
        System.out.println(password);
        System.out.println(email);
        registera.executeUpdate();
        System.out.println("Added to Database");
        sendMail();
        registerr.setStyle("-fx-background-color: #69ff59;");
        registerr.setText("Check Your MailBox");
        registerr.setOnMouseClicked(event -> {
            registerr.setText("Email Has been sent");
        });
        textUser.setText(null);
        textEmail.setText(null);
        textPass.setText(null);
        regiPane.setVisible(false);

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (MessagingException e) {
        e.printStackTrace();
    }
}

А вот код для отправки электронной почты:

public void sendMail() throws MessagingException {
    String USER_NAME = "stoc****";
    String from = USER_NAME;
    String PASSWORD = "************";
    String pass = PASSWORD;
    String RECIPT = textEmail.getText();
    String TOPIC = "Welcome " + username + "!";
    String BODY = "Dear user! " +
            "You can sign into StockFX by your ID/Username and password" +
            "User ID: " + ID + "\n" + "Password: " + password + "\n" +
            "We would like to thank you for using our services now and in future!";
    String[] to = {RECIPT};
    Properties props = System.getProperties();
    String host = "smtp.gmail.com";
    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, new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(
                    "****", PASSWORD);
        }
    });
    MimeMessage message = new MimeMessage(session);


    try {
        try {
            message.setFrom(new InternetAddress(from));
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        InternetAddress[] toAddress = new InternetAddress[to.length];
        // To get the array of addresses
        for (int i = 0; i < to.length; i++) {
            try {
                toAddress[i] = new InternetAddress(to[i]);
            } catch (AddressException e) {
                e.printStackTrace();
            }
        }
        for (int i = 0; i < toAddress.length; i++) {
            try {
                message.addRecipient(Message.RecipientType.TO, toAddress[i]);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
        try {
            message.setSubject(TOPIC);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        try {
            message.setText(BODY);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        try {
            message.saveChanges();
        } catch (MessagingException e) {
            e.printStackTrace();
        }


        registerr.setStyle("-fx-background-color: #69ff59;");
        registerr.setText("You can now log in");
        registerr.setDisable(false);
        textUser.setText(null);
        textEmail.setText(null);
        textPass.setText(null);
        regiPane.setVisible(false);
        Transport transport = session.getTransport("smtp");
        System.out.println("get protocl");
        transport.connect(host, from, pass);
        System.out.println("get host,from and password");
        transport.sendMessage(message, message.getAllRecipients());
        System.out.println("get recipients");
        transport.close();
        System.out.println("close");
        System.out.println("Email Sent Successfully!");
    } finally {
        System.out.println("Complete Process");
    }

}

Внутри InteliJ все работает нормально, но void sendEmail не будет работать в исполняемом фляге Я новичок в почте Java. Импорт:

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;
import javax.mail.internet.*;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
import java.util.Random;
import java.util.ResourceBundle;

Этот класс является классом контроллера

А это основной класс:

package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import java.io.IOException;

public class Main extends Application {

@Override
public void start(Stage UI) throws IOException {
    Parent root = FXMLLoader.load(getClass().getResource("DashBoard.fxml"));
    UI.setTitle("DIREXT SCANNER (DEMO VER 0.5)");
    UI.setScene(new Scene(root, 800, 600));
    UI.initStyle(StageStyle.UNDECORATED);
    UI.setResizable(false);
    UI.show();
    UI.setFullScreenExitHint("Press 'ESC' to exit full screen");

}
public static void main(String[] args){
    launch(args);
}
}

Я попытался пересобрать проект, снова удалить и добавить библиотеки, но тот же результат Кто-нибудь еще сталкивался с такой же проблемой? Это связано с IDE или мне не хватает импорта или методов? Я пытался найти похожий вопрос на форумах, я уже исправил несколько вещей, так как раньше запускаемый jar не запускался вообще. Если вопрос существует, может кто-нибудь предоставить ссылку.

редактировать это ошибка, которую я получаю при запуске jar из PowerShell:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(Unknown Source)
        at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
        at javafx.base/javafx.event.Event.fireEvent(Unknown Source)
        at javafx.graphics/javafx.scene.Node.fireEvent(Unknown Source)
        at javafx.controls/javafx.scene.control.Button.fire(Unknown Source)
        at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source)
        at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(Unknown Source)
        at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
        at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
        at javafx.base/javafx.event.Event.fireEvent(Unknown Source)
        at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Unknown Source)
        at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1300(Unknown Source)
        at javafx.graphics/javafx.scene.Scene.processMouseEvent(Unknown Source)
        at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(Unknown Source)
        at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
        at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
        at javafx.graphics/com.sun.glass.ui.View.notifyMouse(Unknown Source)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
        at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.base/java.lang.reflect.Method.invoke(Unknown Source)
        at com.sun.javafx.reflect.Trampoline.invoke(Unknown Source)
        at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.base/java.lang.reflect.Method.invoke(Unknown Source)
        at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(Unknown Source)
        at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(Unknown Source)
        ... 52 more
Caused by: java.lang.NoClassDefFoundError: javax/activation/DataHandler
        at sample.DashBoardController.registerUser(DashBoardController.java:321)
        ... 62 more
Caused by: java.lang.ClassNotFoundException: javax.activation.DataHandler
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
        at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
        ... 63 more

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я нашел решение благодаря вашей помощи Что я сделал, в структуре проекта я удалил все артефакты, модули и библиотеки и добавил все обратно, затем пересобрал проект, затем собрал артефакт, и я также установил папку проекта как Source Root, и это сработало.

0 голосов
/ 13 сентября 2018

Если вы используете внешние библиотеки, то проблема иногда возникает на пути к этим библиотекам. Когда вы извлекаете файл JAR, простое решение, которое иногда работает, заключается в создании нового проекта и создании новых файлов как старого проекта и перемещении их

...