Centos

Bugzilla 錯誤:無法通過包“Net::SMTP::SSL”第 365 行定位對象方法退出

  • October 25, 2019

我在我的 CentOS 7 Web 伺服器 VPS 上安裝了 Bugzilla。安裝很順利,但是當我去設置電子郵件時,我收到了以下錯誤:

無法通過 Bugzilla/Config/Common.pm 第 365 行的包“Net::SMTP::SSL”找到對象方法“quit”。

如需幫助,請向網站管理員 (********) 發送郵件,提供此錯誤消息以及錯誤的時間和日期。

我將電子郵件配置設置為連接到 Office 365,這意味著:

SMTP 伺服器:smtp.office365.com:587 smtp_ssl:使用者名/密碼/mailfrom:我正在使用的電子郵件地址。

我查看了有問題的源文件 Config/Common.pm:

344
345 sub check_smtp_server {
346     my $host = shift;
347     my $port;
348
349     if ($host =~ /:/) {
350         ($host, $port) = split(/:/, $host, 2);
351         unless ($port && detaint_natural($port)) {
352             return "Invalid port. It must be an integer (typically 25, 465 or 587)";
353         }
354     }
355     trick_taint($host);
356     # Let's first try to connect using SSL. If this fails, we fall back to
357     # an unencrypted connection.
358     foreach my $method (['Net::SMTP::SSL', 465], ['Net::SMTP', 25]) {
359         my ($class, $default_port) = @$method;
360         next if $class eq 'Net::SMTP::SSL' && !Bugzilla->feature('smtp_ssl');
361         eval "require $class";
362         my $smtp = $class->new($host, Port => $port || $default_port, Timeout => 5);
363         if ($smtp) {
364             # The connection works!
365             $smtp->quit;
366             return '';
367         }
368     }
369     return "Cannot connect to $host" . ($port ? " using port $port" : "");
370 }
371

我推斷連接資訊是成功的,Bugzilla 只是試圖退出連接並返回,沒有錯誤。

我在網際網路上找到了這篇關於這個問題的文章。

Thorsten Schoning 先生說:

然後進一步調試:檢查您安裝的 Net::SMTP::SSL 的版本,如果“退出”方法可用等,請查看原始碼。您的 perl 中的某處應該有一個文件 Net/SMTP/SSL.pm安裝或安裝包的任何地方。如果您使用了 install-module.pl,請清空 bugzilla/lib 文件夾並使用您的包管理器再次安裝失去的包。

此外,請查看提到的 Bugzilla 程式碼行以了解 Bugzilla 的想法:它認為您有可用的 Net::SMTP::SSL,期望有可用的方法,但似乎缺少。您需要找到原因,因為根據我的理解,它應該可用。

好吧,我做了一個locateforSSL.pm並想出了:

[root@tkts-wtsc /]# locate SSL.pm
/usr/lib64/perl5/vendor_perl/Net/SSL.pm
/usr/share/perl5/vendor_perl/HTTP/Daemon/SSL.pm
/usr/share/perl5/vendor_perl/IO/Socket/SSL.pm
/usr/share/perl5/vendor_perl/Net/MQTT/Simple/SSL.pm
/usr/share/perl5/vendor_perl/Net/SMTP/SSL.pm
/usr/share/perl5/vendor_perl/Net/Server/Proto/SSL.pm
/usr/share/perl5/vendor_perl/Software/License/OpenSSL.pm

我查看了 的內容Net/SMTP/SSL.pm,但其中不包含任何子常式。然後我查看了內容/Net/SSL.pm並看到了子常式/方法,但沒有一個quit,而是quit一個SMTP命令,所以我對此並不感到驚訝。不確定 Schoning 先生的回答是否意味著什麼,但即使是 HIS 連結SSL.pm源也不包含quit方法。

我做了一個sudo yum install mod_ssl openssl在其他地方提到的,我得到了already installed and latest version, nothing to do

