1. 项目背景与核心功能
这个Java Web邮件系统是我在软件工程专业大三期末完成的课程设计项目。当时教授给的要求是:"用Java Web技术实现一个具备完整收发邮件功能的系统,要求采用MVC架构,至少包含用户登录、邮件撰写、发送、接收、删除等基础功能"。经过两周的熬夜开发,最终完成了一个支持多账户邮件往来的Web应用。
系统核心功能包括:
- 用户注册与登录(基于Session的认证机制)
- 邮件撰写与发送(支持多收件人、附件上传)
- 收件箱管理(分页显示、邮件查看)
- 草稿箱与已发送邮件管理
- 简单的通讯录功能
技术栈选择上,我采用了经典的Java Web组合:
- 前端:JSP + Bootstrap + jQuery
- 后端:Servlet + JavaMail API
- 数据库:MySQL 5.7
- 服务器:Tomcat 9.0
特别说明:当时选择这套技术栈主要是考虑课程要求必须使用Servlet/JSP,其实现在Spring Boot会更高效。但掌握这些底层技术对理解Web开发原理很有帮助。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 MVC分层结构
整个系统严格遵循MVC模式:
code复制src/
├── main/
│ ├── java/
│ │ ├── controller/ (Servlet)
│ │ ├── model/ (POJO/DAO)
│ │ └── util/ (工具类)
│ ├── webapp/
│ │ ├── WEB-INF/
│ │ │ └── views/ (JSP)
│ │ └── static/ (CSS/JS)
└── test/ (单元测试)
2.2 数据库设计
主要表结构设计如下:
| 表名 | 字段 | 说明 |
|---|---|---|
| users | id, username, password, email | 用户表 |
| emails | id, subject, content, send_time | 邮件主表 |
| email_recipients | email_id, recipient_id | 邮件收件人关联 |
| attachments | id, email_id, filename, filepath | 附件表 |
注意:密码存储使用了MD5加密(虽然现在推荐用BCrypt),当时还不会用Spring Security。
3. 核心功能实现
3.1 邮件发送模块
发送邮件的核心代码在EmailServlet中:
java复制// 获取表单参数
String[] recipients = request.getParameterValues("recipients");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
// 处理附件
Part filePart = request.getPart("attachment");
if (filePart != null && filePart.getSize() > 0) {
String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();
InputStream fileContent = filePart.getInputStream();
// 保存到服务器指定目录
Files.copy(fileContent, Paths.get(uploadPath + fileName));
}
邮件发送使用JavaMail API:
java复制Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com");
props.put("mail.smtp.port", "25");
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props,
new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject(subject);
message.setText(content);
Transport.send(message);
3.2 分页查询实现
收件箱分页是个难点,SQL写法很有讲究:
sql复制SELECT e.*, u.username as sender_name
FROM emails e
JOIN users u ON e.sender_id = u.id
JOIN email_recipients er ON e.id = er.email_id
WHERE er.recipient_id = ?
ORDER BY e.send_time DESC
LIMIT ?, ?;
对应的DAO层代码:
java复制public List<Email> findReceivedEmails(int userId, int page, int pageSize) {
int offset = (page - 1) * pageSize;
// 执行SQL并映射结果...
}
4. 开发中的坑与解决方案
4.1 中文乱码问题
遇到最头疼的问题是中文乱码,需要在多个地方统一编码:
- Servlet中设置request/response编码:
java复制request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
- JSP页面头部添加:
jsp复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- 数据库连接字符串需要指定:
code复制jdbc:mysql://localhost:3306/mail_system?useUnicode=true&characterEncoding=UTF-8
4.2 文件上传限制
Tomcat默认限制上传文件大小为2MB,需要修改配置:
xml复制<multipart-config>
<max-file-size>10485760</max-file-size> <!-- 10MB -->
<max-request-size>20971520</max-request-size> <!-- 20MB -->
<file-size-threshold>0</file-size-threshold>
</multipart-config>
5. 项目扩展建议
如果现在重做这个项目,我会考虑以下改进:
- 使用Spring Boot简化配置
- 引入Redis缓存高频访问数据
- 增加邮件分类和过滤功能
- 实现WebSocket实时通知新邮件
- 添加邮件全文检索功能
这个项目虽然技术不算新,但完整实现了邮件系统的核心流程,对理解Web开发底层原理非常有帮助。特别是对HTTP协议、会话管理、数据库事务等概念的理解,为后续学习Spring框架打下了坚实基础。
