我不熟悉这个用java发送邮件的功能。发送电子邮件重置密码时收到错误。希望你能给我一个解决方案。
以下是我的代码:
public synchronized static boolean sendMailAdvance(String emailTo, String subject, String body)
{
String host = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-ADDRESS");
String userName = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-USERNAME");
String password = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-PASSWORD");
String port = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-PORT");
String starttls = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-STARTTLS");
String socketFactoryClass = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-SOCKET-CLASS");
String fallback = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-ALLOW-FALLBACK");
try
{
java.util.Properties props = null;
props = System.getProperties();
props.put("mail.smtp.user", userName);
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.debug", "true");
if(!"".equals(port))
{
props.put("mail.smtp.port", port);
props.put("mail.smtp.socketFactory.port", port);
}
if(!"".equals(starttls))
props.put("mail.smtp.starttls.enable",starttls);
if(!"".equals(socketFactoryClass))
props.put("mail.smtp.socketFactory.class",socketFactoryClass);
if(!"".equals(fallback))
props.put("mail.smtp.socketFactory.fallback", fallback);
Session session = Session.getDefaultInstance(props, null);
session.setDebug(true);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(userName));
msg.setSubject(subject);
msg.setText(body, "ISO-8859-1");
msg.setSentDate(new Date());
msg.setHeader("content-Type", "text/html;charset=\"ISO-8859-1\"");
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo));
msg.saveChanges();
Transport transport = session.getTransport("smtp");
transport.connect(host, userName, password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
return true;
}
catch (Exception mex)
{
mex.printStackTrace();
return false;
}
}
引发以下错误:
DEBUG:setDebug:JavaMail版本1.4.1ea-SNAPSHOT
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP:useEhlo true,useAuth true
DEBUG SMTP:尝试连接主机“smtp.gmail.com”,端口465,isSSL false 220 mx.google.com ESMTP m4sm5929870pbg.38 - gsmtp
DEBUG SMTP:连接到主机“smtp.gmail.com”,端口:465
EHLO fatin
250-mx.google.com为您服务,[175.139.198.14]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN
250 ENHANCEDSTATUSCODES
250 CHUNKING
DEBUG SMTP:找到扩展名“SIZE”,arg“35882577”
DEBUG SMTP:找到扩展名“8BITMIME”,arg“”
DEBUG SMTP:找到扩展名“AUTH”,arg“登录PLOA XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN”
DEBUG SMTP:找到扩展名“ENHANCEDSTATUSCODES”,arg“”
DEBUG SMTP:找到扩展名“CHUNKING”,arg“”
DEBUG SMTP:尝试进行身份验证
AUTH LOGIN
334 VXNlcm5hbWU6
YWNjb3VudEBibG9vbWluZy5jb20ubXk =
334 UGFzc3dvcmQ6
Ymxvb21pbmc = 535-5.7.8不接受用户名和密码。了解更多信息 535 5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257
m4sm5929870pbg.38 - gsmtp
[STDOUT] javax.mail.AuthenticationFailedException
[STDOUT]在javax.mail.Service.connect(Service.java:319)
[STDOUT]在javax.mail.Service.connect(Service.java:169)
[STDOUT] at com.vlee.util.mail.SendMail.sendMailAdvance(SendMail.java:283)
[STDOUT] at com.vlee.servlet.ecommerce.DoMemberLogin.fnSendPwd(DoMemberLogin.java:251)
[STDOUT] at com.vlee.servlet.ecommerce.DoMemberLogin.doPost(DoMemberLogin.java:72)
答案 0 :(得分:76)
可能是由Gmail帐户保护导致此问题。只需点击下面的链接并禁用安全设置即可。 https://www.google.com/settings/security/lesssecureapps
答案 1 :(得分:12)
您应该将端口更改为587
,我测试了您的代码并且工作正常
如果仍然发生错误,请将会话变量更改为以下代码:
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
答案 2 :(得分:8)
默认情况下,Gmail帐户具有高度安全性。当我们从非gmail工具使用gmail smtp时,电子邮件被阻止。要在我们的本地环境中进行测试,请将您的Gmail帐户设置为
答案 3 :(得分:4)
更改此设置(设置不太安全的应用): https://www.google.com/settings/security/lesssecureapps
答案 4 :(得分:4)
如果您是从新的应用程序或设备登录您的Gmail帐户,Google可能会阻止该设备。请尝试以下步骤:
为了保护您的帐户,如果我们怀疑您不是您,Google可能会更难登录您的帐户。例如,如果您正在旅行或尝试从新设备登录帐户,Google可能会要求您提供除用户名和密码之外的其他信息。
从您之前用于访问Google帐户的其他设备转到https://g.co/allowaccess,然后按照说明操作。 尝试从被阻止的应用再次登录。
答案 5 :(得分:2)
我长期以来一直在犯同样的错误。
当我将会话调试更改为true
时Session session = Session.getDefaultInstance(props, new GMailAuthenticator("xxxxx@gmail.com", "xxxxx"));
session.setDebug(true);
我从控制台获得了帮助URL https://support.google.com/mail/answer/78754以及javax.mail.AuthenticationFailedException。
通过链接中的步骤,我按照每个步骤进行操作。当我用混合的字母,数字和符号更改密码时,我感到惊讶的是,生成的电子邮件没有验证异常。
注意:我的旧密码更不安全。
答案 6 :(得分:1)
2个可能的原因:
答案 7 :(得分:1)
您需要记住一些步骤。
现在有两种情况 如果您是在本地计算机上开发它的,请在浏览器中登录到您的Google帐户,这样Google就会识别该计算机。
如果您已将应用程序部署到服务器上,则在第一个请求之后,您将收到身份验证错误,因此您必须授予对服务器的访问权限,只需转到此处进行访问即可-https://www.google.com/accounts/DisplayUnlockCaptcha
答案 8 :(得分:0)
trying to connect to host "smtp.gmail.com", port 465, isSSL false
你的gmail smtp设置错误了。 Gmail需要SSL。请参阅有关如何通过Gmail SMTP通过Java发送电子邮件的教程,例如:http://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/
答案 9 :(得分:0)
以防万一有人来寻找这个问题的解决方案。
通过激活正在使用的帐户的Google两步验证并创建应用专用密码,可以缓解身份验证问题。我和OP有同样的问题。启用两步工作。
答案 10 :(得分:0)
我也有这个问题,但解决方案与编码无关。确保您能够连接到Gmail。 Ping smtp.gmail.com。如果您没有收到回复,请检查您的防火墙设置。它也可能是代理设置问题。
答案 11 :(得分:0)
适用于我的解决方案有两个步骤。
第一步
package com.student.mail;
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;
/**
*
* @author jorge santos
*/
public class GoogleMail {
public static void main(String[] args) {
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
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,
new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("conaderindicadores@gmail.com","Silueta95#");
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("conaderindicadores@gmail.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("netneillip@gmail.com"));
message.setSubject("Testing Subject");
message.setText("Test Mail");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
启用gmail安全性
https://myaccount.google.com/u/2/lesssecureapps?pli=1&pageId=none
答案 12 :(得分:0)
使用给定的 SMTP 设置实现三件事
SMTP 设置:
答案 13 :(得分:-1)
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendMail1 {
public static void main(String[] args) {
// Recipient's email ID needs to be mentioned.
String to = "valid email to address";
// Sender's email ID needs to be mentioned
String from = "valid email from address";
// Get system properties
Properties properties = System.getProperties();
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.port", "587");
properties.put("mail.smtp.auth", "true");
Authenticator authenticator = new Authenticator () {
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication("userid","password");//userid and password for "from" email address
}
};
Session session = Session.getDefaultInstance( properties , authenticator);
try{
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Now set the actual message
message.setText("This is actual message");
// Send message
Transport.send(message);
System.out.println("Sent message successfully....");
}catch (MessagingException mex) {
mex.printStackTrace();
}
}
}