我做了一個sudo yum install perl-Net-SMTP-SSL並得到了Package perl-Net-SMTP-SSL-1.01-13.el7.noarch already installed and latest version。我安裝了所有軟體包並更新了所有內容。

這個問題是伺服器設置問題,而不是程式問題,因此我將這個問題放在這里而不是 SO。我只提到了源文件,因為錯誤提到了它,我想完整併提供所有細節。

我設置了關鍵文件夾的權限:

drwxr-x---  2 jmr-admin psacln   4096 Oct 17 08:33 Config
-rwxr-x---  1 jmr-admin psacln  13547 Oct 16 16:55 Config.pm

並且文件夾中的所有項目Config都與以下內容相同:

-rwxr-x---  1 jmr-admin psacln 16836 Oct 16 16:55 Common.pm

現在我正在寫這個問題,我認為問題不是權限,因為perl找到了SMTP模組,更不用說SSL模組,成功地進行了測試並嘗試quit連接,而 perl 找不到quit方法。

我確實打開Onsmtp_debug選項,但我沒有其他詳細資訊。

我找到了這個參考,很多很好的資訊,比如在 SMTP 伺服器欄位中包含埠,我最初忘記了。可悲的是,這個參考並沒有解決我的問題。值得一提的是,我還嘗試了我的 gmail 帳戶,因為本文引用了 Gmail。這樣,我就可以像在這個頁面上一樣輸入資訊。我複制並粘貼了資訊。我得到了同樣的錯誤,立即沒有延遲。這有點奇怪,因為我預計 Gmail 或 Office 365 會出現輕微延遲,但無論如何。

更新

我仍在尋找並遇到這篇文章。結果sesstatus -bSELinux status: disabled。這可能是另一個問題,但與我無法發送電子郵件無關。如果有的話,這對於故障排除是一件好事。無論如何,我發現有這樣的事情/var/log/httpd/error_log。該文件的內容是(每次嘗試都會重複):

[Thu Oct 17 09:17:22 2019] editparams.cgi: *******************************************************************
[Thu Oct 17 09:17:22 2019] editparams.cgi:   at Bugzilla/Config/Common.pm line 362.
[Thu Oct 17 09:17:22 2019] editparams.cgi: Can't locate object method "quit" via package "Net::SMTP::SSL" at Bugzilla/Config/Common.pm line 365.
[Thu Oct 17 09:23:07 2019] editparams.cgi: Odd number of elements in hash assignment at /usr/share/perl5/vendor_perl/IO/Socket/IP.pm line 336.
[Thu Oct 17 09:23:07 2019] editparams.cgi: *******************************************************************
[Thu Oct 17 09:23:07 2019] editparams.cgi:  Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
[Thu Oct 17 09:23:07 2019] editparams.cgi:  is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
[Thu Oct 17 09:23:07 2019] editparams.cgi:  possibly with SSL_ca_file|SSL_ca_path for verification.
[Thu Oct 17 09:23:07 2019] editparams.cgi:  If you really don't want to verify the certificate and keep the
[Thu Oct 17 09:23:07 2019] editparams.cgi:  connection open to Man-In-The-Middle attacks please set
[Thu Oct 17 09:23:07 2019] editparams.cgi:  SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
[Thu Oct 17 09:23:07 2019] editparams.cgi: *******************************************************************
[Thu Oct 17 09:23:07 2019] editparams.cgi:   at Bugzilla/Config/Common.pm line 362.
[Thu Oct 17 09:23:07 2019] editparams.cgi: Can't locate object method "quit" via package "Net::SMTP::SSL" at Bugzilla/Config/Common.pm line 365.
~

此日誌顯示我還有另一項任務是修復已棄用的CentOS設置並限制Main-In-The-Middle攻擊,但這似乎與我的退出方法不存在問題無關。我必須再研究一下。

