Swing e-mail client throws javax.mail.AuthenticationFailedException

醉酒当歌 提交于 2019-12-13 02:36:02

问题


I am trying to make an email client in NetBeans to send emails, but I am getting an AuthenticationFailedException in my code. This is my code (there are three classes):

EmailClient.java

package sendemail;

    public class EmailClient extends javax.swing.JFrame {

        SendMail sm=new SendMail();
        Settings set=new Settings();
        public EmailClient() {
            initComponents();
        }


        @SuppressWarnings("unchecked")
        +Generated code                     

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
           // TODO add your handling code here:
            sm.setVisible(true);
        }                                        

        private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            // TODO add your handling code here:
        }                                        

        private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            // TODO add your handling code here:
        }                                        

        private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {                                           
            // TODO add your handling code here:
            set.setVisible(true);
        }                                          

        public static void main(String args[]) {
            /* Create and display the form */
            java.awt.EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new EmailClient().setVisible(true);
                }
            });
        }

        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        private javax.swing.JButton jButton2;
        private javax.swing.JButton jButton3;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JLabel jLabel3;
        private javax.swing.JLabel jLabel4;
        private javax.swing.JLabel jLabel5;
        private javax.swing.JLabel jLabel6;
        private javax.swing.JMenu jMenu4;
        private javax.swing.JMenu jMenu5;
        private javax.swing.JMenuBar jMenuBar2;
        private javax.swing.JMenuItem jMenuItem2;
        private javax.swing.JPanel jPanel1;
        private javax.swing.JPanel jPanel3;
        private javax.swing.JPanel jPanel4;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTextArea jTextArea1;
        // End of variables declaration                   
    }

Settings.java

package sendemail;
    import javax.swing.*;
    import java.awt.*;

    public class Settings extends javax.swing.JFrame {

        public String uname;
        public String pass;
        public String smtpserver;
        public String  port;
        /**
         * Creates new form Settings
         */
        public Settings() {
            initComponents();
        }

        public String getUname() {
            return uname;
        }

        public String getPass() {
            return pass;
        }

        public String getSmtpserver() {
            return smtpserver;
        }

        public String getPort() {
            return port;
        }



        @SuppressWarnings("unchecked")
        +Generated Code                   

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            // TODO add your handling code here:
           uname=jTextField1.getText().toString();
            pass=jPasswordField1.getPassword().toString();

            smtpserver=jComboBox1.getSelectedItem().toString();
            port=jComboBox2.getSelectedItem().toString();

            if(uname.equals("") || pass.equals("") || smtpserver.equals("") || port.equals("") )
        {
                JOptionPane.showMessageDialog(this,"All Fields are mandatory");
        }                                        
        else
            {
                setVisible(false);
            }

        }                                        

        private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
            // TODO add your handling code here:
        }                                          

        public static void main(String args[]) {
            /* Create and display the form */
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Settings().setVisible(false);
                }
            });
        }

        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        private javax.swing.JComboBox jComboBox1;
        private javax.swing.JComboBox jComboBox2;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JLabel jLabel3;
        private javax.swing.JLabel jLabel4;
        private javax.swing.JPanel jPanel1;
        private javax.swing.JPasswordField jPasswordField1;
        private javax.swing.JTextField jTextField1;
        // End of variables declaration                   

    }

SendMail.Java

package sendemail;

    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;
    import javax.swing.JOptionPane;
    import java.awt.*;
    import javax.mail.*;
    import javax.mail.MessagingException;


    public class SendMail extends javax.swing.JFrame {

        Settings setfrm=new Settings();
        String subject;
        String from;

        public SendMail() {
            initComponents();
        }


        @SuppressWarnings("unchecked")
        +Generated Code                    

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            // TODO add your handling code here:
            try
            {
            final String user=setfrm.getUname();
            final String password=setfrm.getPass();
            String portnum=setfrm.getPort();
            String smtpname=setfrm.getSmtpserver();
            String to=jTextField1.getText();
            subject=jTextField2.getText();
            Properties properties=new Properties();
            properties.put("mail.smtp.host",smtpname.toString());
            properties.put("mail.smtp.socketFactory.port",portnum.toString());
            properties.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
            properties.put("mail.smtp.port",portnum.toString());
            properties.put("mail.smtp.auth","true");
            Session session=Session.getDefaultInstance(properties,
               new javax.mail.Authenticator() {
                   protected PasswordAuthentication getPasswordAuthentication(){
                    return new PasswordAuthentication(user,password);

               }

               }

               );
            MimeMessage message=new MimeMessage(session);
            message.setFrom(new InternetAddress(user));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(jTextField1.getText().toString()));
            message.setSubject(subject);
            message.setText(jTextArea1.getText());
            Transport.send(message);
            JOptionPane.showMessageDialog(null,"message sent");
            }
            catch(MessagingException mex)
            {
                JOptionPane.showMessageDialog(null,mex);
            }
        }                                        

        private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            // TODO add your handling code here:
        }                                        

        private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {                                            
            // TODO add your handling code here:
        }                                           

        public static void main(String args[]) {
            /* Create and display the form */
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new SendMail().setVisible(true);
                }
            });
        }

        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        private javax.swing.JButton jButton2;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JPanel jPanel1;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTextArea jTextArea1;
        private javax.swing.JTextField jTextField1;
        private javax.swing.JTextField jTextField2;
        // End of variables declaration                   

    }

Exception stack trace

javax.mail.AuthenticationFailedException
    at javax.mail.Service.connect(Service.java:306)
    at javax.mail.Service.connect(Service.java:156)
    at javax.mail.Service.connect(Service.java:105)
    at com.sun.mail.smtp.SMTPTransport.connect(SMTPTransport.java:93)
    at javax.mail.Transport.send0(Transport.java:168)
    at javax.mail.Transport.send(Transport.java:98)
    at sendemail.SendMail.jButton1ActionPerformed(SendMail.java:189)
    at sendemail.SendMail.access$100(SendMail.java:25)
    at sendemail.SendMail$2.actionPerformed(SendMail.java:77)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3311)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
BUILD SUCCESSFUL (total time: 2 minutes 46 seconds)

I am trying to send e-mail with SendMail class while the sender's email and password is entered from Settings and the EmailClient is just for setting JFrames visibility to true or false on buttons click.

SMTP server:smtp.gmail.com
port:465

I think the problem lies in the variables of Authenticator in SendMail class, but I am not sure what the problem actually is.


回答1:


I think the problem lies in the variables of Authenticator in SendMail.java....bu i don't know what the problem actually is......

Your problem is here:

pass = jPasswordField1.getPassword().toString();

This won't convert the char array retrieved by getPassword() method in the way you want to because it's calling toString() method on an array. You should replace that line by this one:

pass = String.valueOf(jPasswordField1.getPassword());

Also be aware that using Session.getDefaultInstance() method is discouraged. It's highly recommended use Session.getInstance() method instead because of this:

The Session.getDefaultInstance method creates a new Session the first time it's called, using the Properties that are passed. Subsequent calls will return that original Session and ignore any Properties you pass in. If you want to create different Sessions with different properties, Session.getDefaultInstance won't do that. [...] Always use Session.getInstance to avoid this problem.

It is well explained in JavaMail API FAQ. You can also see the consequences of using Session.getDefaultInstance() exemplified in this Q&A hotmail login error in java (IDE: Netbeans)


Off-topic

The use of multiple JFrame's is also discouraged. See this topic: The Use of Multiple JFrames, Good/Bad Practice?



来源:https://stackoverflow.com/questions/22508308/swing-e-mail-client-throws-javax-mail-authenticationfailedexception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!