头条创作挑战赛#
本文同步本人掘金平台的文章:https://juejin.cn/post/7062327576395513887
上一篇,Jenkins Pipeline 结合 Gitlab 实现 Node 项目自动构建 我们已经实现了自动构建的功能。
在团队合作中,项目在构建异常「或成功」时候,需要邮件通知相关的人员,这就涉及到 Jenkins 邮件发送的功能了。
Email Extension 插件允许你配置邮件通知。通过此插件,你可以自定义邮件的发送人,接受者和发送的内容。
Manage Jenkins -> Manage Plugins -> Available 。搜索 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类
@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("邮件发送成功");
}
核心:
@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("邮件发送成功");
}
核心:
按邮件内容,可分为普通文本、HTML格式内容、添加附件、内嵌附件四种邮件。
上述已将完整代码列出,记得一键三连^_^
*请认真填写需求信息,我们会在24小时内与您取得联系。