真正的錯誤是第 362 行。這可能應該返回 null / false 以指示錯誤。我敢打賭,如果第 362 行真的成功了,那麼這個quit方法就會存在。可悲的是,我這個環境不在 Visual Studio 下,我可以在其中設置斷點並查看內容。我處於伺服器管理員模式,所以…

my $smtp = $class->new($host, Port => $port || $default_port, Timeout => 5);

好的,我找到了這篇文章,它幫助我解決了SSL_VERIFY_NONE警告。我打開了/usr/share/perl5/vendor_perl/IO/Socket/SSL.pm一個vi命令,:set number然後發出命令,/DEFAULT_SSL_ARGS將我帶到第 35 行。然後我在第 49 行從 更改SSL_verify_mode => SSL_VERIFY_NONE,SSL_verify_mode => SSL_VERIFY_PEER,。然後我保存了我的更改並退出。我再次嘗試了我的電子郵件設置並且好多了。

[root@tkts-wtsc Config]# vi /var/log/httpd/error_log
[root@tkts-wtsc Config]#
[Thu Oct 17 09:23:07 2019] editparams.cgi:  possibly with SSL_ca_file|SSL_ca_path for verification.
[Thu Oct 17 09:23:07 2019] editparams.cgi:  If you really don't want to verify the certificate and keep the
[Thu Oct 17 09:23:07 2019] editparams.cgi:  connection open to Man-In-The-Middle attacks please set
[Thu Oct 17 09:23:07 2019] editparams.cgi:  SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
[Thu Oct 17 09:23:07 2019] editparams.cgi: *******************************************************************
[Thu Oct 17 09:23:07 2019] editparams.cgi:   at Bugzilla/Config/Common.pm line 362.
[Thu Oct 17 09:23:07 2019] editparams.cgi: Can't locate object method "quit" via package "Net::SMTP::SSL" at Bugzilla/Config/Common.pm line 365.
[Thu Oct 17 11:19:04 2019] editparams.cgi: Odd number of elements in hash assignment at /usr/share/perl5/vendor_perl/IO/Socket/IP.pm line 336.
[Thu Oct 17 11:19:04 2019] editparams.cgi: Can't locate object method "quit" via package "Net::SMTP::SSL" at Bugzilla/Config/Common.pm line 365.
~

我只剩下 2 行了。有趣的是,我不再收到關於第 362 行的投訴。嗯。

如果有人好奇,這裡是第IP.pm336 行的程式碼:

[root@tkts-wtsc Config]# vi /usr/share/perl5/vendor_perl/IO/Socket/IP.pm
[root@tkts-wtsc Config]#
325
326 As a special case, if the constructor is passed a single argument (as
327 opposed to an even-sized list of key/value pairs), it is taken to be the value
328 of the C<PeerAddr> parameter. This is parsed in the same way, according to the
329 behaviour given in the C<PeerHost> AND C<LocalHost> PARSING section below.
330
331 =cut
332
333 sub new
334 {
335    my $class = shift;
336    my %arg = (@_ == 1) ? (PeerHost => $_[0]) : @_;
337    return $class->SUPER::new(%arg);
338 }
339

(抱歉這個問題很長,更像是我在做筆記,但我希望其他人可以從所有這些資訊和我使用的方法中受益。那裡幾乎沒有任何東西,如果我遇到這個錯誤,其他人也會.)

無論如何,我該如何解決這個問題?

Schoning 先生的回答沒有錯,並且確實使我找到了解決方案。基本上,對於特定錯誤,我只是沒有在以下連結中看到(很可能理解)最後一個響應,作者說他必須執行以下命令。我執行了命令並立即通過電子郵件立即成功。

連結到其他有問題的客戶

感謝使用 ‘cpan upgrade Net::SMTP::SSL’ 命令解決

對於其他人,以及可能的未來我,我會解釋事情。

然而,在此之前,即使 Bugzilla 工作正常(UI 很好,添加使用者、項目等的能力都很好),./testserver.pl 腳本仍然無法讀取 padlock.png。

