网站首页 > 知识剖析 正文
在Java中发送包含表格的邮件,最佳方法是使用HTML格式的邮件内容,并结合JavaMail API。
下面是完整的实现方案:
实现思路
1. 使用JavaMail API创建和发送邮件
2. 构建HTML格式的邮件内容,包含表格
3. 使用内联CSS样式美化表格
4. 支持添加附件(可选)
完整代码示例
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
import java.util.List;
import java.util.ArrayList;
public class HtmlEmailSender {
// 邮件服务器配置
private String host;
private int port;
private String username;
private String password;
private boolean useSSL;
public HtmlEmailSender(String host, int port, String username, String password, boolean useSSL) {
this.host = host;
this.port = port;
this.username = username;
this.password = password;
this.useSSL = useSSL;
}
/**
* 发送HTML格式的邮件,包含表格
* @param to 收件人地址
* @param subject 邮件主题
* @param tableData 表格数据(第一行作为表头)
* @throws MessagingException
*/
public void sendHtmlEmailWithTable(String to, String subject, List<List<String>> tableData)
throws MessagingException {
// 创建邮件会话
Session session = createSession();
// 创建邮件消息
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(username));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject(subject);
// 创建HTML内容
String htmlContent = createHtmlContentWithTable(tableData);
// 设置邮件内容为HTML格式
message.setContent(htmlContent, "text/html; charset=utf-8");
// 发送邮件
Transport.send(message);
}
/**
* 创建包含表格的HTML内容
* @param tableData 表格数据
* @return HTML字符串
*/
private String createHtmlContentWithTable(List<List<String>> tableData) {
StringBuilder htmlBuilder = new StringBuilder();
// HTML头部和内联样式
htmlBuilder.append("<!DOCTYPE html>")
.append("<html>")
.append("<head>")
.append("<meta charset=\"UTF-8\">")
.append("<style>")
.append("body { font-family: Arial, sans-serif; }")
.append("table { border-collapse: collapse; width: 100%; margin: 20px 0; }")
.append("th, td { border: 1px solid #dddddd; text-align: left; padding: 12px; }")
.append("th { background-color: #f2f2f2; font-weight: bold; }")
.append("tr:nth-child(even) { background-color: #f9f9f9; }")
.append("tr:hover { background-color: #f1f1f1; }")
.append("</style>")
.append("</head>")
.append("<body>")
.append("<h2>数据报表</h2>")
.append("<p>以下是您请求的数据:</p>");
// 创建表格
htmlBuilder.append("<table>");
// 添加表头(第一行数据)
if (!tableData.isEmpty()) {
htmlBuilder.append("<thead><tr>");
for (String header : tableData.get(0)) {
htmlBuilder.append("<th>").append(header).append("</th>");
}
htmlBuilder.append("</tr></thead>");
}
// 添加表格内容(从第二行开始)
htmlBuilder.append("<tbody>");
for (int i = 1; i < tableData.size(); i++) {
htmlBuilder.append("<tr>");
for (String cell : tableData.get(i)) {
htmlBuilder.append("<td>").append(cell).append("</td>");
}
htmlBuilder.append("</tr>");
}
htmlBuilder.append("</tbody>");
htmlBuilder.append("</table>");
// HTML尾部
htmlBuilder.append("<p>此邮件由系统自动发送,请勿直接回复。</p>")
.append("</body>")
.append("</html>");
return htmlBuilder.toString();
}
/**
* 创建邮件会话
* @return Session对象
*/
private Session createSession() {
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
props.put("mail.smtp.auth", "true");
if (useSSL) {
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
} else {
props.put("mail.smtp.starttls.enable", "true");
}
return Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
/**
* 示例用法
*/
public static void main(String[] args) {
// 邮件服务器配置(请替换为实际值)
String host = "smtp.example.com";
int port = 587;
String username = "your-email@example.com";
String password = "your-password";
boolean useSSL = false;
// 创建邮件发送器
HtmlEmailSender sender = new HtmlEmailSender(host, port, username, password, useSSL);
// 准备表格数据(第一行作为表头)
List<List<String>> tableData = new ArrayList<>();
// 添加表头
List<String> header = new ArrayList<>();
header.add("ID");
header.add("姓名");
header.add("邮箱");
header.add("注册日期");
tableData.add(header);
// 添加数据行
List<String> row1 = new ArrayList<>();
row1.add("001");
row1.add("张三");
row1.add("zhangsan@example.com");
row1.add("2023-01-15");
tableData.add(row1);
List<String> row2 = new ArrayList<>();
row2.add("002");
row2.add("李四");
row2.add("lisi@example.com");
row2.add("2023-02-20");
tableData.add(row2);
List<String> row3 = new ArrayList<>();
row3.add("003");
row3.add("王五");
row3.add("wangwu@example.com");
row3.add("2023-03-10");
tableData.add(row3);
try {
// 发送邮件
sender.sendHtmlEmailWithTable("recipient@example.com", "数据报表", tableData);System.out.println("邮件发送成功!");
} catch (MessagingException e) {
System.err.println("邮件发送失败: " + e.getMessage());
e.printStackTrace();
}
}
}
Maven依赖
在pom.xml中添加JavaMail依赖:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
高级功能扩展
如果需要更复杂的表格或添加附件,可以使用以下扩展方法:
/**
* 发送带附件的HTML邮件
*/
public void sendHtmlEmailWithTableAndAttachment(
String to, String subject, List<List<String>> tableData,
String attachmentPath, String attachmentName) throws MessagingException {
Session session = createSession();
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(username));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject(subject);
// 创建多部分消息
Multipart multipart = new MimeMultipart();
// 添加HTML内容部分
BodyPart messageBodyPart = new MimeBodyPart();
String htmlContent = createHtmlContentWithTable(tableData);
messageBodyPart.setContent(htmlContent, "text/html; charset=utf-8");
multipart.addBodyPart(messageBodyPart);
// 添加附件部分
if (attachmentPath != null && !attachmentPath.isEmpty()) {
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(attachmentPath);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(attachmentName);
multipart.addBodyPart(messageBodyPart);
}
// 设置完整消息内容
message.setContent(multipart);
// 发送邮件
Transport.send(message);
}
注意事项
1. 确保邮件服务器配置正确(SMTP服务器地址、端口、认证信息)
2. 考虑使用线程池异步发送邮件,避免阻塞主应用程序
3. 对于生产环境,建议使用连接池提高性能
4. 处理可能的异常,如认证失败、网络问题等
5. 考虑使用模板引擎(如Thymeleaf或FreeMarker)来管理复杂的HTML内容
这种方法可以创建专业美观的表格邮件,并且可以根据需要轻松自定义样式和内容。
猜你喜欢
- 2025-09-09 用Python把表格做成web可视化图表
- 2025-09-09 太秀了!Excel批量生成条形码和二维码,一个公式就能解决
- 2025-09-09 制作Excel电子表格必备的:Excel 2021 mac中文版
- 2025-09-09 C#/VB.NET:将 HTML 转换为 Excel_如何将html中的数据转换到excel中
- 2025-09-09 如何快速写出表格代码?exl表格转换成html代码
- 2025-09-09 一看就懂的Excel表格的基本操作的十大技巧
- 2025-09-09 Python——Html(表格, , ,、表单 、自定义标签 和)
- 2025-09-09 太漂亮了 ! 输出好看的表格,就用这个 Python 库
- 最近发表
-
- 用Python把表格做成web可视化图表
- 太秀了!Excel批量生成条形码和二维码,一个公式就能解决
- 制作Excel电子表格必备的:Excel 2021 mac中文版
- C#/VB.NET:将 HTML 转换为 Excel_如何将html中的数据转换到excel中
- 如何快速写出表格代码?exl表格转换成html代码
- 一看就懂的Excel表格的基本操作的十大技巧
- Java发送包含表格的邮件_java发邮件内容含表格
- Python——Html(表格, , ,、表单 、自定义标签 和)
- 太漂亮了 ! 输出好看的表格,就用这个 Python 库
- AI实用指南:对抗AI幻觉的秘诀与Cursor+Claude 3.7编程Rules技巧
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)