java - 尝试在 JSP 中发送电子邮件时出现 SMTPSendFailedException
问题描述
我试图让网络应用程序中的新注册用户收到一封电子邮件以进行确认,但经过长时间的搜索和调试其他问题,我被困在这个问题上并且没有找到解决方案。这是java服务器页面的代码和我得到的堆栈跟踪错误。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%
// code of sending email
String result;
// Recipient's email ID needs to be mentioned.
String to = "email recipient";
// Sender's email ID needs to be mentioned
String from = "myemail”
// Assuming you are sending email from localhost
String host = "smtp.gmail.com";
// Get system properties object
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", host);
// Get the default Session object.
Session mailSession = Session.getDefaultInstance(properties);
try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(mailSession);
// 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);
result = "Sent message successfully....";
} catch (MessagingException e) {
throw new RuntimeException(e);
}
// ends here code to send email
%>
<html>
<head>
<title>Send Email using JSP</title>
</head>
<body>
<center>
<h1>Send Email using JSP</h1>
</center>
<p align = "center">
<%
out.println("Result: " + result + "\n");
%>
</p>
</body>
</html>
我得到的错误:
org.apache.jasper.JasperException: An exception occurred processing [/email.jsp] at line [42]
39: Transport.send(message);
40: result = "Sent message successfully....";
41: } catch (MessagingException e) {
42: throw new RuntimeException(e);
43: }
44: // ends here code to send email
45: %>
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:611)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:500)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:378)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:326)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause
java.lang.RuntimeException: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. z8sm11494198wrh.37 - gsmtp
org.apache.jsp.email_jsp._jspService(email_jsp.java:168)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:71)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:467)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:378)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:326)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. z8sm11494198wrh.37 - gsmtp
com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2057)
com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1580)
com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1097)
javax.mail.Transport.send0(Transport.java:195)
javax.mail.Transport.send(Transport.java:124)
org.apache.jsp.email_jsp._jspService(email_jsp.java:165)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:71)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:467)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:378)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:326)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
我的网络部署程序集:
解决方案
注意:答案很长,抱歉,但我会尽量简短,同时展示使我的代码最终工作的所有内容,对于那些坚持这一点的人。我是一名大学生,所以我不是最有资格回答这个问题的,但这是我尽可能简洁明了的尝试。
您在上面看到的代码对我不起作用,它让我陷入了循环。它只是有一些警告可能会阻止您像我一样实际发送电子邮件并让您出错。您将在下面看到的代码对我有用,并且可以达到我想要的目的;在注册时向用户发送电子邮件。
我在尝试实现这一点时遇到的问题有两个主要问题:
- 由于安全原因,您设置用于发送电子邮件的 gmail 帐户不允许您发送电子邮件。
- 您的防病毒软件可能搞砸了。
如何解决这些问题:
要解决第一个问题,它相当简单,只需要您转到您在 gmail 中设置的电子邮件帐户用作您的发件人,并更改可能影响 gmail 如何与您编写的代码交互的 2 个设置。在您设置的 gmail 帐户上,转到 cog 图标并选择“查看所有设置”,然后选择“转发和 POP/IMAP”选项卡。启用所有邮件的 POP 下载和启用 IMAP 访问,保存设置并尝试代码。
如果该更改没有解决,请尝试转到您帐户的图标并单击“管理您的 Google 帐户”,转到“安全设置”并查找“不太安全的应用访问”,将其打开,保存更改并尝试再次。不要撤消上一步!
除了这 2 项更改之外,请检查您的防病毒软件和/或尝试将其禁用一段时间,然后再试一次。我发现我的同事在他的计算机上运行 McAfee Antivirus,而我只使用 Windows Defender。对我来说它有效,对他来说,他不得不关闭他的杀毒软件。也许比我了解更多的人可以回答为什么会发生这种情况。下面,我将放置发送电子邮件的代码。确保在代码中切换两件事:
String to = email;
确保您切换该电子邮件并放置您要从中发送电子邮件的电子邮件。对我来说,这是用户在文本框中写入的可变电子邮件,您可以尝试将您的个人电子邮件放在那里并检查它。您为发送目的创建的电子邮件密码下
String pass ="your password";
的密码。
查看导入,因为您将需要一些 .jar 文件。对于数据库,您需要数据库连接器 jar 文件,对于邮件导入,您需要 activation-jaf jar 文件和 java-mail jar 文件,所有这些都可以在 Internet 上找到。将它们添加到项目构建路径中的类路径中。在这些之后,您需要再次转到属性并选择部署程序集 -> 将这些相同的 jar 添加到其中,之后,您应该已设置好并可以尝试此代码,尽管有一些更改。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="java.sql.*"%>
<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%
String user = request.getParameter("username");
String pwd = request.getParameter("password");
String fullname = request.getParameter("name");
String email = request.getParameter("email");
int a=0;
//database connection to Apache Tomcat
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/databasename", "root", "password");
Statement stat = con.createStatement();
ResultSet rset;
rset = stat.executeQuery("select * from user where username ='" + user + "' or email='" + email +"'");
if(rset.next()) {
%>
<script type="text/javascript">
alert("Username or email already in use!");
window.location="register.jsp";
</script>
<%
} else {
int i = stat.executeUpdate("insert into user (username, password, name, email, active) values('" + user + "','"
+ pass + "','" + nome + "','" + email + "',0)");
if (i > 0) {
String result;
// code for sending email
String host = "smtp.gmail.com";
//The email you're sending from
String from = "email@gmail.com";
//The password
String password ="password";
// Where it's going to, in this case, it takes a user input for its email
String to = email;
// Get system properties
Properties properties = System.getProperties();
// Setup mail server
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.host", host);
properties.put("mail.smtp.user", from);
properties.put("mail.smtp.password", password);
properties.put("mail.smtp.port", "587");
properties.put("mail.smtp.auth", "true");
// Get the default Session object.
Session sess = Session.getDefaultInstance(properties);
try{
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(sess);
// 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("Successful Registration Email | VidTek");
// Now set the actual message
message.setContent("Message for the Content you want in the email.");
// Send message
Transport transport = sess.getTransport("smtp");
transport.connect(host, from, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
result = "Sent message successfully....";
} catch (MessagingException mex) {
mex.printStackTrace();
result = "Error: unable to send message...." + mex;
}
// ends here code to send email
response.sendRedirect("active.jsp");
}
else {
response.sendRedirect("register.jsp");
}
}
%>
如果您将其中一些名称更改为您拥有的名称,则在进行更改后,它应该发送一封电子邮件,其中包含您想要的任何主题和内容。
推荐阅读
- wordpress - WordPress网站中的汉堡包按钮问题
- excel - Excel VBA 'dim as Variant' 不允许 'for each' 循环
- vue.js - 静态元素上的Vue转换不起作用
- jquery - 为什么在浏览器的视图(刀片)文件中没有更新触发的推送器数据?
- typescript - 如何在 Vuex 4 和 TypeScript 中使用其他存储模块 getter/actions/mutations
- html - 如何在谷歌脚本中获得连续输出(进度条)
- c# - 自定义授权属性或基于策略的授权处理程序
- ruby - 如何将 cron 作业的结果存储在变量中?纯 Ruby,无导轨
- python - 使用 Selenium 通过 Web 抓取检索电子邮件
- c - c中多个键的键重复