功能請求

  1. 沒有“主題”支持。灰色很單調。此外,升級應該更簡單。
  2. 我可以想像自動更新或按下按鈕更新軟體,就像 Plesk。

寫上去

對事情的進展存在誤解,即使我最初遵循官方的 Bugzilla 文件,我後來也這樣做了,但文件仍然不完整,不適用於我的環境。此外,本地配置文件 ,./localconfig缺少使用者欄位,而不僅僅是要使用的組。

在繼續之前,這是我的環境:

  • CentOS 7 在 VPS 中執行 Plesk Obsidian(Media Temple 稱之為“DV”)

HTTPD configuration文件顯示 HTTPD的/etc/httpd/httpd.conf使用者和組都是“apache”。這也是 Bugzilla 文件所說的在./localconfig文件中使用的內容!可悲的是,這是錯誤的。正確答案是"psacln"針對小組的。解決這個問題的最好方法是創建一個新的臨時子域並查看預設文件的所有者和組。就我而言,答案是“jmr-admin:psacln”。放置psacln在 Bugzilla 配置文件中處理了組策略。這意味著 apache 的兩個變化是:

# If you set this to anything other than "", you will need to run checksetup.pl
# as root or as a user who is a member of the specified group.
$webservergroup = 'psacln';

# If set to 1, checksetup.pl will set file permissions so that Bugzilla
# works in a SuexecUserGroup environment.
$use_suexec = 1;

重新執行後,我不得不手動將使用者從“root”更改為“jmr-admin” ./checksetup.pl

沒有直接更改/etc/httpd/httpd.conf。任何平台上的任何人都不應該在那裡進行更改,因為該文件被覆蓋。如果有的話,創建一個自定義配置文件並放在/etc/httpd/conf.d/目錄中。httpd 配置文件,httpd.conf自動讀取這個目錄。對於我的情況,添加一些東西是錯誤的並且搞砸了。正確的做法是以下兩件事之一:

1)(最好的方法):添加一個.htaccess文件並將內容設置為:

#CGI
DirectoryIndex index.cgi
AddHandler cgi-script .cgi
AddHandler cgi-script .pl
Options +ExecCGI
#
  1. 在 Plesk 內部編輯域(或在我的情況下為子域)環境,即:

$$ domain $$> Apache & nginx Settings>

  • 處理程序:輸入自定義值

cgi腳本 .cgi cgi腳本 .pl

  • 索引文件:輸入自定義值(保留預設值)

注意:使用它會忽略“ Options +ExecCGI”,儘管這似乎沒有必要。

驗證 CGI 的最佳方法是創建一個全新的測試子域並將 cgi 腳本放在根目錄中,例如 my testcgi2.cgi.

#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';

1;

如果對 Apache 的更改沒問題,那麼腳本將顯示此格式化文本,沒有程式碼:

你好字!這是我的第一個 CGI 程序

然後我將文件從下載的壓縮文件複製到子域。您可能必須將額外密鑰文件的權限設置為 755。

我確實必須按照 CentOS 7 和 Bugzilla 文件中的說明執行 yum 命令。

我必須執行那個額外的腳本才能讓 SMTP 正常工作,這樣我就不會因為缺少退出方法而煩惱。

我確實看過原始的 Bugzilla 文件,起初認為中文會更容易閱讀。至少我曾經在電視上看過迷你係列幕府將軍,雖然那是日本的。我聯繫了我的網路主機提供商,他們給了我 Bugzilla CentOS 7 指南的連結。

這是不完整的,因為它沒有討論權限或 Plesk 或我說需要做的任何更改。Bugzilla 文件,經過幾天的磨難,現在不像中文了,更像英文了,但仍然無法完成工作。讓我的網路託管服務提供商最初進行更改可能會很好,這樣我就可以看到該網站可以啟動,但是由於缺乏解釋和我目前的知識,下次我執行該網站時,一切都注定會很快無法正常工作./checksetup.pl腳本。

我認為這涵蓋了一切。無論如何,我仍然不是專家,但希望我的文章有所幫助。

