整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Jenkins 邮件发送「可修改模版」

Jenkins 邮件发送「可修改模版」

头条创作挑战赛#

本文同步本人掘金平台的文章:https://juejin.cn/post/7062327576395513887

上一篇,Jenkins Pipeline 结合 Gitlab 实现 Node 项目自动构建 我们已经实现了自动构建的功能。

在团队合作中,项目在构建异常「或成功」时候,需要邮件通知相关的人员,这就涉及到 Jenkins 邮件发送的功能了。

安装 Email Extension

Email Extension 插件允许你配置邮件通知。通过此插件,你可以自定义邮件的发送人,接受者和发送的内容。

Manage Jenkins -> Manage Plugins -> Available 。搜索 Email Extension 安装

配置 Email Extension 参数

Manage Jenkins -> Configure System -> Extended E-mail Notification

第 1 点: Simple Mail Transfer Protocol (SMTP) 自己申请,如果不知道如何操作,请网上找答案。(应该也许不难吧...)

第 2 点: 邮件默认的接收邮件地址。

构建脚本

使用Jenkins Pipeline 结合 Gitlab 实现 Node 项目自动构建的Jenkinsfile脚本补充下。

pipeline {
    agent any
    
    tools { 
        nodejs "nodejs" 
    }
    
    stages {
        stage('Dependency') {
            steps {
                sh 'npm install'
            }
        }
        stage('Build') { 
            steps {
                sh 'npm run clean' 
                sh 'npm run build' 
            }
        }
    }
    
    // 添加的脚本内容
    post {
        always {
            emailext body: '${DEFAULT_CONTENT}',
                subject: '${DEFAULT_SUBJECT}',
                to: '${DEFAULT_RECIPIENTS}',
                from: '${env.DEFAULT_FROM_EMAIL}'
        }
    }
}

复制代码

这就很明显了:默认发送邮箱,默认接收邮箱,默认的发送主题,默认的发送内容。都是获取我们上一步设定的值。效果如下:

构建失败:

构建成功:

对比上面的两张图,构建失败和构建成功,的构建结果字体竟然是不同的颜色,神奇...

如果你看上一节配置 Email Extension 参数中的截图,你可能会留意到:

<h2><font color="${BUILD_STATUS}">构建结果 - ${BUILD_STATUS}</font></h2>
复制代码

color="${BUILD_STATUS}" 嗯,加上这个,不同状态返回的构建结果字体不同颜色了?我们带动下构建pipeline的always -> changed。触发构建信息由失败 -> 成功,得到下面的结果:

看来是想多了啊,并不是不同的状态不同颜色啊。不过,如果你不介意这个bug,可以使用...

升级下需求

发送邮件需要根据不同状态,使用特定的颜色区分。比如:成功 -> #27AE60 , 失败 -> #E74C3C , 其他颜色 -> #F4E242

咦,这还不简单?在默认的发送模版上添加判断条件就行了。

然而,不支持,太惨了,得另辟蹊径~(大雾)

经过一番搜索,Groovy Template 能够解决这个问题。

我们更改下 pipeline 脚本:

# ...
post {
    always {
        emailext body: '''${SCRIPT, template="my-email-template"}''',
            subject: '${DEFAULT_SUBJECT}',
            to: '${DEFAULT_RECIPIENTS}',
            from: "${env.DEFAULT_FROM_EMAIL}"
    }
}
# ...
复制代码

我们构建下。构建是成功了,但是邮箱收到的却是:

Groovy Template file [my-email-template] was not found in $JENKINS_HOME/email-templates.
复制代码

邮件提示,机器中 $JENKINS_HOME/email-templates 下并不存在 my-email-template 模版。(笑哭)

没有权限怎么办呢?咱可以通过其他方法不?

再查找资料,咦,有了 - Email Extension Plugin is not loading groovy template added via Config File Provider Plugin。通过配置文件解决,我们来见证下:

步骤 1 : 到 jenkins 平台上操作,Manage Jenkins -> Managed Files

