无法使用 servlet 和 JavaMail 发送电子邮件
Unable to send email using servlet and JavaMail
我正在使用 JavaMail
发送电子邮件,但出现错误 javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8 https://support.google.com/mail/?p=BadCredentials g188sm3298732pfc.24 - gsmtp
- 我正在做的是,我有一个 class 作为
EmailUtility
。
- 上面的 class 有一个静态方法,
sendEmail()
– 它以 SMTP 服务器设置和邮件详细信息作为参数。
- 我将 SMTP 服务器设置放入我的 web.xml 文件中
但不知道出了什么问题
我的EmailUtility
class
public class EmailUtility {
public static void sendEmail(String host, String port, final String userName, final String password,
String toAddress, String subject, String message) throws AddressException, MessagingException {
// setting SMTP server properties
Properties properties = new Properties();
properties.put("mail.smtp.host", host);
properties.put("mail.smtp.port", port);
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.starttls.enable", "true");
Session session = Session.getInstance(properties, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
// creates a new e-mail message
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(userName));
InternetAddress[] toAddresses = { new InternetAddress(toAddress) };
msg.setRecipients(Message.RecipientType.TO, toAddresses);
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(message);
// sending the e-mail
Transport.send(msg);
}
}
这是我的 web.xml 文件
<context-param>
<param-name>host</param-name>
<param-value>smtp.gmail.com</param-value>
</context-param>
<context-param>
<param-name>port</param-name>
<param-value>587</param-value>
</context-param>
<context-param>
<param-name>user</param-name>
<param-value>test.123@gmail.com</param-value>
</context-param>
<context-param>
<param-name>pass</param-name>
<param-value>12345698</param-value>
</context-param>
这是我的 servlet class
public void init() {
// reading SMTP server setting from web.xml file
ServletContext context = getServletContext();
host = context.getInitParameter("host");
port = context.getInitParameter("port");
user = context.getInitParameter("user");
pass = context.getInitParameter("pass");
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// reading form fields
String recipient = request.getParameter("recipient");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
System.out.println(recipient+" sub "+subject+" content "+content);
String resultMessage = "";
try {
EmailUtility.sendEmail(host, port, user, pass, recipient, subject,
content);
resultMessage = "The e-mail was sent successfully";
} catch (Exception ex) {
ex.printStackTrace();
resultMessage = "There were an error: " + ex.getMessage();
}
我做的是对的,但不知道问题出在哪里
如果我在 gmail 中启用 Less Secure App 设置,那么它可以正常工作,我认为这不是解决问题的正确方法,因为并非每个用户都会这样做这样做
所以大家帮帮我,我不知道我在做什么奇怪的事情,谢谢
Edit 是否有任何其他资源可以让我在跨平台上发送邮件,比如从 gmail 到 yahoo 之类的,我愿意使用任何其他可以做到的资源我正在尝试的任务
不同的服务器有不同的安全要求。如果你想处理所有这些,你将需要在你的应用程序中有一些特殊情况。
有时您需要用户为电子邮件服务器创建应用专用密码。
如果服务器支持,有时您需要支持OAuth。
我正在使用 JavaMail
发送电子邮件,但出现错误 javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8 https://support.google.com/mail/?p=BadCredentials g188sm3298732pfc.24 - gsmtp
- 我正在做的是,我有一个 class 作为
EmailUtility
。 - 上面的 class 有一个静态方法,
sendEmail()
– 它以 SMTP 服务器设置和邮件详细信息作为参数。 - 我将 SMTP 服务器设置放入我的 web.xml 文件中 但不知道出了什么问题
我的EmailUtility
class
public class EmailUtility {
public static void sendEmail(String host, String port, final String userName, final String password,
String toAddress, String subject, String message) throws AddressException, MessagingException {
// setting SMTP server properties
Properties properties = new Properties();
properties.put("mail.smtp.host", host);
properties.put("mail.smtp.port", port);
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.starttls.enable", "true");
Session session = Session.getInstance(properties, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
// creates a new e-mail message
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(userName));
InternetAddress[] toAddresses = { new InternetAddress(toAddress) };
msg.setRecipients(Message.RecipientType.TO, toAddresses);
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(message);
// sending the e-mail
Transport.send(msg);
}
}
这是我的 web.xml 文件
<context-param>
<param-name>host</param-name>
<param-value>smtp.gmail.com</param-value>
</context-param>
<context-param>
<param-name>port</param-name>
<param-value>587</param-value>
</context-param>
<context-param>
<param-name>user</param-name>
<param-value>test.123@gmail.com</param-value>
</context-param>
<context-param>
<param-name>pass</param-name>
<param-value>12345698</param-value>
</context-param>
这是我的 servlet class
public void init() {
// reading SMTP server setting from web.xml file
ServletContext context = getServletContext();
host = context.getInitParameter("host");
port = context.getInitParameter("port");
user = context.getInitParameter("user");
pass = context.getInitParameter("pass");
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// reading form fields
String recipient = request.getParameter("recipient");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
System.out.println(recipient+" sub "+subject+" content "+content);
String resultMessage = "";
try {
EmailUtility.sendEmail(host, port, user, pass, recipient, subject,
content);
resultMessage = "The e-mail was sent successfully";
} catch (Exception ex) {
ex.printStackTrace();
resultMessage = "There were an error: " + ex.getMessage();
}
我做的是对的,但不知道问题出在哪里
如果我在 gmail 中启用 Less Secure App 设置,那么它可以正常工作,我认为这不是解决问题的正确方法,因为并非每个用户都会这样做这样做
所以大家帮帮我,我不知道我在做什么奇怪的事情,谢谢
Edit 是否有任何其他资源可以让我在跨平台上发送邮件,比如从 gmail 到 yahoo 之类的,我愿意使用任何其他可以做到的资源我正在尝试的任务
不同的服务器有不同的安全要求。如果你想处理所有这些,你将需要在你的应用程序中有一些特殊情况。
有时您需要用户为电子邮件服务器创建应用专用密码。
如果服务器支持,有时您需要支持OAuth。