python实现git代码更新后发送邮件通知

Posted xcfzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现git代码更新后发送邮件通知相关的知识,希望对你有一定的参考价值。

  当一个团队使用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(

)
    #更新者
    updater = detail[0].split(
)[1].replace(Author,Updater)
    #更新时间,去掉最后的更新次数信息
    update_time = detail[0].split(
)[-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‘domainusername
#密码,邮箱账号密码
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(

)
    #更新者
    updater = detail[0].split(
)[1].replace(Author,Updater)
    #更新时间,去掉最后的更新次数信息
    update_time = detail[0].split(
)[-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代码更新后发送邮件通知的主要内容,如果未能解决你的问题,请参考以下文章

python实现邮件的发送

如何利用python监控主机存活并邮件,短信通知

Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码

Jenkins+Gradle实现Android移动端自动打包+邮件发送通知

实现Python代码发送邮件

pyton 编写脚本检测两台主机之间的通信状态,异常邮件通知