本文源于http://cranesss.gjjblog.com/archives/884277/
但原文有錯誤,并且密碼為明文不安全,對其做了修改,適用版本:2.25,主要方法是修改BugMail.pm并做SMTP的測試,請確保你的server能夠連通smtp郵件服務器
具體做法:
一、安裝好bugzilla(具體如何安裝,見其他相關文檔)
二,測試第三方郵件服務器SMTP發送郵件:
具體方法是,使用telnet,以smtp.163.com為例,其他請參考以下鏈接:
http://search.csdn.net/c/blog.csdn.net/cjjky/archive/2007/02/23/1513083.aspx
假設帳號是test@163.com,密碼為test,
1)root下使用perl -MMIME::Base64 -e 'print encode_base64("test")',把test換成實際的用戶名或密碼,記下返回的字串(這里是dGVzdA==),不同的smtp server,有的要求用戶名是@前的(比如test),有的要求是全部(比如test@163.com),可以參考郵件提供商關于outlook等smtp客戶端的設置.
2) telnet smtp.163.com 25 #25為163郵箱的smtp服務端口
Trying 202.108.5.83...
Connected to smtp.163.com.
Escape character is '^]'.
220 163.com Anti-spam GT for Coremail System (163com[071018])
EHLO smtp.163.com
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
AUTH LOGIN
334 dXNlcm5hbWU6
dGVzdA== #使用步聚1,得到的用戶名字符串
334 UGFzc3dvcmQ6
dGVzdA== #使用步聚1,得到的密碼字符串
235 Authentication successful
MAIL FROM:<test@163.com> # FROM選項,<>里的必須是現在用的郵件名
250 Mail OK
RCPT TO:<test@163.com> #TO 選項,發給誰
250 Mail OK
DATA #準備填充郵件體
354 End data with <CR><LF>.<CR><LF> #按<回車>.<回車>結束
TO: test@163.com
FROM: test@163.com
SUBJECT: test by telnet/smtp
test, just a test.
.
250 Mail OK queued as smtp10,wKjADQ2ApxRnnqBE0CWaEw==.38326S3
NOOP
250 OK
QUIT
221 Closing connection. Good bye.
Connection closed by foreign host.
看有沒有收到郵件,若測試成功,說明smtp server可以使用,記下perl生成的用戶名和密碼的字串,下方我稱之為用戶名密文,密碼密文
三、修改$Bugzilla_DIR/Bugzilla/BugMail.pm,做如下修改:
增加新的郵件發送方法:
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 = 'smtp.163.com';
my $smtp_user = 'test@163.com'; #這里用戶名是全的
my $encode_smtpuser ='dGVzdA=='; #用戶名密文
my $encode_smtppass = 'dGVzdA=='; #密碼密文,用密文比明文enconde安全
my $smtp = Net::SMTP->new($smtp_server,Timeout => 60) ||
die 'Cannot connect to smtp server';
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($msg);
$smtp->dataend();
$smtp->quit;
}
這個方法與原來的方法重名,所以需要將原來的方法注釋掉或者修改成另外一個名字,這樣就能使用這個新的方法發送郵件了。
注意黑體部分,將他們替換成你自己的相應的數值。這是將所需參數寫死在這里,就不能在配置界面進行配置了,如果需要再次修改這些參數,需要直接修改這個文件。而設置界面中的關于郵件發送方式的設置(sendmail/smtp/qmail..等)將不起作用了。