最近两个星期搞了搞Bugzilla 2.22,吃了些苦头,有些东西需要记一记。
1.安装
Bugzilla是基于Perl脚本的CGI程序,所以要安装Bugzilla要先安装Perl。数据库必须使用mysql,我用了5.0。
安装过程网上有很多帖子,不再说了。只不过网上很多文章都在mysql里建了bugs这个用户,其实不用。在2.22里,通过localconfig文件可以配置登录用户和密码,只要确保用户有权限创建并管理数据库就行。
运行checksetup.pl会创建数据库,如果按缺省条件,数据库的字符集是缺省字符集,会产生中文问题。其实解决这个问题很简单,我当初可花了很大力气。
2.数据库中文问题的解决方法
在运行checksetup安装完所有组件之后,就要你修改localconfig文件了。改好之后,打开bugzillaBugzillaDB.pm,找到_connect()方法,在“my $dbh = $pkg_module->new($user, $pass, $host, $dbname, $port, $sock);”的底下加上两行:
my $sqr = $dbh->prepare("set names gbk");
$sqr->execute();
这样返回的数据库连接就改成GBK编码的了。所有数据操作均调用此方法建立数据库连接,所以在创建库表和以后的数据库操作里,都不会有中文乱码问题。这个办法只限于2.22这个版本,其他版本不保证适用。
运气好准备充分的情况下,checksetup.pl最少也要运行两遍,运气不好就难说咯。
3.邮件配置及中文编码
我是在windows下构建Bugzilla的,所以没有SendMail组件,只能通过SMTP方式。这个在运行checksetup.pl时会有配置。在具体使用的时候,要修改BugzillaBugMail.pm脚本。找到MessageToMTA()方法,改成以下脚本。
sub MessageToMTA {
my ($msg) = (@_);
return if (Param('mail_delivery_method') eq "none");
my ($header, $body) = $msg =~ /(.*?n)n(.*)/s ? ($1, $2) : ('', $msg);
my $headers;
if (Param('utf8') and (!is_7bit_clean($header) or !is_7bit_clean($body))) {
($headers, $body) = encode_message($msg);
} else {
my @header_lines = split(/n/, $header);
$headers = new Mail::Header @header_lines, Modify => 0;
}
# Use trim to remove any whitespace (incl. newlines)
my $rcpt_to = trim($headers->get('to'));
use Net::SMTP;
my $smtp_server = '你的smtpserver';
my $smtp_user = '你的smtp登录帐号';
my $smtp_pass = '你的smtp登录密码';
my $encode_smtpuser = trim(encode_base64($smtp_user));
my $encode_smtppass = trim(encode_base64($smtp_pass));
my $smtp = Net::SMTP->new($smtp_server,Timeout => 60) ||
die 'Cannot connect to smtp server';
###中文处理begin
my @header;
my $now = time2str("%a, %e %b %H:%M:%S %Y %z", time());
push @header, "Date: $nown";
push @header, 'Content-Type: text/plain; charset="utf-8"'. "n";
my @new_msg;
{
use Encode;
no strict 'refs';
push @new_msg,decode("gb2312",$msg);
}
###中文处理end
my $result = $smtp->command('AUTH','LOGIN');
my $answer = $smtp->getline();
# 334 VXNlcm5hbWU6
$result = $smtp->command($encode_smtpuser);
$answer = $smtp->getline();
# 334 UGFzc3dvcmQ6
$result = $smtp->command($encode_smtppass);
$answer = $smtp->getline();
# 235 Authentication successful
# or 535 Authentication failed
if ($answer =~ /535/i)
{print "Sorry,Authentication failed!n";exit;}
$smtp->mail($smtp_user);
$smtp->to($rcpt_to);
$smtp->data();
$smtp->datasend(@header);
$smtp->datasend(@new_msg);
$smtp->datasend();
$smtp->dataend();
$smtp->quit;
}
其中,push @header, 'Content-Type: text/plain; charset="utf-8"'. "n"; 一句是将邮件设为UTF-8编码。而以下这部分代码是将邮件内容按照GB2312解码的。解码后的内容就可以用utf-8编码显示成中文了。这可是我所有方法试遍了才找出来了,汗迹斑斑血迹斑斑。
my @new_msg;
{
use Encode;
no strict 'refs';
push @new_msg,decode("gb2312",$msg);
}
Tips:
1.在运行checksetup.pl时,运气最好准备最充分的情况下也要执行两遍,要注意看窗口里的提示哦。
2.在checksetup.pl里设的管理员帐号与密码要记好,我就出现了一次找不到管理员帐号和密码的情况。其实在表profiles里第一个存着的就是管理员帐号,密码就解不出来了。
3.Bugzilla界面也太惨了点。想自己修饰,就改改E:bugzillaskinsstandardglobal.css吧。
4.本文没有提及的地方,一律使用缺省设置。