Bugzilla 错误:无法通过包“Net::SMTP::SSL”找到对象方法退出第 365 行

Bugzilla 错误:无法通过包“Net::SMTP::SSL”找到对象方法退出第 365 行

我在我的 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,但 thenquit是一个SMTP命令,所以我对此并不感到惊讶。不确定 Schoning 先生的回应是否意味着什么,但即使是他的链接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方法。

我确实打开了On这个smtp_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.
~

我只剩下两行了。有趣的是,我不再收到有关第 362 行的投诉。嗯。

IP.pm如果有人好奇,下面是第 336 行的代码:

[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

(很抱歉这个长问题,更像是我记笔记,但我希望其他人可以从所有这些信息和我使用的方法中受益。实际上什么都没有,如果我遇到这个错误,其他人也会.)

无论如何,那么我该如何解决这个问题呢?

答案1

这个问题已进入支持邮件列表,因此为了完整性,我在此处添加我的答案,但建议在那里讨论其他所有内容:

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 包含“quit”,而不是 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 来解决。

答案2

Schoning先生的回答并没有错,并且确实引导我找到了解决方案。基本上,对于特定错误,我只是没有看到(很可能理解)以下链接中的最后一个响应,作者说他必须运行以下命令。我执行了命令,很快,电子邮件立即成功。

关联给其他有问题的客户

感谢使用“cpan升级Net::SMTP::SSL”命令解决了

对于其他人,以及对于未来可能的我,我会解释一些事情。

然而,在此之前,即使 Bugzilla 可以工作(UI 很好,添加用户、项目等的能力都很好),./testserver.pl 脚本仍然失败,无法读取 padlock.png。

功能请求

  1. 没有“主题”支持。灰色是单调的。此外,升级应该更简单。
  2. 我可以想象自动更新或按下按钮更新软件,就像 Plesk 一样。

写上去

对于事情的进展存在误解,即使我最初遵循了 Bugzilla 官方文档(后来我也这样做了),该文档仍然不完整并且不适用于我的环境。此外,本地配置文件./localconfig缺少用户字段,而不仅仅是要使用的组。

在继续之前,这是我的环境:

  • CentOS 7 在 VPS 中运行 Plesk Obsidian(Media Temple 称之为“DV”)

文件表明 HTTPD 的用户和组都是“apache” HTTPD configuration/etc/httpd/httpd.conf这也是 Bugzilla 文档所说的在./localconfig文件中使用的内容!可悲的是,这是错误的。正确答案是"psacln"针对团体的。解决这个问题的最佳方法是创建一个新的临时子域并查看默认文件的所有者和组。就我而言,答案是“jmr-admin:psacln”。放入psaclnBugzilla 配置文件中可以处理组策略。这意味着 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
#

2) 在 Plesk 内部编辑域(或我的情况下的子域)环境,即:[domain] Apache & nginx Settings>>

  • 处理程序:输入自定义值

    cgi 脚本 .cgi cgi 脚本 .pl

  • 索引文件:输入自定义值(保留默认值)

注意:使用它可以省略“ Options +ExecCGI”,尽管这似乎没有必要。

验证CGI的最好方法是创建一个全新的测试子域并在根目录中放置一个cgi脚本,例如我的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脚本。

我认为这涵盖了一切。无论如何,我仍然不是专家,但希望我的文章有所帮助。

相关内容