领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

Java发送包含表格的邮件_java发邮件内容含表格

nixiaole 2025-09-09 08:58:38 知识剖析 5 ℃

在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内容


这种方法可以创建专业美观的表格邮件,并且可以根据需要轻松自定义样式和内容。

Tags:

最近发表
标签列表