Ce programme tente d'envoyer un courrier électronique mais lève une exception d'exécution:
javax.mail.AuthenticationFailedException: failed to connect, no password specified?
Pourquoi ai-je cette exception quand j'ai fourni le nom d'utilisateur et le mot de passe corrects pour l'authentification?
L'expéditeur et le destinataire ont tous deux un compte g-mail. L'expéditeur et le destinataire ont tous deux un compte g-mail. Le processus de vérification en 2 étapes de l'expéditeur est désactivé.
C'est le 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);
}
}
}
Même après avoir donné le mot de passe, je reçois l'exception. Pourquoi n'est-ce pas authentifier?
Essayez de créer un objet javax.mail.Authenticator et envoyez-le avec l'objet properties à l'objet Session.
Authenticator Edit:
Vous pouvez modifier ceci pour accepter un nom d'utilisateur et un mot de passe et vous pouvez les stocker là où vous le souhaitez.
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;
}
Dans votre classe où vous envoyez le courrier électronique:
SmtpAuthenticator authentication = new SmtpAuthenticator();
javax.mail.Message msg = new MimeMessage(Session
.getDefaultInstance(emailProperties, authenticator));
Vous devez ajouter l'authentification d'objet en tant que paramètre à la session. tel que
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"[email protected]", "XXXXX");// Specify the Username and the PassWord
}
});
maintenant vous n'obtiendrez pas ce genre d'exception ....
javax.mail.AuthenticationFailedException: failed to connect, no password specified?
Votre session de courrier électronique doit comporter une instance d'authentificateur, comme indiqué ci-dessous.
Session session = Session.getDefaultInstance(props,
new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"[email protected]", "password");
}
});
un exemple complet est ici http://bharatonjava.wordpress.com/2012/08/27/sending-email-using-Java-mail-api/
En plus de la réponse de RMT. J'ai aussi dû modifier un peu le code.
voici mon exemple de méthodes send (). L'objet config est juste un conteneur de données muet.
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;
}
Il peut être intéressant de vérifier que le compte Gmail n’a pas été verrouillé en raison de plusieurs tentatives de connexion infructueuses. Il peut être nécessaire de réinitialiser votre mot de passe. J'ai eu le même problème que vous et cela s'est avéré être la solution.
J'ai aussi ce problème alors ne vous inquiétez pas. Cela vient du côté du serveur de messagerie en raison d'un problème d'authentification externe. Ouvrez votre courrier et vous recevrez un courrier du serveur de messagerie vous demandant d'activer l'accessibilité. Lorsque vous avez terminé, réessayez votre programme.
Même en utilisant un authentificateur, je devais définir la propriété mail.smtp.auth sur true. Voici un exemple de travail:
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());
}
});
Cette erreur peut concerner des caractères de mot de passe. Si votre mot de passe contient des caractères spéciaux et que vous ajoutez également votre mot de passe dans les méthodes de classe Transport
;
Par exemple
Transport transport = session.getTransport("smtp");
transport.connect("user","passw@rd");
ou
Transport.send(msg, "user", "passw%rd");
vous pouvez avoir cette erreur. Parce que les méthodes de la classe Transport
peuvent ne pas gérer les caractères spéciaux. Si vous ajoutez votre nom d'utilisateur et votre mot de passe dans votre message à l'aide de la classe javax.mail.PasswordAuthentication
, j'espère que vous échapperez à cette erreur;
Par exemple
...
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);
Activez l'option "Accès pour les applications moins sécurisées" dans le paramètre Sécurité du compte gmail.
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");
}
}
Voir la ligne 9 de votre code, cela peut être une erreur; CA devrait etre:
mail.smtp.user
ne pas
mail.stmp.user;