如何在Java中创建存储逗号分隔邮箱列表的环境变量以用于Jenkins邮件?
嘿,这个需求我之前做CI/CD流程的时候刚好碰到过,给你梳理几个实用的实现思路,分Java代码内部处理和结合Jenkins任务的场景来说:
一、在Java程序中传递邮箱列表(两种实用方式)
方式1:设置JVM系统属性(适合程序内部直接用,或Jenkins后续步骤读取)
Java里直接修改系统环境变量有一定局限性,但可以通过System.setProperty设置JVM进程内的属性,不管是程序自己发邮件,还是让Jenkins读取都很方便:
// 假设你已经生成了逗号分隔的邮箱列表 String emailRecipients = "alice@company.com,bob@company.com,charlie@company.com"; // 设置JVM系统属性,后续可随时读取 System.setProperty("BUILD_NOTIFY_EMAILS", emailRecipients); // 可选:打印到控制台,方便Jenkins捕获(后面会用到) System.out.println("BUILD_NOTIFY_EMAILS=" + emailRecipients);
方式2:直接输出格式化字符串(专门给Jenkins捕获用)
如果你的Java程序不需要自己发邮件,只是要把邮箱列表传递给Jenkins,直接在控制台打印特定格式的内容就行,不用设置属性:
// 生成邮箱列表后直接打印固定格式的行 String emailList = "dave@company.com,eva@company.com"; System.out.printf("NOTIFY_RECIPIENTS=%s%n", emailList);
二、结合Jenkins完成邮件发送
场景1:用Jenkins邮件插件发送(推荐,符合CI/CD流程)
如果你的Java程序运行在Jenkins构建任务里,可以通过脚本捕获程序输出的邮箱列表,设置为Jenkins环境变量,再用邮件插件发送:
用Jenkins Pipeline的示例代码:
pipeline { agent any stages { stage('Run Java App') { steps { script { // 运行Java程序并捕获控制台输出 def appOutput = sh(script: 'java -jar your-application.jar', returnStdout: true).trim() // 提取邮箱列表(匹配我们之前打印的格式) def emailMatch = appOutput =~ /NOTIFY_RECIPIENTS=(.*)/ if (emailMatch.matches()) { // 设置为Jenkins环境变量 env.RECIPIENT_EMAILS = emailMatch[0][1] } } } } stage('Send Notification Email') { steps { // 使用Email Extension插件发送邮件 emailext ( to: env.RECIPIENT_EMAILS, subject: '构建完成通知:${JOB_NAME} #${BUILD_NUMBER}', body: '<p>你的构建任务已完成,详情请查看:<a href="${BUILD_URL}">${BUILD_URL}</a></p>' ) } } } }
场景2:Java程序直接发邮件(不依赖Jenkins插件)
如果不想依赖Jenkins的邮件功能,也可以在Java程序里直接调用JavaMail API发送,从之前设置的JVM属性里读取邮箱列表:
import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class BuildEmailSender { public static void main(String[] args) { // 从JVM属性读取邮箱列表 String emailList = System.getProperty("BUILD_NOTIFY_EMAILS"); if (emailList == null || emailList.isBlank()) { System.err.println("未找到收件人邮箱列表"); return; } String[] recipients = emailList.split(","); // 配置SMTP服务器(根据你的实际环境修改) Properties smtpProps = new Properties(); smtpProps.put("mail.smtp.host", "smtp.company.com"); smtpProps.put("mail.smtp.port", "587"); smtpProps.put("mail.smtp.auth", "true"); smtpProps.put("mail.smtp.starttls.enable", "true"); // 发件人账号信息 String senderEmail = "build-notifier@company.com"; String senderPassword = "your-smtp-password"; // 创建邮件会话 Session mailSession = Session.getInstance(smtpProps, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(senderEmail, senderPassword); } }); try { // 构建邮件内容 Message message = new MimeMessage(mailSession); message.setFrom(new InternetAddress(senderEmail)); // 设置收件人 InternetAddress[] recipientAddresses = new InternetAddress[recipients.length]; for (int i = 0; i < recipients.length; i++) { recipientAddresses[i] = new InternetAddress(recipients[i].trim()); } message.setRecipients(Message.RecipientType.TO, recipientAddresses); message.setSubject("构建完成通知:你的任务已执行完毕"); message.setText("这是来自Java程序的自动通知,你的构建任务已成功完成。"); // 发送邮件 Transport.send(message); System.out.println("邮件发送成功!"); } catch (MessagingException e) { e.printStackTrace(); System.err.println("邮件发送失败:" + e.getMessage()); } } }
几个小提示
- 不管哪种方式,记得对邮箱列表做格式校验,比如去掉每个邮箱前后的空格,避免发送失败
- 如果是企业内部环境,SMTP服务器可能需要配置代理或使用内部认证方式,根据实际情况调整
- Jenkins里如果用自由风格任务,也可以用
EnvInject Plugin来注入捕获到的邮箱环境变量
内容的提问来源于stack exchange,提问作者jacinth joy
相关产品推荐
相关产品推荐

