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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:32:27