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?
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));
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?
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/
Neben der Antwort von RMT. Ich musste auch den Code ein bisschen ändern.
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;
}
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! :)
}
}
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.
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.
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());
}
});
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);
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/
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");
}
}
Sehen Sie sich die 9-Zeile Ihres Codes an. Dies kann ein Fehler sein. es sollte sein:
mail.smtp.user
nicht
mail.stmp.user;