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を使用して解決する必要があります。

答え2

Schoning氏の答えは間違っていなかったし、私を解決策に導いた。デフォルトでは、特定のエラーに対して、作成者が次のコマンドを実行する必要があると述べた下のリンクの最後の応答を確認できませんでした。私はコマンドを実行し、すぐに電子メールがすぐに成功しました。

協会気になる他のお客様へ

問題を解決するために、「cpanアップグレードNet::SMTP::SSL」コマンドを使用していただきありがとうございます。

他の人と将来の私のためにいくつかのことを説明します。

しかし、それまではBugzillaが動作していても(UIが優れており、ユーザー、プロジェクトなどを追加する機能)、./testserver.plスクリプトはまだ失敗し、padlock.pngを読み取ることができません。

機能要求

  1. 「テーマ」のサポートはありません。グレーは退屈です。また、アップグレードもより簡単になるはずです。
  2. Pleskのようにボタンを1つだけ押すと、自動アップデートまたはソフトウェアアップデートを想像できます。

書く

物事がどのように進行しているかについて誤解があり、最初は公式のBugzilla文書に従ったにもかかわらず(後でそうしました)、文書はまだ不完全であり、私の環境には適用できませんでした。また、ローカルプロファイルには./localconfig使用するグループだけでなく、ユーザーフィールドもありません。

続行する前に、私の環境は次のとおりです。

  • VPSでPlesk Obsidianを実行するCentOS 7(Media Templeでは「DV」と呼ばれる)

この文書には、HTTPDユーザーとグループの両方が「apache」と記載されていますHTTPD configuration/etc/httpd/httpd.confこれはまた、Bugzillaドキュメントで./localconfigファイルに使用するように言うことです!残念ながら、これは間違っています。正解は"psacln"グループ用です。この問題を解決する最善の方法は、新しい一時サブドメインを作成し、基本ファイルの所有者とグループを表示することです。私の場合、答えは "jmr-admin:psacln"でした。psaclnグループポリシーはBugzilla設定ファイルに配置することで処理できます。これは、Apacheへの2つの変更が次のようになることを意味します。

 # 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自動的にこのディレクトリを読み込みます。私の場合、何かを追加するのは間違っており、状況はめちゃくちゃになりました。必要な正しいことは、次の2つのうちの1つです。

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プログラムです。

その後、ダウンロードしたzipファイルのファイルをサブドメインにコピーしました。追加の鍵ファイルの権限を 755 に設定する必要があります。

CentOS 7およびBugzillaのドキュメントに示すようにyumコマンドを実行する必要がありました。

シャットダウン方法が欠落している迷惑な問題が発生しないように、SMTPが正しく機能するようにするには、追加のスクリプトを実行する必要があります。

私は元のBugzilla文書を見て、最初は中国語が読みやすくなると思いました。少なくともショーグーン(Shogun)ミニシリーズをテレビで見ました。たとえ日本語でしたが。 Webホスティングプロバイダに連絡したところ、Bugzilla CentOS 7ガイドへのリンクが提供されました。

これはPleskや私が言う変更や権限については議論しないので不完全です。数日間の苦痛の終わりに、Bugzillaの文書は現在中国語ではなく英語に似ているように見えますが、それでも作業は完了していません。サイトのオープンを見るために、当初はWebホスティングプロバイダに変更を依頼するのが良いかもしれませんが、説明の欠如と現在の知識の欠如のために、次のサイトの運営にはすべてがっかりしました。正しく機能できません。./checksetup.plスクリプト。

私はそれがすべてを扱っていると思います。とにかくまだ専門家ではありませんが、私の記事が役立つことを願っています。

関連情報