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

Jira Service Management云版:Groovy脚本实现CSV附件邮件订阅

Jira Service Management云版+Script Runner实现JQL结果CSV附件邮件订阅

你的思路完全正确,核心就是JQL查询结果转CSV + 发送带附件的订阅邮件两步。导入语句错误几乎都是因为混淆了Jira Server/Data Center和Cloud版的API类——Script Runner云版仅支持Atlassian官方Cloud REST API或自身提供的绑定类,不能直接引用服务器版com.atlassian.jira包下的专属类。

一、JQL结果转CSV的Groovy实现

以下是适配云版的脚本,用Script Runner自带的工具类完成查询与CSV生成:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.bc.issue.search.PagerFilter
import com.opencsv.CSVWriter

// 1. 获取执行查询的用户(可替换为指定订阅用户)
ApplicationUser currentUser = ComponentAccessor.jiraAuthenticationContext.loggedInUser

// 2. 定义目标JQL语句
String targetJql = "project = '你的项目键' AND status IN (Open, 'In Progress')" // 替换为你的JQL

// 3. 解析并执行JQL查询
SearchService searchService = ComponentAccessor.getComponent(SearchService)
SearchService.ParseResult parseResult = searchService.parseQuery(currentUser, targetJql)

if (!parseResult.isValid()) {
    throw new IllegalArgumentException("JQL格式错误: " + parseResult.getErrors().toString())
}

def issueResults = searchService.search(currentUser, parseResult.getQuery(), PagerFilter.getUnlimitedFilter())

// 4. 定义CSV导出字段(按需调整)
List<String> exportFields = ["Issue Key", "Summary", "Status", "Assignee", "Created Date"]

// 5. 生成CSV内容
StringWriter csvWriter = new StringWriter()
CSVWriter writer = new CSVWriter(csvWriter)

// 写入表头
writer.writeNext(exportFields.toArray(new String[0]))

// 遍历结果写入数据行
issueResults.getIssues().each { issue ->
    List<String> rowData = []
    rowData.add(issue.getKey())
    rowData.add(issue.getSummary())
    rowData.add(issue.getStatus().getName())
    rowData.add(issue.getAssignee() ? issue.getAssignee().getDisplayName() : "未分配")
    rowData.add(issue.getCreated().format("yyyy-MM-dd HH:mm"))
    writer.writeNext(rowData.toArray(new String[0]))
}

writer.close()
String csvContent = csvWriter.toString()

二、发送带CSV附件的订阅邮件

结合Jira云版的邮件服务API,实现带附件的邮件发送:

import com.atlassian.mail.server.MailServerManager
import com.atlassian.mail.Email
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMultipart
import java.text.SimpleDateFormat

// 1. 获取默认SMTP服务器
MailServerManager mailServerManager = ComponentAccessor.getComponent(MailServerManager)
def smtpServer = mailServerManager.getDefaultSMTPMailServer()

if (!smtpServer) {
    throw new IllegalStateException("Jira未配置默认SMTP邮件服务器")
}

// 2. 构建邮件
Email subscriptionEmail = new Email("订阅用户邮箱@example.com") // 替换为目标邮箱
subscriptionEmail.setSubject("JQL查询结果导出_${new SimpleDateFormat("yyyyMMdd").format(new Date())}")
subscriptionEmail.setFrom(smtpServer.getDefaultFromAddress())

// 3. 构建多部件邮件内容(正文+附件)
MimeMultipart multipartContent = new MimeMultipart()

// 添加邮件正文
MimeBodyPart textBody = new MimeBodyPart()
textBody.setText("这是您订阅的JQL查询结果,附件为CSV格式文件。")
multipartContent.addBodyPart(textBody)

// 添加CSV附件
MimeBodyPart csvAttachment = new MimeBodyPart()
csvAttachment.setContent(csvContent, "text/csv; charset=utf-8")
csvAttachment.setFileName("JQL_Results_${new SimpleDateFormat("yyyyMMdd").format(new Date())}.csv")
multipartContent.addBodyPart(csvAttachment)

subscriptionEmail.setMultipart(multipartContent)

// 4. 发送邮件
smtpServer.send(subscriptionEmail)

导入错误排查要点

  1. 禁用服务器版类导入:不要尝试导入com.atlassian.jira.web.bean.PagerFilter等服务器专属类,云版对应类为com.atlassian.jira.bc.issue.search.PagerFilter
  2. 依赖Script Runner自带工具:com.opencsv.CSVWriter是Script Runner云版内置的,无需额外安装插件
  3. 利用编辑器自动补全:在Script Runner脚本编辑器中,输入类名时的自动补全提示是判断类是否可用的标准,无提示的类请勿使用

内容的提问来源于stack exchange,提问作者Udara Manupriya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:40:55