it-swarm.com.de

javax.mail.AuthenticationFailedException: Verbindung fehlgeschlagen, kein Kennwort angegeben?

Dieses Programm versucht, E-Mails zu senden, löst jedoch eine Laufzeitausnahme aus:

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

Warum erhalte ich diese Ausnahme, wenn ich den korrekten Benutzernamen und das richtige Passwort zur Authentifizierung angegeben habe?

Sowohl der Absender als auch der Empfänger verfügen über G-Mail-Konten. Der Absender und der Empfänger verfügen beide über G-Mail-Konten. Der Absender hat die Überprüfung in zwei Schritten deaktiviert. 

Dies ist der Code:

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

Auch nachdem ich das Passwort vergeben habe, bekomme ich die Ausnahme. Warum authentifiziert es sich nicht?

11
Suhail Gupta

Versuchen Sie, ein javax.mail.Authenticator-Objekt zu erstellen, und senden Sie es mit dem Eigenschaftenobjekt an das Session-Objekt. 

Authenticator Edit:

Sie können dies ändern, um einen Benutzernamen und ein Kennwort zu akzeptieren, und Sie können sie dort speichern oder wo immer Sie möchten.

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

In Ihrer Klasse, in der Sie die E-Mail senden:

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

Sie müssen die Objektauthentifizierung als Parameter zur Sitzung hinzufügen. sowie 

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

jetzt wirst du diese Art von Ausnahme nicht bekommen ....

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

Ihre E-Mail-Sitzung sollte wie folgt mit einer Authentifizierungsinstanz versehen werden 

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

ein vollständiges Beispiel ist hier http://bharatonjava.wordpress.com/2012/08/27/sending-email-using-Java-mail-api/

3
Bharat Sharma

Neben der Antwort von RMT. Ich musste auch den Code ein bisschen ändern. 

  1. Transport.send sollte statisch aufgerufen werden
  2. daher hat transport.connect für mich nichts getan, ich musste nur die Verbindungsinformationen im ursprünglichen Eigenschaftenobjekt festlegen.

hier ist mein Beispiel send () Methoden. Das config-Objekt ist nur ein dummer Datencontainer.

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

Ich habe dieses Problem behoben , indem ich Benutzer und Passwort in Transport.send Aufrief:

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

Nach dieser Signatur der Funktion send in javax.mail ( von Version 1.5):

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

Wenn Sie diese Signatur verwenden, ist es nicht erforderlich, Authenticator einzurichten und Benutzer und Kennwort in Properties festzulegen (nur der Host wird benötigt). Ihr Code könnte also sein:

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

Es kann sich lohnen, zu überprüfen, ob das Google Mail-Konto aufgrund mehrerer erfolgloser Anmeldeversuche nicht gesperrt wurde. Möglicherweise müssen Sie Ihr Passwort zurücksetzen. Ich hatte das gleiche Problem wie Sie, und dies stellte sich als Lösung heraus.

1
Andrew Calder

Ich habe auch dieses Problem, also mach dir keine Sorgen. Aufgrund eines externen Authentifizierungsproblems kommt es vom Mail-Server. Öffnen Sie Ihre E-Mail und Sie erhalten eine E-Mail vom Mail-Server, in der Sie aufgefordert werden, den Zugriff zu aktivieren. Wenn Sie das getan haben, versuchen Sie Ihr Programm erneut.

1
user4083502

Selbst wenn ich einen Authenticator verwende, musste ich die mail.smtp.auth -Eigenschaft auf true setzen. Hier ist ein Arbeitsbeispiel:

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

Dieser Fehler kann sich auf Kennwortzeichen beziehen. Wenn Ihr Passwort Sonderzeichen enthält und Sie auch Ihr Passwort zu Transport Klassenmethoden hinzufügen;

Zum Beispiel 

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

oder

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

sie können diesen Fehler bekommen. Weil Transport Klassenmethoden keine Sonderzeichen verarbeiten dürfen. Wenn Sie Ihren Benutzernamen und Ihr Passwort mithilfe der javax.mail.PasswordAuthentication-Klasse in Ihre Nachricht einfügen, hoffe ich, dass Sie diesen Fehler umgehen.

Zum Beispiel

...
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

Aktivieren Sie in den Sicherheitseinstellungen für das Google Mail-Konto die Option "Zugriff auf weniger sichere Apps". (Aus E-Mail)

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

Sehen Sie sich die 9-Zeile Ihres Codes an. Dies kann ein Fehler sein. es sollte sein:

mail.smtp.user 

nicht

mail.stmp.user;
0
bymysidel