如何解决javax.mail.AuthenticationFailedException问题?
我正在用如何解决javax.mail.AuthenticationFailedException问题?,java,jakarta-mail,smtp-auth,Java,Jakarta Mail,Smtp Auth,我正在用JavaMail做一个sendMailServlet。我的输出中有javax.mail.AuthenticationFailedException。谁能帮帮我吗?谢谢 sendMailServlet代码: try { String host = "smtp.gmail.com"; String from = "my@gmail.com"; String pass = "pass"; Properties props = Sy
JavaMail
做一个sendMail
Servlet
。我的输出中有javax.mail.AuthenticationFailedException
。谁能帮帮我吗?谢谢
sendMailServlet代码:
try {
String host = "smtp.gmail.com";
String from = "my@gmail.com";
String pass = "pass";
Properties props = System.getProperties();
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", from);
props.put("mail.smtp.password", pass);
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.debug", "true");
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
Address fromAddress = new InternetAddress(from);
Address toAddress = new InternetAddress("test1@gmail.com");
message.setFrom(fromAddress);
message.setRecipient(Message.RecipientType.TO, toAddress);
message.setSubject("Testing JavaMail");
message.setText("Welcome to JavaMail");
Transport transport = session.getTransport("smtp");
transport.connect(host, from, pass);
message.saveChanges();
Transport.send(message);
transport.close();
}catch(Exception ex){
out.println("<html><head></head><body>");
out.println("ERROR: " + ex);
out.println("</body></html>");
}
您需要实现一个自定义的 现在把它用在
另请检查下一行中的我缺少此验证器对象参数
Session session = Session.getInstance(props, new GMailAuthenticator(username, password));
这一行解决了我的问题,现在我可以通过Java应用程序发送邮件了。
其余的代码与上面一样简单。问题是,您正在创建一个
传输
对象,并使用它的连接方法进行身份验证。
但是,然后使用静态
方法发送消息,该方法忽略了对象所做的身份验证
因此,您应该对对象使用sendMessage(message,message.getAllRecipients())
方法,或者按照其他人的建议使用验证器来获得授权
通过会议
以下是您需要阅读的内容。只想与您分享:
在更改数字海洋机器(IP地址)后,我碰巧遇到了这个错误。显然,Gmail认为这是一次黑客攻击。按照他们的指示,并批准新的IP地址后,代码将返回并运行。此错误来自谷歌安全。。。 这可以通过启用不太安全的功能来解决
转到此链接:“打开”,然后确保应用程序运行。当您试图从新设备或应用程序登录到您的Google帐户时,必须解锁验证码。 要解锁验证码,请转到 然后 还要确保
什么时候会发生异常?我看不到你脸上的表情logs@n002213f:当我通过jndi调用(jboss)从mailservice.xml获取会话时,如何使用此gmail身份验证程序。@Ashwin-看看类似问题的答案@n002213f:你给出了一个出色的解决方案,现在我正在实现此功能,只需将smtp gmail服务器替换为我自己的smtp服务器名称,但是获取java.lang.NoClassDefFoundError:javax/mail/Authenticator error(因为我在jsp/servlet的帮助下实现它)…任何输入..很好的答案,但我更喜欢第二个(Uma的答案)。我的验证器工作正常,但谷歌的标准(幸运的)太严格了。尽管如此,+1。我面临着完全相同的问题,尝试了这个和第二个答案。两者都不适用于我,我使用tomcat作为web容器。哦,tq:)。我为此奋斗了这么长时间。这不应该发生在任何人身上。所以,我说得很清楚,Phil CIt对我来说是可行的,但如何让它在不允许不太安全的应用程序使用IMAP的情况下工作呢?
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
class GMailAuthenticator extends Authenticator {
String user;
String pw;
public GMailAuthenticator (String username, String password)
{
super();
this.user = username;
this.pw = password;
}
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(user, pw);
}
}
Session session = Session.getInstance(props, new GMailAuthenticator(username, password));
Session session = Session.getInstance(props, new GMailAuthenticator(username, password));