You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Form Post方法在Servlet中发邮件遇HTTP 500内部服务器错误

解决Form Post发送邮件时的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:08:15