首页 > 解决方案 > 尝试在 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)

我的网络部署程序集:

标签: javaemailjspservlets

解决方案


注意:答案很长,抱歉,但我会尽量简短,同时展示使我的代码最终工作的所有内容,对于那些坚持这一点的人。我是一名大学生,所以我不是最有资格回答这个问题的,但这是我尽可能简洁明了的尝试。

您在上面看到的代码对我不起作用,它让我陷入了循环。它只是有一些警告可能会阻止您像我一样实际发送电子邮件并让您出错。您将在下面看到的代码对我有用,并且可以达到我想要的目的;在注册时向用户发送电子邮件。

我在尝试实现这一点时遇到的问题有两个主要问题:

  • 由于安全原因,您设置用于发送电子邮件的 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");
}
}
%>

如果您将其中一些名称更改为您拥有的名称,则在进行更改后,它应该发送一封电子邮件,其中包含您想要的任何主题和内容。


推荐阅读