Servlet 可以通过 JavaMail API 发送电子邮件,用于通知用户、发送确认邮件等。本文将介绍如何在Servlet中实现电子邮件发送功能。
目录
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. 实现邮件发送
基本步骤
- 创建
Session
:
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("your_email@gmail.com", "your_app_password");
}
});
- 构造邮件:
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!");
- 发送:
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. 部署与测试
部署
- 编译:
javac -cp /path/to/tomcat/lib/servlet-api.jar:/path/to/mail.jar EmailServlet.java
- 将
.class
文件放入myapp/WEB-INF/classes/
。 - 将
email.html
放入myapp/
。 - 将
mail.jar
放入WEB-INF/lib/
。 - 更新
web.xml
。 - 部署
myapp
到Tomcat的webapps
目录。 - 启动Tomcat。
测试
- 访问:
http://localhost:8080/myapp/email.html
- 输入收件人邮箱、主题和内容,提交:
- 成功:显示“邮件发送成功”。
- 失败:显示错误信息(如认证失败)。
- 检查收件人邮箱确认邮件。
7. 参考资料
出站链接
- JavaMail API – 官方文档。
- Servlet API – Servlet规范。
- Gmail SMTP – Gmail配置。
其他资源
- 《JavaMail API Design Specification》 – 邮件发送指南。
- X社区:搜索 #ServletEmail 获取示例。
这篇指南展示了Servlet发送电子邮件的实现。如果需要高级功能(如HTML邮件、附件或异步发送),请告诉我!
发表回复