使用Form Post方法在Servlet中发邮件遇HTTP 500内部服务器错误
先帮你梳理几个最可能导致这个错误的点,一步步排查:
1. 最直接的拼写错误:Servlet路径不匹配
你的JSP表单里的action写的是ServlateMail,但你的Servlet类名是ServletMail(注意是Servlet不是Servlate)——这就导致请求找不到对应的Servlet实例,直接触发500错误。
解决方法:
- 要么把JSP里的
action改成ServletMail,和类名对应; - 要么在你的
ServletMail类上添加注解,指定路径为@WebServlet("/ServlateMail")(如果用注解方式配置Servlet的话)。
2. 检查Servlet的映射配置
如果不是用注解,而是传统的web.xml配置,一定要确保Servlet的映射正确,否则Tomcat找不到处理请求的Servlet:
<servlet> <servlet-name>ServletMail</servlet-name> <servlet-class>controller.ServletMail</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletMail</servlet-name> <url-pattern>/ServletMail</url-pattern> <!-- 这里要和JSP的action一致 --> </servlet-mapping>
3. 修复Servlet里的响应编码错误
你的Servlet里有个小错误:response.setContentType("text/html;charset-UTF-8")里的charset-UTF-8应该是charset=UTF-8(用等号连接,不是减号)。虽然这不一定是500的直接原因,但会导致页面编码异常,建议修正。
4. 完善异常处理,避免吞掉错误
现在你的Sendmail工具类里,catch块只是打印堆栈,没有把异常传递给Servlet,导致如果邮件发送过程中出问题(比如SMTP配置错误、邮箱权限不足),异常会被隐藏,但严重时还是会往上抛导致Servlet崩溃。
建议修改工具类,让它抛出异常或者返回执行状态,这样Servlet可以给用户明确的反馈:
修改后的Sendmail工具类:
package utils; import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class Sendmail { public static boolean sendmailer(String to, String sub, String msg, final String user,final String pass) throws MessagingException { Properties props = new Properties(); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); Session session = Session.getInstance(props,new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user,pass); } }); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(user)); message.addRecipient(Message.RecipientType.TO,new InternetAddress(to)); message.setSubject(sub); message.setText(msg); Transport.send(message); return true; } }
修改后的Servlet doPost方法:
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String to = request.getParameter("to"); String subject = request.getParameter("subject"); String message = request.getParameter("message"); String user = request.getParameter("user"); String pass = request.getParameter("pass"); try { Sendmail.sendmailer(to,subject, message, user, pass); out.println("<h3>Mail sent successfully!</h3>"); System.out.println("Mail send successfully"); } catch (MessagingException e) { out.println("<h3>Failed to send mail: " + e.getMessage() + "</h3>"); e.printStackTrace(); } }
5. 处理Gmail SMTP的权限限制
如果你用的是Gmail发送邮件,现在Google默认禁止普通密码登录第三方应用,你需要:
- 给你的Google账号开启两步验证,然后创建一个应用专用密码(App Password),用这个密码代替你的邮箱登录密码;
- 不推荐的方式:暂时开启“不太安全的应用访问”(Google已逐步淘汰该选项)。
6. 确认依赖库的正确放置
确保javax.mail.jar和activation.jar放在项目的WEB-INF/lib目录下,而不是项目的其他文件夹——只有放在这里,Tomcat才能在运行时正确加载这些类,否则会出现ClassNotFoundException,直接导致500错误。
最后,建议查看Tomcat的日志文件(比如logs/catalina.out),找到完整的异常堆栈信息,里面会有更详细的错误原因,能帮你更快定位问题。
内容的提问来源于stack exchange,提问作者sourav

