頭條創(chuàng)作挑戰(zhàn)賽#
本文同步本人掘金平臺的文章:https://juejin.cn/post/7062327576395513887
上一篇,Jenkins Pipeline 結(jié)合 Gitlab 實現(xiàn) Node 項目自動構(gòu)建 我們已經(jīng)實現(xiàn)了自動構(gòu)建的功能。
在團隊合作中,項目在構(gòu)建異常「或成功」時候,需要郵件通知相關(guān)的人員,這就涉及到 Jenkins 郵件發(fā)送的功能了。
Email Extension 插件允許你配置郵件通知。通過此插件,你可以自定義郵件的發(fā)送人,接受者和發(fā)送的內(nèi)容。
Manage Jenkins -> Manage Plugins -> Available 。搜索 Email Extension 安裝
Manage Jenkins -> Configure System -> Extended E-mail Notification
第 1 點: Simple Mail Transfer Protocol (SMTP) 自己申請,如果不知道如何操作,請網(wǎng)上找答案。(應(yīng)該也許不難吧...)
第 2 點: 郵件默認的接收郵件地址。
使用Jenkins Pipeline 結(jié)合 Gitlab 實現(xiàn) Node 項目自動構(gòu)建的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'
}
}
}
// 添加的腳本內(nèi)容
post {
always {
emailext body: '${DEFAULT_CONTENT}',
subject: '${DEFAULT_SUBJECT}',
to: '${DEFAULT_RECIPIENTS}',
from: '${env.DEFAULT_FROM_EMAIL}'
}
}
}
復(fù)制代碼
這就很明顯了:默認發(fā)送郵箱,默認接收郵箱,默認的發(fā)送主題,默認的發(fā)送內(nèi)容。都是獲取我們上一步設(shè)定的值。效果如下:
構(gòu)建失?。?/p>
構(gòu)建成功:
對比上面的兩張圖,構(gòu)建失敗和構(gòu)建成功,的構(gòu)建結(jié)果字體竟然是不同的顏色,神奇...
如果你看上一節(jié)配置 Email Extension 參數(shù)中的截圖,你可能會留意到:
<h2><font color="${BUILD_STATUS}">構(gòu)建結(jié)果 - ${BUILD_STATUS}</font></h2>
復(fù)制代碼
color="${BUILD_STATUS}" 嗯,加上這個,不同狀態(tài)返回的構(gòu)建結(jié)果字體不同顏色了?我們帶動下構(gòu)建pipeline的always -> changed。觸發(fā)構(gòu)建信息由失敗 -> 成功,得到下面的結(jié)果:
看來是想多了啊,并不是不同的狀態(tài)不同顏色啊。不過,如果你不介意這個bug,可以使用...
發(fā)送郵件需要根據(jù)不同狀態(tài),使用特定的顏色區(qū)分。比如:成功 -> #27AE60 , 失敗 -> #E74C3C , 其他顏色 -> #F4E242
咦,這還不簡單?在默認的發(fā)送模版上添加判斷條件就行了。
然而,不支持,太慘了,得另辟蹊徑~(大霧)
經(jīng)過一番搜索,Groovy Template 能夠解決這個問題。
我們更改下 pipeline 腳本:
# ...
post {
always {
emailext body: '''${SCRIPT, template="my-email-template"}''',
subject: '${DEFAULT_SUBJECT}',
to: '${DEFAULT_RECIPIENTS}',
from: "${env.DEFAULT_FROM_EMAIL}"
}
}
# ...
復(fù)制代碼
我們構(gòu)建下。構(gòu)建是成功了,但是郵箱收到的卻是:
Groovy Template file [my-email-template] was not found in $JENKINS_HOME/email-templates.
復(fù)制代碼
郵件提示,機器中 $JENKINS_HOME/email-templates 下并不存在 my-email-template 模版。(笑哭)
沒有權(quán)限怎么辦呢?咱可以通過其他方法不?
再查找資料,咦,有了 - 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 : 輸入名稱和相關(guān)的內(nèi)容。請記住名稱,后續(xù)使用到。
因為截圖篇幅問題,這里的 Content 內(nèi)容并沒有截取完整,完整的內(nèi)容請戳Groovy_template.html,其中的關(guān)鍵代碼如下:
.tr-title {
background-color: <%=(build.result==null || build.result.toString()=='SUCCESS') ? '#27AE60' : build.result.toString()=='FAILURE' ? '#E74C3C' : '#F4E242' %>;
}
復(fù)制代碼
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}"
}
}
# ...
復(fù)制代碼
一切就緒,我們重新構(gòu)建。結(jié)果如下:
構(gòu)建狀態(tài) | 郵箱收到內(nèi)容截圖 |
成功 | |
失敗 | |
中止 |
嗯~效果不錯(撒花)完結(jié)
讀者有啥其他的方法呢,可以留言交流下。更多的內(nèi)容,請戳Jimmy Github Blog
文章被收錄于專欄:
相關(guān)課程
3
收藏
時候人不在電腦旁,程序運行中發(fā)生了問題,或者程序需要定期發(fā)送報告,此時發(fā)送電子郵件就是一個方便快捷的方案。python的內(nèi)置庫smtplib就具有發(fā)送電子郵件的功能,今天我們以QQ郵箱為例,發(fā)送一個帶附件的郵件給自己。
import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
#設(shè)置服務(wù)器所需信息
#qq郵箱服務(wù)器地址
mail_host='smtp.qq.com'
#qq號
mail_user='2*****5'
#QQ郵箱為授權(quán)碼)
mail_pass='n*****c'
#郵件發(fā)送方郵箱地址
sender='2*****5@qq.com'
#只發(fā)送一個人可以用字符串或列表,多于一個人用列表
receivers=['2*****5@qq.com']
#這表示可以發(fā)送帶附件的郵件
message=MIMEMultipart()
#設(shè)置email信息
#郵件主題
message['Subject']='郵件主題'
#發(fā)送方信息
message['From']=sender
#接受方信息
message['To']=receivers[0]
#郵件內(nèi)容設(shè)置
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"'
#將內(nèi)容和附件附在郵件上
message.attach(content)
message.attach(attachment1)
#發(fā)郵件成功后返回時間
send_time=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
#登錄并發(fā)送郵件
try:
smtpObj=smtplib.SMTP()
#連接到服務(wù)器
smtpObj.connect(mail_host,25)
#登錄到服務(wù)器
smtpObj.login(mail_user,mail_pass)
#發(fā)送
smtpObj.sendmail(
sender,receivers,message.as_string())
#退出
smtpObj.quit()
print(f'郵件已發(fā)送,發(fā)送時間為{send_time}')
except smtplib.SMTPException as e:
print('郵件發(fā)送出現(xiàn)了錯誤:',e,'請重試后發(fā)送') #打印錯誤信息
返回:郵件已發(fā)送,發(fā)送時間為2024-01-12 21:19:25
需要注意的是:
1、QQ郵箱的授權(quán)碼路徑:郵箱界面左上角的“設(shè)置”——“賬號”——“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù)”——“繼續(xù)獲取授權(quán)碼”,點開就行了。
2、做完第一條,會出現(xiàn)一個“短信驗證”,讓我們發(fā)短信,先不要發(fā)(浪費1毛錢?。?。點擊“選擇其他方式驗證”,然后出現(xiàn)接收驗證碼或用QQ密保,這兩個選一個用就行了。
引入依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置郵箱信息:
spring:
mail:
host: smtp.sina.com # 新浪郵箱
username: xxx@sina.com # 發(fā)件人郵箱地址
password: xxxxxxxxxxxx # 授權(quán)碼
protocol: smtp # SMTP 協(xié)議
default-encoding: UTF-8 # 編碼格式
properties:
mail:
debug: true # 開啟Debug模式,打印發(fā)送郵件的日志信息
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("純文本內(nèi)容的郵件");
message.setText("<h2>跳轉(zhuǎn)至Youtube</h2><a href=\"https://www.youtube.com\">https://www.youtube.com</a>");
mailSender.send(message);
log.info("郵件發(fā)送成功");
}
核心:使用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>跳轉(zhuǎn)至Youtube</h2><a href=\"https://www.youtube.com\">https://www.youtube.com</a>", true);
mailSender.send(mimeMessage);
log.info("郵件發(fā)送成功");
}
核心:使用MimeMessageHelper類,setText方法第二個參數(shù)必須為True,否則發(fā)送的是純文本。
@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>跳轉(zhuǎn)至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("郵件發(fā)送成功");
}
核心:
@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>跳轉(zhuǎn)至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("郵件發(fā)送成功");
}
核心:
按郵件內(nèi)容,可分為普通文本、HTML格式內(nèi)容、添加附件、內(nèi)嵌附件四種郵件。
上述已將完整代碼列出,記得一鍵三連^_^
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。