在小团队应用开发时,我们喜欢在每次有用户commit更改时,自动通过SMTP发送邮件的方式来通知所有的开发人员。在没有自己实际动手配置这个应用时,我的第一反应就是通过svn的post-commit机制来实现,所以一直觉得应该是一个easy job。
But…
实际动手后发现,有bug!
不管是通过Google,还是百度,你如果以”svn post commit smtp“或其他类似关键字搜索解决方案,大致分为以下几种方法:
- 基于mailer.py
- 基于svnnotify
- 基于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! 实践出真知!