You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:44:04