javax.mail.AuthenticationFailedException: не удалось подключиться, пароль не указан? - PullRequest
11 голосов
/ 07 июля 2011

Эта программа пытается отправить электронное письмо, но выдает исключение времени выполнения:

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

Почему я получаю это исключение, когда я указал правильное имя пользователя и пароль для аутентификации?

У отправителя и получателя есть учетные записи электронной почты.Отправитель и получатель имеют учетные записи электронной почты.У отправителя отключен двухэтапный процесс проверки.

Это код:

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);
        }
    }
}

Даже после ввода пароля я получаю исключение.Почему это не аутентификация?

Ответы [ 13 ]

10 голосов
/ 25 мая 2012

Вам необходимо добавить Аутентификацию объекта в качестве параметра для сеанса.такие как

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?
9 голосов
/ 07 июля 2011

Попробуйте создать объект javax.mail.Authenticator и отправить его вместе с объектом свойств в объект Session.

Authenticator edit:

Вы можете изменить это, чтобы принять имя пользователя и пароль, и вы можете хранить их там или где угодно.

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));
3 голосов
/ 16 сентября 2012

Для сеанса электронной почты должен быть предоставлен экземпляр аутентификатора, как показано ниже

Session session = Session.getDefaultInstance(props,
    new Authenticator() {
        protected PasswordAuthentication  getPasswordAuthentication() {
        return new PasswordAuthentication(
                    "myemail@gmail.com", "password");
                }
    });

полный пример здесь http://bharatonjava.wordpress.com/2012/08/27/sending-email-using-java-mail-api/

2 голосов
/ 14 января 2015

Я решил эту проблему добавление пользователя и пароля в Transport.send вызов:

Transport.send(msg, "user", "password");

Согласно этой подписи send функции в javax.mail ( из версия 1.5 ):

public static void send(Message msg, String user, String password)

Кроме того, если вы используете эту подпись, нет необходимости устанавливать Authenticator и устанавливать пользователя и пароль в Properties (нужен только хост). Таким образом, ваш код может быть:

private void sendMail(){
  try{
      Properties prop = System.getProperties();
      prop.put("mail.smtp.host", "yourHost");
      Session session = Session.getInstance(prop);
      Message msg = #createYourMsg(session, from, to, subject, mailer, yatta yatta...)#;
      Transport.send(msg, "user", "password");
  }catch(Exception exc) {
      // Deal with it! :)
  }
}
2 голосов
/ 15 мая 2012

В дополнение к ответу RMT. Мне также пришлось немного изменить код.

  1. Transport.send должен быть доступен статически
  2. для этого transport.connect ничего не сделал для меня, мне нужно было только установить информацию о соединении в исходном объекте Properties.

вот мои примеры методов send (). Объект config - это просто тупой контейнер данных.

public boolean send(String to, String from, String subject, String text) {
    return send(new String[] {to}, from, subject, text);
}

public boolean send(String[] to, String from, String subject, String text) {

    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.host", config.host);
    props.put("mail.smtp.user", config.username);
    props.put("mail.smtp.port", config.port);
    props.put("mail.smtp.password", config.password);

    Session session = Session.getInstance(props, new SmtpAuthenticator(config));

    try {
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        InternetAddress[] addressTo = new InternetAddress[to.length];
        for (int i = 0; i < to.length; i++) {
            addressTo[i] = new InternetAddress(to[i]);
        }
        message.setRecipients(Message.RecipientType.TO, addressTo);
        message.setSubject(subject);
        message.setText(text);
        Transport.send(message);
    } catch (MessagingException e) {
        e.printStackTrace();
        return false;
    }
    return true;
}
1 голос
/ 26 сентября 2014

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

1 голос
/ 12 апреля 2012

Возможно, стоит проверить, что учетная запись gmail не была заблокирована из-за нескольких неудачных попыток входа в систему, возможно, вам придется сбросить пароль.У меня была такая же проблема, как и у вас, и это оказалось решением.

0 голосов
/ 23 октября 2018

См. 9 строку вашего кода, это может быть ошибка; должно быть:

mail.smtp.user 

не

mail.stmp.user;
0 голосов
/ 20 апреля 2016

Эта ошибка может быть связана с символами пароля. Если ваш пароль содержит специальные символы, а также вы добавляете свой пароль в Transport методы класса;

Например

Transport transport = session.getTransport("smtp");
transport.connect("user","passw@rd");

или

Transport.send(msg, "user", "passw%rd");

Вы можете получить эту ошибку. Потому что Transport методы класса не могут обрабатывать специальные символы. Если вы добавите свое имя пользователя и пароль в свое сообщение, используя класс javax.mail.PasswordAuthentication, я надеюсь, вы избежите этой ошибки;

Например

...
Session session = Session.getInstance(props, new javax.mail.Authenticator()
{
  protected PasswordAuthentication getPasswordAuthentication()
  {
    return new PasswordAuthentication("user", "pas$w@r|d");
  }
});

Message message = new MimeMessage(session);
...
Transport.send(message);
0 голосов
/ 24 февраля 2016

Включите «Доступ к менее защищенным приложениям» в настройках безопасности для учетной записи gmail (из почты), ссылки приведены ниже:

http://www.ghacks.net/2014/07/21/gmail-starts-block-less-secure-apps-enable-access/

...