Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
頭條創作挑戰賽#
本文同步本人掘金平臺的文章: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}'
}
}
}
復制代碼
這就很明顯了:默認發送郵箱,默認接收郵箱,默認的發送主題,默認的發送內容。都是獲取我們上一步設定的值。效果如下:
構建失?。?/p>
構建成功:
對比上面的兩張圖,構建失敗和構建成功,的構建結果字體竟然是不同的顏色,神奇...
如果你看上一節配置 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小時內與您取得聯系。