工作繁忙,这几天项目的合作者有个要求,就是合作的svn仓库提交后能够自动用邮件通知所有参与的人。这个应该很成熟了。google之,发现一些很常用的方式。比如使用commit-email.pl,关于使用commit-email.pl网上有一堆文章,就不重复了。使用commit-email有乱码解决方案如下
使用commit-email,需要在post-commit 中加入一句
LANG=zh_CN.GB18030
export LANG
这句话能够解决发送邮件的时候log 日志 乱码问题,如果你是其他地区语言,可以参考类似的方式尝试修改解决。
如果是修改内容发生了乱码,可以修改
push(@head, "Content-Type: text/plain; charset=UTF-8\n");
为
push(@head, "Content-Type: text/plain; charset=zh_CN.UTF-8\n");
我就是通过上述方式解决了乱码问题,致命的是,公司的邮箱服务器直接就拦截了我的sendmail,所有邮件全部拦截进了垃圾分类。而客户端无法看到。
没办法,只有自己鼓捣。
svn在完成后,可以调用钩子执行脚本,直接用公司的邮箱帐户名密码不就能够解决发送拦截问了么。
一番搜索后找到了msmtp + mutt ,linux下命令行客户端。
具体实现如下
安装mutt和msmtp
sudo apt-get install mutt
sudo apt-get install msmtp
装完客户端
然后配置msmtp ,在/etc目录下创建msmtprc 这是配置文件
写入
account default
#你的smtp地址
host smtp.xxx.com
port 25
#你的邮箱讯息
from [email protected]
auth login
tls off
user xxxx
password xxxx
#自己修改日志路径
logfile /home/svn/maillog
然后修改Mutt的配置文件 一般是/etc/Muttrc,在最后追加
set sendmail="/usr/bin/msmtp"
set use_from=yes
set realname="[email protected]"
set editor="vim"
至此应该就能够发送邮件,如果不能肯定是你哪里配置错掉了。
测试邮件发送
echo ‘hello‘ | mutt -s ‘test‘ 你的邮箱
看看能不能在邮箱收到邮件
接下来就是脚本了
我的脚本异常简洁,只能说能用
在仓库的hooks下创建文件
touch mailNotify
chmod +x mailNotify
vim mailNotify
然后加入以下代码,这段代码完成后你可以直接用./ 跑跑看,能跑通应该也能发mail了
#!/bin/bash
#用法 mailNotify svn仓库路径 svn版本号 Email地址1 Email地址2 ...
#这段是用来保证log中文的正确性的,你可以根据你的语言做相应的修改
export LC_CTYPE="zh_CN.GB18030"
#修改/usr/bin/svnlook到你实际svnlook路径
SVNLOOK=/usr/bin/svnlook
#修改mutt到你实际mutt的安装位置
MUTT=/usr/bin/mutt
context=$($SVNLOOK info $1 -r $2) #打印svn的更新信息
shift
shift
#将联系人串成一串儿
email=$1
shift
while(($#;0))
do
email=$email,$1
shift
done
#调用mutt发送邮件
echo $context | $MUTT -s ‘SVN Update‘ $email
接下来就是修改post-commit了,这个脚本是被自动调用的,它能够自动在更新后调用执行
cp post-commit.tmpl post-commit
chmod +x post-commit
然后注释掉里边的执行代码,放入我们的执行代码,注意不要注释掉REPOS和REV两个变量
加入这些话
#mailNotify路径用绝对路径
/home/svn/repository/smartHome/hooks/mailNotify ${REPOS} ${REV} xxx@xxx.com xxx@bbb.com
后边可以更很多邮箱,加多少应该都没问题。
然后你可以尝试update一个版本看看会不会有邮件发出来。
至此应该完成了,有问题可以在留言提出。
也可以访问我的blog网站 http://xifengzui.com