【邮件发送】将list数据以html格式的形式展示到邮件正文

本文介绍了如何将不满足团购商品利润和库存条件的数据从列表转换为HTML表格,然后在邮件正文中展示,以提高邮件的可读性和美观性。通过创建HTML结构,遍历列表数据,限制展示条数,最终调用邮件服务发送带有HTML内容的邮件。
摘要由CSDN通过智能技术生成

签名:但行好事,莫问前程。


前言

公司产品提出了一个新需求,要求把不满足团购商品利润和库存的Excel里面的数据展示到邮件正文,(之前本来是Excel作为附件发送到邮箱)。要求:正文展示的数据要美观。


一、需求分析

  • 已经可以获取的数据:不满足团购商品利润和库存的list数据、需要发送邮件的人邮箱的数组,以及发送邮件的工具类。
  • 需要优化的部分:把list数据展示到邮件正文。
  • 解决思路:将list数据抽取成table表格,然后以html的形式展示到邮件正文(ps:邮件是支持解析html内容的)

二、代码编写

if(profitVOList != null && profitVOList.size() > 0){
                String subject = "团购商品利润和库存预警";
                //Step3:创建临时表格文件
                String fileName =  new String(subject.getBytes("utf-8"));
                File sheetFile = new File(fileName + ".xlsx");
                ExcelUtil.writeExcel(sheetFile, EmallGoodsStockAndProfitVO.class, profitVOList);

                if (notifyEmail != null) {
                    logger.info("邮件通知人[{}],[{}]", sendTo,sendTo2);
                    logger.info("邮件通知内容[{}]", profitVOList);

                    // Excel内容在邮件正文显示
                    StringBuilder htmlText = new StringBuilder();
                    String htmlStar = "<html><body><table border=\"1px\" cellpadding=\"10px\">";
                    String htmlEnd = "</table></body></html>";
                    // 表头
                    String th = "<tr>" +
                            "<th>营销活动ID</th>" +
                            "<th>营销活动</th>" +
                            "<th>场次ID</th>" +
                            "<th>场次名称</th>" +
                            "<th>场次开始时间</th>" +
                            "<th>场次结束时间</th>" +
                            "<th>商品ID</th>" +
                            "<th>商品名称</th>" +
                            "<th>利润率</th>" +
                            "<th>库存</th></tr>";
                    // 行数据
                    StringBuilder tr = new StringBuilder();
                    // for循坏table的行数据
                    for (int i = 0; i < profitVOList.size(); i++) {
                        // 只展示前20条数据
                        if (i == 20) {
                            tr.append("更多数据请打开Excel附件查看详情O(∩_∩)O~");
                            break;
                        }
                        // 依次获取表头对应的字段值
                        tr.append(
                                "<tr>" +
                                        "<td>" + profitVOList.get(i).getProjectId() + "</td>" +
                                        "<td>" + profitVOList.get(i).getProjectName() + "</td>" +
                                        "<td>" + profitVOList.get(i).getSessionId() + "</td>" +
                                        "<td>" + profitVOList.get(i).getSessionName() + "</td>" +
                                        "<td>" + profitVOList.get(i).getSessionStartTime() + "</td>" +
                                        "<td>" + profitVOList.get(i).getSessionEndTime() + "</td>" +
                                        "<td>" + profitVOList.get(i).getGoodsId() + "</td>" +
                                        "<td>" + profitVOList.get(i).getGoodsName() + "</td>" +
                                        "<td>" + profitVOList.get(i).getProfit() + "</td>" +
                                        "<td>" + profitVOList.get(i).getSurplusNum() + "</td>" +
                                        "</tr>");
                    }
                    // 拼接HTML页面
                    htmlText.append(htmlStar);
                    htmlText.append(th);
                    htmlText.append(tr);
                    htmlText.append(htmlEnd);
                    notifyService.notifyMailWithAttachmentAndHtmlText(emailStr.split(","), fileName, sheetFile, String.valueOf(htmlText), false);
                }
            } else {
                logger.info("团购商品活动利润正常,无需预警, [{}]");
            }

三、解决思路

  1. 定义html、body、table 头和尾
 String htmlStar = "<html><body><table border=\"1px\" cellpadding=\"10px\">";
 String htmlEnd = "</table></body></html>";
  1. 定义table的表头
// 表头
                    String th = "<tr>" +
                            "<th>营销活动ID</th>" +
                            "<th>营销活动</th>" +
                            "<th>场次ID</th>" +
                            "<th>场次名称</th>" +
                            "<th>场次开始时间</th>" +
                            "<th>场次结束时间</th>" +
                            "<th>商品ID</th>" +
                            "<th>商品名称</th>" +
                            "<th>利润率</th>" +
                            "<th>库存</th></tr>";
  1. for循坏遍历list生成行数据
