1. 程式人生 > >python實現git代碼更新後發送郵件通知

python實現git代碼更新後發送郵件通知

username date time 無法 pri save cati urn .proto 客戶

  當一個團隊使用git進行開發時,一旦代碼更新就需要通知團隊成員。現在利用git的鉤子文件以及python寫的腳本自動去幫我們做成這件事。

  git的鉤子文件分為服務器(遠端倉庫)鉤子文件和客戶端(本地)鉤子文件,進行腳本編寫時要區分好不同端所用的鉤子文件。編寫錯誤會導致郵件無法發送,

  一般來講,只編寫服務端的鉤子文件,服務端鉤子文件主要有三種:

    pre-receiver: 處理來自客戶端的推送操作時,首先執行的鉤子文件

    update: 與pre-receiver類似,會為每一個被推送的分支各運行一次

    post-receiver:整個過程完結以後運行,可以用來更新其他系統服務或者通知用戶

  服務端代碼更新完後,最後啟動的是post-receiver,因此我們來編寫它的腳本文件:

    1.進入git倉庫下的hooks裏面,新建名為post-receiver的shell腳本文件,向其中寫入:

#!/bin/sh
#一定要編寫這句話,清除GIT自己設置的根目錄,否則無法正常執行下一句
unset GIT_DIR
#用python2執行py文件,就是cmd命令,需要指定py文件的絕對路徑
python D:/testemail/hooks/send.py

    2.send.py文件中的代碼:

      郵箱服務器一般支持POP3 SMTP IMAP,另外還有Exchange。前三種需要進入郵箱查找服務器名稱以及設置授權碼。下方代碼是選取了SMTP服務器發送郵件。

# coding:utf-8

import smtplib as sm
from email.mime.text import MIMEText
from subprocess import check_output

#發送郵箱的smtp服務器
mail_host = smtp.163.com
#發送郵箱
sender = ‘xxxxxx@163.com
#發送郵箱的smtp的授權碼(非郵箱的登陸密碼)
password = ‘xxxxxxxx
#接收者郵箱
receiver = ‘xxxxx1,xxxxxx2
#郵箱主題
subject = Code Update Notification
def Info(): ‘‘‘ 該函數主要用來獲取最近一次更新記錄,並提取主要信息: author date comment ‘‘‘ #使用subprocess的check_output函數來捕獲git命令後的 #標準輸出,以獲取最近一次更新記錄,該記錄是一個字符串 log = check_output([git,log,-l,-p]) #對字符串進行分割,以獲取相關信息author date comment detail = log.split(\n\n) #更新者 updater = detail[0].split(\n)[1].replace(Author,Updater) #更新時間,去掉最後的更新次數信息 update_time = detail[0].split(\n)[-1].replace(Date,Update time)[0:-6] #註釋,並去掉左右兩邊空格 try: comment = Comment:+detail[1].strip() except: comment =Comment: +"Sorry,the updater didn‘t comment." return (updater,update_time,comment) def Format(updater,update_time,comment): ‘‘‘ 排版信息 ‘‘‘ msg = """ <h6 style=‘color:red‘>Hi,buddy!</h6> <h6 style=‘color:red;text-indent:2em‘> The code has been updated,the following is details: </h6> <h6 style=‘color:red;text-indent:4em‘>{0}</h6> <h6 style=‘color:red;text-indent:4em‘>{1}</h6> <h6 style=‘color:red;text-indent:4em‘>{2}</h6> <h6 style=‘color:red;text-indent:2em‘>If any question,please contact the updater</h6> """.format(updater,update_time,comment) msg = MIMEText(msg,html,utf-8) return msg def send_email(msg): ‘‘‘ 發送郵件 ‘‘‘ msg[From] = sender msg[To] = receiver msg[Subject] = subject smtpObj = sm.SMTP(mail_host) smtpObj.login(sender,password) smtpObj.sendmail(sender,receiver.split(,),msg.as_string()) smtpObj.quit() if __name__ ==__main__: updater,update_time,comment = Info() msg = Format(updater,update_time,comment) send_email(msg)

      Exchange協議發送郵件send.py:

#coding:utf-8
from exchangelib import DELEGATE,Account,Credentials,Configuration,NTLM,Message
from exchangelib import Mailbox,HTMLBody
from exchangelib.protocol import BaseProtocol,NoVerifyHTTPAdapter
from subprocess import check_output
import sys

#python2下面需要操作這一步,將默認編碼ASCII修改成UTF-8,改善對中文的處理
reload(sys)
sys.setdefaultencoding(utf-8)

#郵箱主題
subject = Code Update Notification
#郵箱
account = [email protected]
#接收者列表
reciever = [‘xxxxx01,‘xxxx02]
#域賬號:域名\用戶名(不是郵箱賬號)
username = r‘domain\username
#密碼,郵箱賬號密碼
password = ‘xxxxxx

def Info():
    ‘‘‘
    該函數主要用來獲取最近一次更新記錄,並提取主要信息:
    author
    date
    comment
    ‘‘‘
    #使用subprocess的check_output函數來捕獲git命令後的
    #標準輸出,以獲取最近一次更新記錄,該記錄是一個字符串
    log = check_output([git,log,-l,-p]).decode()

    #對字符串進行分割,以獲取相關信息author date comment
    detail = log.split(\n\n)
    #更新者
    updater = detail[0].split(\n)[1].replace(Author,Updater)
    #更新時間,去掉最後的更新次數信息
    update_time = detail[0].split(\n)[-1].replace(Date,Update time)[0:-6]
    #註釋,並去掉左右兩邊空格
    try:
        comment = Comment:+detail[1].strip()
    except:
        comment =Comment: +"Sorry,the updater didn‘t comment."
    return (updater,update_time,comment)

def Format(updater,update_time,comment):
    ‘‘‘
    排版信息
    ‘‘‘
    msg = """
            <h6 style=‘color:red‘>Hi,buddy!</h6>
            <h6 style=‘color:red;text-indent:2em‘>
            The code has been updated,the following is details:
            </h6>
            <h6 style=‘color:red;text-indent:4em‘>{0}</h6>
            <h6 style=‘color:red;text-indent:4em‘>{1}</h6>
            <h6 style=‘color:red;text-indent:4em‘>{2}</h6>
            <h6 style=‘color:red;text-indent:2em‘>If any question,please contact the updater</h6>
            """.format(updater,update_time,comment) 
    return msg

def send_email(msg):
    ‘‘‘
        發送郵件
    ‘‘‘
    #用來消除SSL證書錯誤,
    BaseProtocol.http_ADAPTER_CLS = NoVerifyHTTPAdapter

    credential = Credentials(username,password)


    act = Account(primary_smtp_address=account,credentials=credential,autodiscover=True,access_type=DELEGATE)

    mail = Message(
        account = act,
        subject = subject,
        body=HTMLBody(msg),
        to_recipients = [Mailbox(email_address=i) for i in reciever]
        )
    
    mail.send_and_save()

if __name__ == __main__:
    updater,update_time,comment = Info()
    msg = Format(updater,update_time,comment)
    send_email(msg)

  

python實現git代碼更新後發送郵件通知