技术求助:用Groovy脚本将管道分隔文本转表格并嵌入邮件正文
没问题!我来一步步帮你解决这个需求。下面是一套完整的Groovy解决方案,可以把你的管道分隔文本文件转换成能直接嵌入邮件正文的HTML表格(不需要附件):
1. 读取并解析管道分隔文件
首先我们需要读取传入的文件内容,拆分表头和数据行。这里假设文件内容通过变量fileContent传入(如果是文件路径的话,先读取成字符串即可):
// 如果是文件路径,先读取内容:def fileContent = new File(filePath).text def fileLines = fileContent.split('\n') .findAll { it.trim() != '' } // 过滤空行,避免无效数据 // 拆分表头,注意管道符需要转义 def header = fileLines[0].split('\\|').collect { it.trim() } // 拆分所有数据行 def dataRows = fileLines[1..-1].collect { line -> line.split('\\|').collect { it.trim() } }
2. 生成可嵌入邮件的HTML表格
邮件正文支持HTML格式,所以我们生成带基础样式的HTML表格,保证在邮件客户端里显示美观:
def htmlTable = new StringBuilder() // 表格基础样式:合并边框、设置内边距,提升可读性 htmlTable.append('''<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px;">''') // 添加表头行 htmlTable.append('<thead><tr style="background-color: #f2f2f2;">') header.each { col -> htmlTable.append("<th>${col}</th>") } htmlTable.append('</tr></thead>') // 添加数据行 htmlTable.append('<tbody>') dataRows.each { row -> htmlTable.append('<tr>') row.each { cell -> // 可以在这里处理特殊字段,比如日期格式化 htmlTable.append("<td>${cell}</td>") } htmlTable.append('</tr>') } htmlTable.append('</tbody></table>') // 最终的表格HTML字符串,直接嵌入邮件正文 def emailTableContent = htmlTable.toString()
3. 优化:日期字段格式化(可选)
如果想把源文件里的20180411 121519.761这种日期格式转成更友好的样式,可以加一个日期处理函数:
def formatDateTime(String rawDate) { if (!rawDate) return '' try { def inputFormat = new SimpleDateFormat('yyyyMMdd HHmmss.SSS') def outputFormat = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss') return outputFormat.format(inputFormat.parse(rawDate)) } catch (Exception e) { return rawDate // 解析失败则返回原内容 } } // 在生成数据单元格时调用这个函数 // htmlTable.append("<td>${formatDateTime(cell)}</td>")
4. 嵌入邮件正文发送
根据你的使用场景,这里提供两种常见的发送方式:
场景1:普通Groovy环境(用JavaMail)
需要引入JavaMail依赖,然后发送HTML邮件:
import javax.mail.* import javax.mail.internet.* def props = new Properties() // 配置你的邮件服务器信息,比如SMTP props.put('mail.smtp.host', 'your-smtp-server.com') props.put('mail.smtp.port', '587') props.put('mail.smtp.auth', 'true') props.put('mail.smtp.starttls.enable', 'true') def session = Session.getInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication('your-email@example.com', 'your-password') } }) def message = new MimeMessage(session) message.setFrom(new InternetAddress('sender@example.com')) message.addRecipient(Message.RecipientType.TO, new InternetAddress('recipient@example.com')) message.setSubject('文件处理结果') // 设置HTML格式的正文,把表格嵌入进去 message.setContent("<p>您好,以下是处理后的文件列表:</p>${emailTableContent}", 'text/html; charset=utf-8') // 发送邮件 Transport.send(message)
场景2:Jenkins Groovy脚本(用邮件插件)
如果是在Jenkins里执行这个脚本,直接用emailext插件更方便:
emailext( subject: '文件处理结果通知', body: """<p>各位好:</p> <p>以下是最新的文件处理列表:</p> ${emailTableContent}""", to: 'team@example.com', mimeType: 'text/html' )
注意事项
- 如果你的源文件字段里包含未转义的管道符,上面的简单拆分逻辑会出错,这种情况建议用专业的CSV解析库(比如OpenCSV)来处理,Groovy可以轻松引入使用。
- 测试邮件时,注意不同邮件客户端对HTML样式的支持差异,基础样式(边框、背景色)一般都能正常显示。
内容的提问来源于stack exchange,提问作者Jayachandran Oduvil
相关产品推荐
相关产品推荐

