Servlet 可以通过 JavaMail API 发送电子邮件,用于通知用户、发送确认邮件等。本文将介绍如何在Servlet中实现电子邮件发送功能。


目录

  1. 发送电子邮件概述
  2. 环境准备
  3. 配置邮件服务器
  4. 实现邮件发送
  5. 完整示例
  6. 部署与测试
  7. 参考资料

1. 发送电子邮件概述

  • 定义:通过Servlet使用SMTP协议发送邮件。
  • 用途:用户注册确认、密码重置通知等。
  • 技术:JavaMail API,提供邮件发送功能。

2. 环境准备

  • 依赖:JavaMail库(如 javax.mail:mail:1.4.7)。
  • Maven:
    xml <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency>
  • 或手动下载 mail.jar,放入 WEB-INF/lib/
  • 邮件服务器:如Gmail SMTP(smtp.gmail.com)。
  • 工具:Tomcat或其他Servlet容器。

3. 配置邮件服务器

配置参数

使用 Properties 配置SMTP:

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");

认证

需要用户名和密码:

  • Gmail:推荐使用“应用专用密码”(需启用两步验证)。
  • 存储:避免硬编码,可用 web.xml 或环境变量。

4. 实现邮件发送

基本步骤

  1. 创建 Session
   Session session = Session.getInstance(props, new Authenticator() {
       protected PasswordAuthentication getPasswordAuthentication() {
           return new PasswordAuthentication("your_email@gmail.com", "your_app_password");
       }
   });
  1. 构造邮件:
   Message message = new MimeMessage(session);
   message.setFrom(new InternetAddress("your_email@gmail.com"));
   message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("recipient@example.com"));
   message.setSubject("Test Email");
   message.setText("Hello from Servlet!");
  1. 发送:
   Transport.send(message);

5. 完整示例

以下是一个通过表单发送邮件的Servlet。

HTML:email.html

<!DOCTYPE html>
<html>
<head><title>发送邮件</title></head>
<body>
    <h2>发送电子邮件</h2>
    <form method="POST" action="/myapp/email">
        收件人邮箱: <input type="text" name="to"><br>
        主题: <input type="text" name="subject"><br>
        内容: <textarea name="body"></textarea><br>
        <input type="submit" value="发送">
    </form>
</body>
</html>

Servlet:EmailServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class EmailServlet extends HttpServlet {
    private static final String SMTP_HOST = "smtp.gmail.com";
    private static final String SMTP_PORT = "587";
    private static final String USERNAME = "your_email@gmail.com"; // 替换为你的邮箱
    private static final String PASSWORD = "your_app_password";   // 替换为你的应用密码

    @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 body = request.getParameter("body");

        if (to == null || subject == null || body == null || to.trim().isEmpty()) {
            out.println("<h1>错误: 请填写所有字段</h1>");
            out.println("<a href=\"/myapp/email.html\">返回</a>");
            return;
        }

        Properties props = new Properties();
        props.put("mail.smtp.host", SMTP_HOST);
        props.put("mail.smtp.port", SMTP_PORT);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");

        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME, PASSWORD);
            }
        });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(USERNAME));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            message.setSubject(subject);
            message.setText(body);
            Transport.send(message);

            out.println("<html><body>");
            out.println("<h1>邮件发送成功</h1>");
            out.println("<p>发送至: " + to + "</p>");
            out.println("<a href=\"/myapp/email.html\">返回</a>");
            out.println("</body></html>");
        } catch (MessagingException e) {
            out.println("<h1>邮件发送失败: " + e.getMessage() + "</h1>");
            out.println("<a href=\"/myapp/email.html\">返回</a>");
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.sendRedirect("/myapp/email.html");
    }
}

配置:web.xml

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <servlet-name>EmailServlet</servlet-name>
        <servlet-class>EmailServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>EmailServlet</servlet-name>
        <url-pattern>/email</url-pattern>
    </servlet-mapping>
</web-app>

6. 部署与测试

部署

  1. 编译:
   javac -cp /path/to/tomcat/lib/servlet-api.jar:/path/to/mail.jar EmailServlet.java
  1. .class 文件放入 myapp/WEB-INF/classes/
  2. email.html 放入 myapp/
  3. mail.jar 放入 WEB-INF/lib/
  4. 更新 web.xml
  5. 部署 myapp 到Tomcat的 webapps 目录。
  6. 启动Tomcat。

测试

  • 访问:http://localhost:8080/myapp/email.html
  • 输入收件人邮箱、主题和内容,提交:
    • 成功:显示“邮件发送成功”。
    • 失败:显示错误信息(如认证失败)。
  • 检查收件人邮箱确认邮件。

7. 参考资料

出站链接

其他资源

  • 《JavaMail API Design Specification》 – 邮件发送指南。
  • X社区:搜索 #ServletEmail 获取示例。

这篇指南展示了Servlet发送电子邮件的实现。如果需要高级功能(如HTML邮件、附件或异步发送),请告诉我!