如何获取/重新生成Jenkins Mailer插件构建失败后的邮件文本
获取Jenkins Mailer插件构建失败邮件文本的可行方案
嘿,我刚好处理过类似的需求,给你几个靠谱的路子来拿到Mailer插件发送的邮件文本,赋值给String emailText做自定义解析:
1. 用Groovy脚本直接生成/捕获邮件内容
Jenkins自带的Groovy支持可以轻松模拟或拦截Mailer插件的邮件内容,适合快速验证和实现。你可以把这段脚本加到构建后步骤里,或者在脚本控制台测试:
def build = currentBuild // 找到当前项目的Mailer配置 def mailer = build.project.getPublishersList().find { it instanceof hudson.tasks.Mailer } if (mailer && build.result == hudson.model.Result.FAILURE) { // 生成和Mailer插件一致的邮件主题和正文 def emailSubject = mailer.getSubject() ?: "Build failed: ${build.fullDisplayName}" def emailBody = """Build ${build.fullDisplayName} failed. Build URL: ${build.absoluteUrl} Recent Changes: ${build.changeSets.collect { cs -> cs.items.collect { change -> "- ${change.author.displayName}: ${change.msg}" }.join('\n') }.join('\n')}""" // 赋值给你需要的变量 String emailText = "Subject: ${emailSubject}\n\n${emailBody}" // 这里可以直接加你的自定义解析逻辑,比如打印、存储或调用外部接口 println("Captured email content:\n${emailText}") }
这个脚本生成的内容和Mailer插件实际发送的邮件几乎完全一致,不需要修改插件本身。
2. 通过Jenkins扩展点底层拦截邮件
如果需要更稳定的全局拦截,可以实现Mailer插件的扩展接口,在邮件发送前直接拿到完整文本。你可以把这段代码打包成小插件,或者放到Jenkins的init.groovy.d目录下:
import hudson.tasks.Mailer; import hudson.model.AbstractBuild; import hudson.model.TaskListener; import jenkins.model.Jenkins; public class CustomMailCapture extends Mailer.Resolver { @Override public String resolveBody(AbstractBuild<?, ?> build, TaskListener listener) { // 获取原始邮件正文 String originalBody = super.resolveBody(build, listener); // 拼接完整邮件文本(包含主题) String emailSubject = build.getDisplayName() + " - Build Failed"; String emailText = "Subject: " + emailSubject + "\n\n" + originalBody; // 这里做你的自定义解析,比如写入日志、存储到数据库等 listener.getLogger().println("Captured full email text:\n" + emailText); // 返回原始正文,不影响邮件正常发送 return originalBody; } } // 注册扩展 Jenkins.get().getExtensionList(Mailer.Resolver.class).add(new CustomMailCapture());
这种方法会全局生效,所有使用Mailer插件的项目发送失败邮件时,都会触发这段逻辑。
3. 用Shell/Batch脚本拼接邮件内容
如果不想碰代码,也可以利用Jenkins的环境变量,在构建失败后直接拼接出邮件内容:
# 仅在构建失败时执行 if [ "$BUILD_STATUS" = "FAILURE" ]; then SUBJECT="Build failed: ${JOB_NAME} #${BUILD_NUMBER}" BODY="Build URL: ${BUILD_URL}\n\nRecent Changes:\n$(git log --pretty=format:"%an - %s" HEAD~5..HEAD)" EMAIL_TEXT="Subject: ${SUBJECT}\n\n${BODY}" # 把内容写入文件,供后续自定义解析脚本读取 echo -e "${EMAIL_TEXT}" > /path/to/email_content.txt fi
这种方式简单粗暴,适合快速实现需求,不需要了解Jenkins的内部API。
如果你的初步尝试遇到了具体问题(比如脚本报错、内容不符合预期),可以把代码贴出来,我再帮你调整。
内容的提问来源于stack exchange,提问作者MackProgramsAlot
相关产品推荐
相关产品推荐

