kutombawewe.net

javax.mail.AuthenticationFailedException: collegamento non riuscito, nessuna password specificata?

Questo programma tenta di inviare e-mail ma genera un'eccezione di run time:

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

Perché ottengo questa eccezione quando ho fornito il nome utente e la password corretti per l'autenticazione?

Sia il mittente che il destinatario hanno account Gmail. Sia il mittente sia il destinatario hanno account Gmail. Il mittente ha disabilitato il processo di verifica in due passaggi. 

Questo è il codice:

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 = "[email protected]";
        String from = "[email protected]";
        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);
        }
    }
}

Anche dopo aver fornito la password ottengo l'eccezione. Perché non si sta autenticando?

11
Suhail Gupta

Prova a creare un oggetto javax.mail.Authenticator e invialo con l'oggetto properties all'oggetto Session. 

Authenticator Edit:

Puoi modificarlo per accettare un nome utente e una password e puoi salvarli lì o dove vuoi.

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

Nella tua classe in cui invii l'email:

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

È necessario aggiungere l'Autenticazione oggetto come parametro alla sessione. ad esempio 

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

ora non otterrai questo tipo di eccezione ....

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

La tua sessione di posta elettronica dovrebbe essere fornita un'istanza di autenticazione come di seguito 

Session session = Session.getDefaultInstance(props,
    new Authenticator() {
        protected PasswordAuthentication  getPasswordAuthentication() {
        return new PasswordAuthentication(
                    "[email protected]", "password");
                }
    });

un esempio completo è qui http://bharatonjava.wordpress.com/2012/08/27/sending-email-using-Java-mail-api/

3
Bharat Sharma

Oltre alla risposta di RMT. Ho anche dovuto modificare un po 'il codice. 

  1. Transport.send dovrebbe essere accessibile staticamente
  2. quindi, transport.connect non ha fatto nulla per me, ho solo bisogno di impostare le informazioni di connessione nell'oggetto Properties iniziale.

ecco i miei metodi send () di esempio. L'oggetto config è solo un contenitore di dati stupido.

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;
}
2
Kenny Cason

Ho risolto questo problema aggiungendo utente e password nella chiamata Transport.send:

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

Secondo questa firma della funzione send in javax.mail (from versione 1.5):

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

Inoltre, se si utilizza questa firma, non è necessario impostare alcun Authenticator e impostare user e password nel Properties (è necessario solo l'host). Quindi il tuo codice potrebbe essere:

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
T30

Potrebbe valere la pena verificare che l'account Gmail non è stato bloccato a causa di diversi tentativi di accesso non riusciti, potrebbe essere necessario reimpostare la password. Ho avuto lo stesso problema di te, e questa risultò essere la soluzione.

1
Andrew Calder

Ho anche questo problema quindi non preoccuparti. Viene dal lato server di posta a causa di un problema di autenticazione esterna. Apri la tua posta e riceverai una mail dal server di posta che ti dice di abilitare l'accessibilità. Al termine, riprova il programma.

1
user4083502

Anche quando si utilizza un Authenticator, ho dovuto impostare la proprietà mail.smtp.auth su true. Ecco un esempio funzionante:

final Properties props = new Properties();
props.put("mail.smtp.Host", config.getSmtpHost());
props.setProperty("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator()
{
  protected PasswordAuthentication getPasswordAuthentication()
  {
    return new PasswordAuthentication(config.getSmtpUser(), config.getSmtpPassword());
  }
});
0
alecswan

Questo errore potrebbe riguardare i caratteri della password. Se la tua password contiene caratteri speciali e aggiungi la tua password nei metodi di classe Transport;

Per esempio 

Transport transport = session.getTransport("smtp");
transport.connect("user","[email protected]");

o

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

potresti ricevere questo errore Poiché i metodi di classe Transport non possono gestire caratteri speciali. Se aggiungi il tuo nome utente e la password nel tuo messaggio usando la classe javax.mail.PasswordAuthentication, spero che tu eviterai quell'errore;

Per esempio

...
Session session = Session.getInstance(props, new javax.mail.Authenticator()
{
  protected PasswordAuthentication getPasswordAuthentication()
  {
    return new PasswordAuthentication("user", "[email protected]|d");
  }
});

Message message = new MimeMessage(session);
...
Transport.send(message);
0
oguzhan

Attiva "Accesso per app meno sicure" in Impostazioni di sicurezza per l'account Gmail. (Dalla posta), vedi il link sottostante per i riferimenti

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

0
Prabha
import Java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

@SuppressWarnings("serial")
public class RegisterAction {


    public String execute() {


         RegisterAction mailBean = new RegisterAction();

           String subject="Your username & password ";

           String message="Hi," + username;
          message+="\n \n Your username is " + email;
          message+="\n \n Your password is " + password;
          message+="\n \n Please login to the web site with your username and password.";
          message+="\n \n Thanks";
          message+="\n \n \n Regards";

           //Getting  FROM_MAIL

           String[] recipients = new String[1];
            recipients[0] = new String();
            recipients[0] = customer.getEmail();

           try{
          mailBean.sendMail(recipients,subject,message);

          return "success";
          }catch(Exception e){
           System.out.println("Error in sending mail:"+e);
          }

        return "failure";
    }

    public void sendMail( String recipients[ ], String subject, String message)
             throws MessagingException
              {
                boolean debug = false;

                 //Set the Host smtp address

                 Properties props = new Properties();
                 props.put("mail.smtp.Host", "smtp.gmail.com");
                 props.put("mail.smtp.starttls.enable", true);
                 props.put("mail.smtp.auth", true);

                // create some properties and get the default Session

                Session session = Session.getDefaultInstance(props, new Authenticator() {

                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(
                                "[email protected]", "5373273437543");// Specify the Username and the PassWord
                    }

                });
                session.setDebug(debug);


                // create a message
                Message msg = new MimeMessage(session);


                InternetAddress[] addressTo = new InternetAddress[recipients.length];
                for (int i = 0; i < recipients.length; i++)
                {
                  addressTo[i] = new InternetAddress(recipients[i]);
                }

                msg.setRecipients(Message.RecipientType.TO, addressTo);

                // Optional : You can also set your custom headers  in the Email if you Want
                //msg.addHeader("MyHeaderName", "myHeaderValue");

                // Setting the Subject and Content Type
                msg.setSubject(subject);
                msg.setContent(message, "text/plain");

                //send message
                Transport.send(msg);

                System.out.println("Message Sent Successfully");
              }

}
0
Vishal Nawale

Vedi la riga 9 del tuo codice, potrebbe essere un errore; dovrebbe essere:

mail.smtp.user 

non

mail.stmp.user;
0
bymysidel