Javax.mail.AuthenticationFailedException: не удалось подключиться, пароль не указан?
Эта программа пытается отправить электронную почту, но выбрасывает исключение времени выполнения:
javax.mail.AuthenticationFailedException: failed to connect, no password specified?
Почему я получаю это исключение, когда я предоставил правильное имя пользователя и пароль для аутентификации?
Как отправитель, так и получатель имеют учетные записи g-mail. Отправитель и получатель имеют почтовые учетные записи. Отправитель имеет двухэтапный процесс проверки.
Это код:
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);
}
}
}
Даже после предоставления пароля я получаю исключение. Почему это не аутентификация?
Ответы
Ответ 1
Попробуйте создать объект javax.mail.Authenticator и отправить его с объектом свойств объекту Session.
Authenticator
Редактирование:
Вы можете изменить это, чтобы принять имя пользователя и пароль, и вы можете сохранить их там или где захотите.
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));
Ответ 2
Вам необходимо добавить Аутентификацию объекта в качестве параметра для сеанса. таких как
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"[email protected]", "XXXXX");// Specify the Username and the PassWord
}
});
Теперь вы не получите такого рода исключение....
javax.mail.AuthenticationFailedException: failed to connect, no password specified?
Ответ 3
Ваш сеанс электронной почты должен быть предоставлен экземпляром аутентификатора, как показано ниже.
Session session = Session.getDefaultInstance(props,
new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"[email protected]", "password");
}
});
приведен полный пример http://bharatonjava.wordpress.com/2012/08/27/sending-email-using-java-mail-api/
Ответ 4
В дополнение к ответу RMT. Мне также пришлось немного изменить код.
- Transport.send следует получить доступ статически
- поэтому 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;
}
Ответ 5
Я решил эту проблему добавить пользователя и пароль в вызов 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! :)
}
}
Ответ 6
Возможно, стоит проверить, что учетная запись gmail не была заблокирована из-за нескольких неудачных попыток входа в систему, вам может понадобиться reset ваш пароль. У меня была та же проблема, что и вы, и это оказалось решением.
Ответ 7
У меня также есть эта проблема, поэтому не беспокойтесь. Он исходит из почтового сервера из-за внешней проверки подлинности. Откройте свою почту, и вы получите почту с почтового сервера, сообщающую вам о доступности. Когда вы это сделаете, повторите попытку.
Ответ 8
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");
}
}
Ответ 9
Даже при использовании Authenticator мне пришлось установить свойство mail.smtp.auth в значение true. Вот рабочий пример:
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());
}
});
Ответ 10
Включите "Доступ для менее безопасных приложений" в настройках безопасности для учетной записи gmail. (из почты), см. ссылку ниже для ссылок
http://www.ghacks.net/2014/07/21/gmail-starts-block-less-secure-apps-enable-access/
Ответ 11
Эта ошибка может быть связана с символами пароля. Если ваш пароль содержит специальные символы, а также вы добавляете свой пароль в методы класса Transport
;
Пример
Transport transport = session.getTransport("smtp");
transport.connect("user","[email protected]");
или
Transport.send(msg, "user", "passw%rd");
вы можете получить эту ошибку. Поскольку методы Transport
class не могут обрабатывать специальные символы. Если вы добавите свое имя пользователя и пароль в свое сообщение с помощью класса javax.mail.PasswordAuthentication
, я надеюсь, что вы избежите этой ошибки;
Пример
...
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);
Ответ 12
Я только что столкнулся с этой проблемой, и решение заключается в том, что свойство "mail.smtp.user" должно быть вашим адресом электронной почты (а не именем пользователя).
Пример для пользователя gmail:
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.host", host);
properties.put("mail.smtp.user", from);
properties.put("mail.smtp.password", pass);
properties.put("mail.smtp.port", "587");
properties.put("mail.smtp.auth", "true");