前言:
首先,要有一個用來發送的郵箱,首選網易!參考:http://www.cnblogs.com/EasonJim/p/6051636.html,這里我注冊了網易的免費企業郵箱。
並且我新建沒多個郵箱用來對應不同的Job。
技巧:
先確保郵箱的smtp功能能正常使用,現在jenkins機器上裝一個foxmail,確定能正常收發。
很多種情況郵箱類型很多,先用最簡單的網易郵箱配置好后,測試收發正常。待正常后再換成特定的企業郵箱來配置。
正題:
Jenkins發送郵件有幾種配置方式:
1、使用內置的郵件插進(使用全局的配置,只能有一個接收方)
2、使用郵件擴展插件【Email Extension Plugin】(使用全局的配置,能有多個接收方,但是只能有一個發送方)
3、使用郵件擴展插件【Email Extension Plugin】+Groovy腳本(實現每個Job對應不同的發送郵件,多個發送方)
4、開發郵件轉發中間件或者使用Foxmail這些工具來轉發(每個Job發送到對應的郵箱,然后中間件負責轉發到成員列表的郵箱。對發送插件沒什么要求,只要能發送即可)
5、走國際路線,使用【Googole網上論壇】即groups.google.com(通過邀請實現進入群組,然后jenkins只要發送郵件到這個群組油箱即可)
具體操作:
注意:操作涉及的郵箱為163免費企業郵箱
1、使用內置的郵件插進
【系統管理】->【系統設置】->【郵件通知】->【高級】,配置如下:
參照如上配置,勾選【通過發送測試郵件測試配置】進行發送配置。
如果出現“Failed to send out e-mail”,那么說明沒有配置好【系統管理員郵件地址】
配置【系統管理員郵件地址】時,要和SMTP認證的用戶名保持一致,不然無法發送。
上面的發送時有個小技巧,【顯示的名稱 <郵件地址>】(中間有個空格),這樣的形式發送后會在郵件提示窗口顯示郵件的別名。
最后,在Job頁面上增加【增加構建后操作步驟】->【E-mail Notification】,配置要接收人的郵箱,很顯然,這里只能寫一個人的地址,且配置單一。如果要發送到多人,可以嘗試上述第4點開發中間件實現。
2、使用郵件擴展插件
【系統管理】->【系統設置】->【Extended E-mail Notification】->【高級】,配置如下:
其余都留空,根據需要配置。
同樣,【Use SMTP Authentication】下的【User Name】也要和【系統管理員郵件地址】保持一致
配置【系統管理員郵件地址】時,要和SMTP認證的用戶名保持一致,不然無法發送。
最后,在Job頁面上增加【增加構建后操作步驟】->【Editable Email Notification】,配置要接收人的郵箱列表
很顯然,這里可以配置多個收件人,且配置點很多,包括構建點的觸發發送,都可選擇。
提示:觸發點一般時always,這樣發送的時候不管成功還是失敗都會有日志。
提示2:構建的日志一般附帶上去,這樣方便排查
3、使用郵件擴展插件+Groovy腳本
通過上面第2部的配置可以發現,郵件發送人只能配置一個,而且只能是全局的;那么要對應每個Job對應不同的發送人就需要用到Groovy腳本去實現。
通過研究郵件擴展插件【Email Extension Plugin】的源碼發現,其提供的接口無法實現在每個Job下動態設置臨時發送人,只能設置到全局的配置上面;如果設置到全局會有一個弊端,比如構建在同一個時間點發送郵件,那么可能存在零界點的情況導致發送人錯亂,不過一般構建不會搭建太多,所以也可忽視。
在Job的【Editable Email Notification】上,打開【Advanced Settings...】,在【Pre-send Script】(Pre-send表示在發送前的事件)上寫入設置郵件的Groovy腳本:
import jenkins.model.* import hudson.model.* import javax.mail.internet.InternetAddress //設置發送郵件的用戶名密碼 def username="project1@email.com" def password="123456" //寫入發送郵件的用戶名密碼到全局配置上,同時也可以設置smtp server這些選項;這里由於我采用統一的郵箱服務商,所以只需設置兩項 def descriptor1 = Jenkins.instance.getDescriptorByType(hudson.plugins.emailext.ExtendedEmailPublisherDescriptor.class) descriptor1.setSmtpAuthUsername(username) descriptor1.setSmtpAuthPassword(password) descriptor1.save() //寫入系統管理員郵件地址到全局配置上 def descriptor2 = Jenkins.instance.getDescriptorByType(hudson.tasks.Mailer.DescriptorImpl.class) descriptor2.setAdminAddress(String.format("JenkinsJobEmail <%s>",username)) descriptor2.save() //經過測試,這個是臨時設置發送人的系統管理員郵件地址,不然上面設置后,發送時還是不會發生改變 def email = new InternetAddress(String.format("JenkinsJobEmail <%s>", username)) msg.setFrom(email)
4、開發郵件轉發中間件(開發比較復雜,不建議使用)
每個Job發送到對應的郵箱,然后中間件負責轉發到成員列表的郵箱。
中間件可以是服務,進程,或者用pythone寫一個進程,運行在linux上,通過時間間隔獲取指定郵箱的郵件,有新郵件時,再進行轉發的特定的郵箱列表。