javax.mail.AuthenticationFailedException: 無法連接,未指定口令?

2022-09-02 09:13:33

此程序尝试发送电子邮件,但引发运行时异常:

javax.mail.AuthenticationFailedException: failed to connect, no password specified?

为什么当我提供了正确的用户名和密码进行身份验证时,我会收到此异常?

发件人和收件人都有 g-mail 帐户。发件人和收件人都有 g-mail 帐户。发件人禁用了两步验证过程。

这是代码:

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

class tester {
    public static void main(String args[]) {
        Properties props = new Properties();
        props.put("mail.smtp.host" , "smtp.gmail.com");
        props.put("mail.stmp.user" , "username");

        //To use TLS
        props.put("mail.smtp.auth", "true"); 
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.password", "password");
        //To use SSL
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", 
            "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");


        Session session  = Session.getDefaultInstance( props , null);
        String to = "me@gmail.com";
        String from = "from@gmail.com";
        String subject = "Testing...";
        Message msg = new MimeMessage(session);
        try {
            msg.setFrom(new InternetAddress(from));
            msg.setRecipient(Message.RecipientType.TO, 
                new InternetAddress(to));
            msg.setSubject(subject);
            msg.setText("Working fine..!");
            Transport transport = session.getTransport("smtp");
            transport.connect("smtp.gmail.com" , 465 , "username", "password");
            transport.send(msg);
            System.out.println("fine!!");
        }
        catch(Exception exc) {
            System.out.println(exc);
        }
    }
}

即使在提供密码后,我也会遇到异常。为什么不进行身份验证?


答案 1

尝试创建一个 javax.mail.Authenticator 对象,并将其与属性对象一起发送到 Session 对象。

身份验证器编辑:

您可以修改它以接受用户名和密码,并且可以将它们存储在那里,也可以存储在您想要的任何位置。

public class SmtpAuthenticator extends Authenticator {
public SmtpAuthenticator() {

    super();
}

@Override
public PasswordAuthentication getPasswordAuthentication() {
 String username = "user";
 String password = "password";
    if ((username != null) && (username.length() > 0) && (password != null) 
      && (password.length   () > 0)) {

        return new PasswordAuthentication(username, password);
    }

    return null;
}

在您发送电子邮件的课程中:

SmtpAuthenticator authentication = new SmtpAuthenticator();
javax.mail.Message msg = new MimeMessage(Session
                    .getDefaultInstance(emailProperties, authenticator));

答案 2

您需要将对象身份验证作为参数添加到会话中。如

Session session = Session.getDefaultInstance(props, 
    new javax.mail.Authenticator(){
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(
                "XXXX@gmail.com", "XXXXX");// Specify the Username and the PassWord
        }
});

现在你不会得到这种例外....

javax.mail.AuthenticationFailedException: failed to connect, no password specified?

推荐