// 行数据
                    StringBuilder tr = new StringBuilder();
                    // for循坏table的行数据
                    for (int i = 0; i < profitVOList.size(); i++) {
                        // 只展示前20条数据
                        if (i == 20) {
                            tr.append("更多数据请打开Excel附件查看详情O(∩_∩)O~");
                            break;
                        }
                        // 依次获取表头对应的字段值
                        tr.append(
                                "<tr>" +
                                        "<td>" + profitVOList.get(i).getProjectId() + "</td>" +
                                        "<td>" + profitVOList.get(i).getProjectName() + "</td>" +
                                        "<td>" + profitVOList.get(i).getSessionId() + "</td>" +
                                        "<td>" + profitVOList.get(i).getSessionName() + "</td>" +
                                        "<td>" + profitVOList.get(i).getSessionStartTime() + "</td>" +
                                        "<td>" + profitVOList.get(i).getSessionEndTime() + "</td>" +
                                        "<td>" + profitVOList.get(i).getGoodsId() + "</td>" +
                                        "<td>" + profitVOList.get(i).getGoodsName() + "</td>" +
                                        "<td>" + profitVOList.get(i).getProfit() + "</td>" +
                                        "<td>" + profitVOList.get(i).getSurplusNum() + "</td>" +
                                        "</tr>");
                    }
  1. 拼接HTML页面
// 拼接HTML页面
                    htmlText.append(htmlStar);
                    htmlText.append(th);
                    htmlText.append(tr);
                    htmlText.append(htmlEnd);
  1. 调用邮件发送方法
notifyService.notifyMailWithAttachmentAndHtmlText(emailStr.split(","), fileName, sheetFile, String.valueOf(htmlText), false);

四、最终效果

将list数据以html格式的形式展示到邮件正文

在这里插入图片描述


总结

博客主要记录了工作中将list数据以html格式的形式展示到邮件正文的问题,有啥错误或不足地方请指正,如果对你有所帮助,请一键三连。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我作为AI语言模型无法执行实时任务,也无法直接发送邮件。但我可以提供以下思路和代码供参考。 思路: 1. 使用Python的requests库向微博热搜榜页面发送请求,获取页面源代码。 2. 使用正则表达式或BeautifulSoup库解析页面源代码,提取出前50条热搜的名称、链接和实时热度。 3. 使用Python的smtplib库连接到SMTP服务器,登录邮箱账号,编写邮件主题和正文,将获取到的数据作为正文内容。 4. 使用Python的time库设置定时器,每20秒发送一次邮件。 代码示例: ```python import requests from bs4 import BeautifulSoup import smtplib from email.mime.text import MIMEText import time # 定义发送邮件的函数 def send_email(content): # 邮箱服务器地址和端口号 mail_host = 'smtp.xxx.com' mail_port = 465 # 发件人邮箱账号和密码 mail_user = 'xxx@xxx.com' mail_pass = 'xxxxxx' # 收件人邮箱地址 to_addr = 'xxx@xxx.com' # 邮件主题和正文内容 subject = '微博热搜榜前50条' text = content # 创建邮件对象 message = MIMEText(text, 'plain', 'utf-8') message['From'] = mail_user message['To'] = to_addr message['Subject'] = subject # 发送邮件 try: smtpObj = smtplib.SMTP_SSL(mail_host, mail_port) smtpObj.login(mail_user, mail_pass) smtpObj.sendmail(mail_user, to_addr, message.as_string()) print('邮件发送成功') except smtplib.SMTPException as e: print('邮件发送失败') print(e) # 定义获取热搜榜数据的函数 def get_hot_search(): url = 'https://s.weibo.com/top/summary?cate=realtimehot' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 获取前50条热搜的名称、链接和实时热度 hot_search_list = [] for item in soup.select('.list_a li'): hot_search = {} hot_search['name'] = item.select_one('.list_title').text hot_search['link'] = 'https://s.weibo.com' + item.select_one('.list_title a')['href'] hot_search['hot'] = item.select_one('.list_hot').text hot_search_list.append(hot_search) # 构造邮件正文 content = '' for index, item in enumerate(hot_search_list): content += '{}. {}({})\n{}\n\n'.format(index+1, item['name'], item['hot'], item['link']) return content # 每20秒发送一次邮件 while True: content = get_hot_search() send_email(content) time.sleep(20) ``` 注意事项: 1. 发送邮件前需要先开启邮箱的SMTP服务,并获取授权码。 2. 邮箱账号密码等敏感信息需要进行保护,可以使用环境变量或配置文件等方式存储。 3. 发送邮件时需要考虑网络延迟等因素,建议设置较长的定时器间隔,避免频繁发送邮件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值