svn post-commit hook应用之自动群发邮件

Posted by c4pr1c3 on November 16, 2010

在小团队应用开发时,我们喜欢在每次有用户commit更改时,自动通过SMTP发送邮件的方式来通知所有的开发人员。在没有自己实际动手配置这个应用时,我的第一反应就是通过svn的post-commit机制来实现,所以一直觉得应该是一个easy job

But…

实际动手后发现,有bug

不管是通过Google,还是百度,你如果以”svn post commit smtp“或其他类似关键字搜索解决方案,大致分为以下几种方法:

  1. 基于mailer.py
  2. 基于svnnotify
  3. 基于sendmail

其中,svnnotify方法用到的发送邮件脚本是Perl写的。OK,pick this one!

以下以Ubuntu 10.04(Lucid)为例,记录一下我的成功配置过程

1. 安装svn-notify

$ sudo apt-get install libsvn-notify-perl  libnet-smtpauth-perl

2. svn-notify脚本bug修正

默认情况下,需要修改/usr/share/perl5/SVN/Notify.pm中的如下代码:
my $smtp = $smtp_class->new(
        $notifier->{smtp},
        ( $notifier->{verbose} > 1 ? ( Debug => 1 ) : ())
    ) or die "Unable to create $smtp_class object: $!";

其中

$notifier->{verbose} > 1

改为

$notifier->{verbose}

以上修改的主要目的是为了在调试Net::SMTP_auth时能够正确的打印调试信息,普通用户也可不修改。

3. 配置post-commit脚本

将/path/to/your/svn/hooks/post-commit.tmpl拷贝重命名为post-commit,并设置其为可执行权限,编辑替换post-commit最后一行为以下代码:

/usr/bin/svnnotify --repos-path "$REPOS" \
	--revision $REV \
	-f "from_mail_addr" \
	-t "user1@oo.com, user2@xx.com" \
	--smtp "smtp.yy.com" \
	--smtp-user "authorized_user@yy.com" \
	--smtp-pass "smtp_password" \
	--smtp-authtype "LOGIN PLAIN"

上面代码中最重要的参数是–smtp-authtype,默认情况下,Net::SMTP_auth会使用PLAIN作为smtp认证的方法。

但通过实际调试跟踪程序执行过程我发现,以163.com邮箱为例,如果使用Net::SMTP_auth默认的认证方法就会在调试模式下打印以下错误代码:

Net::SMTP_auth=GLOB(0x9c37f28)>>> AUTH PLAIN
Net::SMTP_auth=GLOB(0x9c37f28)<<< 550 Óû§±»Ëø¶¨

所以,正确填写这个参数就很重要了。

后记:作为一个程序员,无论何时何地,我们都不应该“眼高手低”。想法在没有实现、验证以前,it is just an idea! 实践出真知!