Swing电子邮件客户端抛出javax.mail.AuthenticationFailedException [英] Swing e-mail client throws javax.mail.AuthenticationFailedException

查看:136
本文介绍了Swing电子邮件客户端抛出javax.mail.AuthenticationFailedException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在NetBeans中发送电子邮件客户端来发送电子邮件,但是我在代码中收到一个 AuthenticationFailedException 。这是我的代码(有三个类):

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                   

    }

异常堆栈跟踪

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)

我正在尝试发送电子邮件与 SendMail 类,而发件人的电子邮件和密码从设置 EmailClient 仅用于设置 JFrames 可见性 true false 在按钮上点击。

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

我认为问题在于 SendMail Authenticator 的变量课程,但我不知道这是什么问题。

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

推荐答案



SendMail.java ....中的Authenticator的变量我不知道什么问题实际上是...

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

您的问题在此:

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

这不会转换由 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());

还要注意使用 Session.getDefaultInstance()方法是不鼓励的。因此,建议使用 Session.getInstance()方法:

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


Session.getDefaultInstance 方法创建一个新的会话第一个
调用的时间,使用属性后续
调用将返回原始会话,并忽略任何属性
pass in。
如果要使用不同的
属性创建不同的会话, Session.getDefaultInstance 将不会这样做。 [...]始终使用
Session.getInstance 以避免此问题。

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.

JavaMail API常见问题解答。您还可以看到使用这个Q& A Session.getDefaultInstance()的后果> java中的hotmail登录错误(IDE:Netbeans)

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)

也不鼓励使用多个JFrame。请参阅此主题:使用多个JFrames,好/坏实践?

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

这篇关于Swing电子邮件客户端抛出javax.mail.AuthenticationFailedException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