步骤 2 : 点击 Add a new Config

步骤 3 : 点选类型 Extended Email Publisher Groovy Template, 点击 Submit 按钮提交

步骤 4 : 输入名称和相关的内容。请记住名称,后续使用到。

因为截图篇幅问题,这里的 Content 内容并没有截取完整,完整的内容请戳Groovy_template.html,其中的关键代码如下:

  .tr-title {
    background-color: <%=(build.result==null || build.result.toString()=='SUCCESS') ? '#27AE60' : build.result.toString()=='FAILURE' ? '#E74C3C' : '#F4E242' %>;
  }
复制代码

Groovy 官方完整模版请见官方模版Groovy Email Template

扎心了啊,老铁(尬笑)

步骤 5 : 修正你的 pipeline 文件,请确保你输入和正确的名字"managed:Groovy Email Template"。

# ...
post {
    changed {
        emailext body: '''${SCRIPT, template="managed:Groovy Email Template"}''',
            subject: '${DEFAULT_SUBJECT}',
            to: '${DEFAULT_RECIPIENTS}',
            from: "${env.DEFAULT_FROM_EMAIL}"
    }
}
# ...
复制代码

一切就绪,我们重新构建。结果如下:

构建状态

邮箱收到内容截图

成功

失败

中止

嗯~效果不错(撒花)完结

读者有啥其他的方法呢,可以留言交流下。更多的内容,请戳Jimmy Github Blog

文章被收录于专栏:

相关课程

3

收藏

时候人不在电脑旁,程序运行中发生了问题,或者程序需要定期发送报告,此时发送电子邮件就是一个方便快捷的方案。python的内置库smtplib就具有发送电子邮件的功能,今天我们以QQ邮箱为例,发送一个带附件的邮件给自己。

import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

#设置服务器所需信息
#qq邮箱服务器地址
mail_host='smtp.qq.com'  
#qq号
mail_user='2*****5'  
#QQ邮箱为授权码) 
mail_pass='n*****c'   
#邮件发送方邮箱地址
sender='2*****5@qq.com'  
#只发送一个人可以用字符串或列表,多于一个人用列表
receivers=['2*****5@qq.com']

#这表示可以发送带附件的邮件
message=MIMEMultipart()
#设置email信息
#邮件主题       
message['Subject']='邮件主题' 
#发送方信息
message['From']=sender 
#接受方信息     
message['To']=receivers[0]  

#邮件内容设置
content=MIMEText("这是一个测试邮件", 'html', 'utf-8')
#附件的路径
with open('abc.csv','r',encoding='gbk' ,errors='ignore') as f:
    attachment=f.read()
attachment1=MIMEText(attachment)
attachment1['Content-Disposition']='attachment;filename="abc.csv"'
#将内容和附件附在邮件上
message.attach(content)
message.attach(attachment1)

#发邮件成功后返回时间
send_time=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
#登录并发送邮件
try:
    smtpObj=smtplib.SMTP() 
    #连接到服务器
    smtpObj.connect(mail_host,25)
    #登录到服务器
    smtpObj.login(mail_user,mail_pass) 
    #发送
    smtpObj.sendmail(
        sender,receivers,message.as_string()) 
    #退出
    smtpObj.quit() 
    print(f'邮件已发送,发送时间为{send_time}')
except smtplib.SMTPException as e:
    print('邮件发送出现了错误:',e,'请重试后发送') #打印错误信息

返回:邮件已发送,发送时间为2024-01-12 21:19:25

需要注意的是:

1、QQ邮箱的授权码路径:邮箱界面左上角的“设置”——“账号”——“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”——“继续获取授权码”,点开就行了。

2、做完第一条,会出现一个“短信验证”,让我们发短信,先不要发(浪费1毛钱啊)。点击“选择其他方式验证”,然后出现接收验证码或用QQ密保,这两个选一个用就行了。

目配置

引入依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

配置邮箱信息:

