Bugzillaエラー:行365から出てくる「Net :: SMTP :: SSL」パッケージを介してオブジェクトメソッドが見つかりません。

Bugzillaエラー:行365から出てくる「Net :: SMTP :: SSL」パッケージを介してオブジェクトメソッドが見つかりません。

CentOS 7 WebサーバーVPSにBugzillaをインストールしました。インストールは順調に行われましたが、電子メールを設定しようとしたところ、次のエラーが発生しました。

Bugzilla/Config/Common.pm 行 365 の 'Net::SMTP::SSL' パッケージを介して 'quit' オブジェクト メソッドが見つかりません。

サポートが必要な場合は、サイト管理者(********)にこのエラーメッセージとエラーの発生日時を電子メールで送信してください。

Office 365に接続するように電子メール構成を設定しました。これは次のことを意味します。

SMTPサーバー:smtp.office365.com:587 smtp_ssl:ユーザー名/パスワード/mailfrom:使用しているEメールアドレス。

問題のソースファイル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のバージョンを確認し、ソースコードに利用可能な "exit"メソッドがあることを確認してください。 Perl または何らかの方法でパッケージがインストールされている場所には、Net/SMTP/SSL.pm ファイルがインストールされている必要があります。 install-module.plを使用した場合は、bugzilla / libフォルダを空にし、パッケージマネージャを使用して不足しているパッケージを再インストールしてください。

また、上記のBugzillaコード行を見て、Bugzillaが何を考えているのかを確認してください。 Net::SMTP::SSL を使用できると考え、使用可能なメソッドが必要ですが、そのメソッドが欠落しているようです。私が理解したところによると、可能でなければならないので、その理由を見つけなければなりません。

まあ、私はlocateforを作成してSSL.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あまり驚かなかった。 Schoning氏の答えがどういう意味なのかはわかりませんが、彼のリンクされたソースにも方法が含まれていません。quitSMTPSSL.pmquit

私は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 -bはですSELinux 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_ARGS35行に移動しました。その後、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.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という2つの異なる問題があるようです。 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" が含まれており、上記のコードでインポートされます。

quit() QUIT コマンドをリモート SMTP サーバーに送信し、ソケット接続を閉じます。

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 をカスタマイズするのがあまり好きではなく、メールを Office 365 に転送するためにローカルの sendmail などを好みます。しかし、それは最終的にあなた次第です。

SMTPサーバー:smtp.office365.com:587 smtp_ssl:開く

私はsmtp_sslが実際にSSLであり、Office 365が要求するTLSではないと確信しています。したがって、Bugzillaが365をサポートしていても、この構成は機能しない可能性があります。

WebホスティングプロバイダであるMedia Templeに連絡しましたが、彼らは非常に非専門的であり、助けを与えることを考慮すら拒否しました。

最初のエラーメッセージのSSL依存関係を除いて、とにかく実際には役に立ちません。 Office 365のサポートは、Bugzillaで実装するか、別の既定のMTAを使用して解決する必要があります。

おすすめ記事