這個問題已經進入了支持郵件列表,所以為了完整起見,我在這裡添加了我的答案,但建議在那裡討論其他所有內容:

https://groups.google.com/d/msg/mozilla.support.bugzilla/ctvU6urNN0s/oj90IeduEAAJ

無法通過 Bugzilla/Config/Common.pm 第 365 行的包“Net::SMTP::SSL”找到對象方法“quit”。

在我看來,你有兩個不同的問題,這個和 Office365。查看您在 StackExchange 上鍊接的過去的執行緒:

https://support-bugzilla.mozilla.narkive.com/ULqK5oBb/error-while-smtp-setup

多位作者回答說重新安裝 Perl 模組後問題就消失了。根據我的經驗,您的第一個問題確實來自缺少依賴項,例如 openssl-dev 等。

因此,如果您使用 install-module.pl 安裝 Perl 依賴項,請清空 Bugzilla 的 lib 文件夾並使用您的發行版的包管理器重新安裝依賴項。這些最有可能提供與 SSL 相關的附加依賴項。如果東西真的只有 CPAN 對您可用,那麼 install-module.pl 只是最後一步。在這種情況下,您可能需要手動使用包管理器來完成其他依賴項,例如 openssl-dev。

我查看了 Net/SMTP/SSL.pm 的內容,但其中不包含任何子常式。

因為東西是在編譯時自動導入的,所以你不會找到名字本身。但我有點確定,在一個工作設置中,你真的最終會得到“退出”。當然,我應該在過去更清楚地說明這一點。下面的程式碼很重要:

no strict 'refs';
foreach ( keys %Net::SMTP:: ) {
   next unless (ref(\$Net::SMTP::{$_}) eq "GLOB" && defined(*{$Net::SMTP::{$_}}{CODE}))
             || ref(\$Net::SMTP::{$_}) eq "REF";
   *{$_} = \&{"Net::SMTP::$_"};
}

https://fastapi.metacpan.org/source/RJBS/Net-SMTP-SSL-1.03/lib/Net/SMTP/SSL.pm

然後我查看了 /Net/SSL.pm 的內容並看到了子常式/方法,但它們都沒有退出,但是退出是一個 SMTP 命令,所以我對此並不感到驚訝。

Net::SMTP 包含“退出”,而不是 Net::SSL 並且由上述程式碼導入:

quit() 向遠端 SMTP 伺服器發送 QUIT 命令並關閉套接字連接。

https://perldoc.perl.org/Net/SMTP.html

我將電子郵件配置設置為連接到 Office 365,這意味著:

Office 365 目前不工作 OOB,支持郵件列表中充滿了有關此主題的執行緒:

https://bugzilla.mozilla.org/show_bug.cgi?id=1182445 https://groups.google.com/d/msg/mozilla.support.bugzilla/xFqK7S3h25g/6KI4Fg1NAAAJ https://groups.google.com/d/msg/mozilla.support.bugzilla/xFqK7S3h25g/JF52kHGWEQAJ

您只能選擇您喜歡的眾多解決方法中的哪一個,或者根本不使用 Office 365。我不喜歡盡可能多地自定義 Bugzilla,因此更喜歡一些本地 sendmail 或類似的處理將郵件轉發到 Office 365。但這最終取決於你。

SMTP 伺服器:smtp.office365.com:587 smtp_ssl:開啟

我有點確定 smtp_ssl 真的是 SSL,而不是 Office 365 所要求的 TLS,所以即使 Bugzilla 支持 365,這個配置也很可能不起作用。

我聯繫了我的網路託管服務提供商 Media Temple,他們非常不專業,甚至拒絕考慮提供幫助。

除了您的第一條錯誤消息的 SSL 依賴項之外,它們也無濟於事。對 Office 365 的支持需要由 Bugzilla 實施或使用其他一些本地 MTA 解決。

引用自:https://unix.stackexchange.com/questions/547324