spring:
  mail:
    host: smtp.sina.com           # 新浪邮箱
    username: xxx@sina.com				# 发件人邮箱地址
    password: xxxxxxxxxxxx    # 授权码
    protocol: smtp              # SMTP 协议
    default-encoding: UTF-8     # 编码格式
    properties:
      mail:
        debug: true               # 开启Debug模式,打印发送邮件的日志信息
        smtp:
          auth: true
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory
          ssl:
            enable: true
            checkServerIdentity:
              enable: true
          starttls:
            enable: true

发送纯文本邮件

@Value("${spring.mail.username}")
 private String username;

@Test
void sendTextEmail(@Autowired JavaMailSender mailSender) {
  SimpleMailMessage message=new SimpleMailMessage();

  message.setFrom(username);
  message.setTo("ijunfv@gmail.com");
  message.setSubject("纯文本内容的邮件");
  message.setText("<h2>跳转至Youtube</h2><a href=\"https://www.youtube.com\">https://www.youtube.com</a>");

  mailSender.send(message);
  log.info("邮件发送成功");
}

核心:使用SimpleMailMessage类

发送HTML格式的邮件

@Test
void sendHtmlEmail(@Autowired JavaMailSender mailSender) throws MessagingException {

  MimeMessage mimeMessage=mailSender.createMimeMessage();

  MimeMessageHelper messageHelper=new MimeMessageHelper(mimeMessage, false);
  messageHelper.setFrom(username);
  messageHelper.setTo("ijunfv@gmail.com");
  messageHelper.setSubject("HTML格式的邮件");
  messageHelper.setText("<h2>跳转至Youtube</h2><a href=\"https://www.youtube.com\">https://www.youtube.com</a>", true);

  mailSender.send(mimeMessage);
  log.info("邮件发送成功");
}

核心:使用MimeMessageHelper类,setText方法第二个参数必须为True,否则发送的是纯文本。

发送包含附件的邮件

@Test
void send(@Autowired JavaMailSender mailSender) throws MessagingException {
  MimeMessage mimeMessage=mailSender.createMimeMessage();

  MimeMessageHelper messageHelper=new MimeMessageHelper(mimeMessage, true);
  messageHelper.setFrom(username);
  messageHelper.setTo("ijunfv@gmail.com");
  messageHelper.setSubject("包含附件的邮件");
  messageHelper.setText("<h2>跳转至Youtube</h2><a href=\"https://www.youtube.com\">https://www.youtube.com</a>", true);

  messageHelper.addAttachment("6.png", new File("D:\\Images\\logo_200x200 (6).png"));
  messageHelper.addAttachment("12.png", new File("D:\\Images\\logo_200x200 (12).png"));

  mailSender.send(mimeMessage);
  log.info("邮件发送成功");
}

核心:

  1. 创建MimeMessageHelper对象时,第二个参数必须为true,否则不能发送包含附件的邮件
  2. 使用addAttachment方法添加附件

发送内嵌附件的邮件

@Test
void sendInlineResourceEmail(@Autowired JavaMailSender mailSender) throws MessagingException {

  MimeMessage mimeMessage=mailSender.createMimeMessage();

  MimeMessageHelper messageHelper=new MimeMessageHelper(mimeMessage, true);
  messageHelper.setFrom(username);
  messageHelper.setTo("ijunfv@gmail.com");
  messageHelper.setSubject("包含附件的邮件");

  String rscId="dhjsjd9889";
  messageHelper.setText("<h2>跳转至Youtube</h2><a href=\"https://www.youtube.com\"><img src='cid:"+rscId+"' /></a>", true);
  messageHelper.addInline(rscId, new File("D:\\Images\\logo_200x200 (6).png"));

  mailSender.send(mimeMessage);

  log.info("邮件发送成功");
}

核心:

  1. 创建具有唯一性的ID作为附件标识,比如rscId
  2. 使用addInline添加附件
  3. 在邮件内容中通过cid:rscId插入附件

小结

按邮件内容,可分为普通文本、HTML格式内容、添加附件、内嵌附件四种邮件。

上述已将完整代码列出,记得一键三连^_^