Swing电子邮件客户端抛出javax.mail.AuthenticationFailedException [英] Swing e-mail client throws 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 newSession
the first time it's called, using theProperties
that are passed. Subsequent calls will return that originalSession
and ignore anyProperties
you pass in. If you want to create different Sessions with different properties,Session.getDefaultInstance
won't do that. [...] Always useSession.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屋!