web-dev-qa-db-ja.com

Bugzillaエラー:パッケージ「Net :: SMTP :: SSL」の365行目で終了するオブジェクトメソッドが見つかりません

CentOS 7WebサーバーVPSにBugzillaをインストールしました。インストールはスムーズに進みましたが、メールを設定しようとすると、次のエラーが発生しました。

Bugzilla/Config /Common.pmの365行目にあるパッケージ「Net :: SMTP :: SSL」を介してオブジェクトメソッド「quit」を見つけることができません。

ヘルプが必要な場合は、このエラーメッセージとエラーの日時を記載したメールをウェブマスター(********)に送信してください。

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

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は単に接続を終了して戻り、エラーは発生しなかったということです。

この問題に関するインターネット上の記事 this を見つけました。

ThorstenSchoning氏は次のように述べています。

次に、さらにデバッグします。インストールされているNet :: SMTP :: SSLのバージョンを確認し、「quit」メソッドが使用できるかどうかなど、ソースを確認します。PerlのどこかにNet/SMTP /SSL.pmファイルがあるはずです。インストールまたはどこでも、どのようにパッケージをインストールします。 install-module.plを使用した場合は、bugzilla/libフォルダーを空にし、パッケージマネージャーを使用して不足しているパッケージを再度インストールします。

さらに、Bugzillaコードの上記の行を見て、Bugzillaが何を考えているかを確認します。Net:: SMTP :: SSLが使用可能であると見なし、使用可能なメソッドを予期しているため、欠落しているようです。私の理解からそれが利用可能であるはずなので、あなたは理由を見つける必要があります。

さて、私はSSL.pmに対してlocateを実行し、次のことを思いつきました。

[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ではありませんでしたが、quitSMTPコマンドであるため、そうではありません。そこに驚いた。 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

この質問を書いているので、問題は権限ではないと思います。PerlSMTPモジュールは言うまでもなく、SSLモジュールを見つけ、テストに成功し、 Perlがquitメソッドを見つけられなかったときに、接続をquitしようとしていました。

I DID Onsmtp_debugオプションをオンにしますが、追加の詳細はありません。

this 参照、SMTPサーバーフィールドにポートを含めるなど、最初は忘れていた多くの有益な情報が見つかりました。悲しいことに、この参照は私の問題を解決しませんでした。この記事ではGmailについて言及しているので、その価値については、Gmailアカウントも試してみました。そうすれば、このページのように正確に情報を入力することができます。情報をコピーして貼り付けました。すぐに同じエラーが発生しました。 GmailまたはOffice365のいずれかからわずかな遅延が予想されたので、それは少し奇妙でした。

[〜#〜]更新[〜#〜]

私はまだ探していて、 this の記事に出くわしました。 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攻撃を制限する別のサイドタスクがあることを示していますが、それは私のquitメソッドの存在しない問題と密接な関係があるようには見えません。私はそれをもう少し研究しなければなりません。

実際のエラーは362行目です。エラーを示すためにおそらくnull/falseが返されるはずです。 362行目が本当に成功したとしたら、quitメソッドが存在するはずです。残念ながら、この環境はVisual Studioの下になく、ブレークポイントを設定してコンテンツを表示できます。私はサーバー管理モードになっているので...

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

さて、 this の記事を見つけました。これは、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行目についての苦情がもうないことです。うーん。

興味のある方は、336行目のIP.pmのコードをご覧ください。

[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

(長い質問については申し訳ありませんが、私がメモを取っているようですが、他の人がこのすべての情報と私が使用した方法論から利益を得ることができることを願っています。そこには事実上何もありません。このバグに遭遇した場合、他の人もそうします。)

とにかく、どうすれば問題を解決できますか?

3

Schoning氏の答えは間違いではなく、私を解決策に導きました。基本的に、特定のエラーについては、次のリンクで最後の応答が表示されませんでした(おそらく理解できません)。作成者は、次のコマンドを実行する必要があると述べました。コマンドとプレストを実行し、メールですぐに成功しました。

リンク 問題のある他のお客様へ

'cpan upgrade Net :: SMTP :: SSL'コマンドを使用して解決された感謝

他の人のために、そしてそのことについては将来の私のために、私は物事を説明します。

ただし、それ以前は、Bugzillaは機能しますが(UIは問題なく、ユーザーやプロジェクトなどを追加する機能はすべて問題ありません)、。/ testserver.plスクリプトはpadlock.pngを読み取ることができずに失敗します。

機能リクエスト

  1. 「テーマ」のサポートはありません。灰色はくすんでいます。また、アップグレードはもっと簡単なはずです。
  2. 自動更新か、押すとPleskのようにソフトウェアを更新するボタンのどちらかを想像できます。

書き込み

状況がどのように悪化したかについて誤解があり、後で行った公式のBugzillaドキュメントに従ったとしても、ドキュメントはまだ不完全であり、私の環境には適用できませんでした。また、ローカル構成ファイル./localconfigには、使用するグループだけでなく、ユーザーのフィールドがありません。

続行する前に、ここに私の環境があります:

  • VPSでPleskObsidianを実行しているCentOS7(Media Templeが「DV」と呼んでいるもの)

HTTPD configurationファイル/etc/httpd/httpd.confは、HTTPDのユーザーとグループが両方とも「Apache」であることを示しました。これは、Bugzillaドキュメントが./localconfigファイルでも使用すると言っていることです。悲しいことに、それは間違っています。正解はグループの"psacln"です。それを理解する最良の方法は、新しい一時サブドメインを作成し、デフォルトファイルの所有者とグループを確認することです。私の場合、答えは「jmr-admin:psacln」です。 Bugzilla構成ファイルにpsaclnを配置すると、グループポリシーが処理されます。つまり、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;

./checksetup.plを再実行した後、ユーザーを「root」から「jmr-admin」に手動で変更する必要がありました。

/etc/httpd/httpd.confへの直接の変更はありません。そのファイルは上書きされるため、どのプラットフォームの誰もそこで変更を加えるべきではありません。どちらかといえば、カスタム構成ファイルを作成し、/etc/httpd/conf.d/ディレクトリに配置します。 httpd設定ファイルhttpd.confは、このディレクトリを自動的に読み取ります。私の場合、そこに何かを追加するIS間違っていて、物事を台無しにしました。正しいことは、次の2つのいずれかです。

1)(最善の方法):.htaccessファイルを追加し、内容を次のように設定します。

#CGI
DirectoryIndex index.cgi
AddHandler cgi-script .cgi
AddHandler cgi-script .pl
Options +ExecCGI
#

2)ドメイン(または私の場合はサブドメイン)環境のPlesk編集内、つまり[ドメイン]> Apache & nginx Settings>

  • ハンドラー:カスタム値を入力します

    cgi-script .cgi cgi-script .pl

  • インデックスファイル:カスタム値を入力します(デフォルト値のままにします)

注:これを使用すると、「Options +ExecCGI」は省略されますが、必須ではないようです。

CGIを確認する最良の方法は、新しいテストサブドメインを作成し、ルートディレクトリ(my testcgi2.cgiなど)に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に設定する必要がある場合があります。

CentOS7とBugzillaのドキュメントに示されているようにyumコマンドを実行する必要がありました。

SMTPを機能させるには、その余分なスクリプトを実行する必要がありました。そうすれば、quitメソッドが煩わしく不足することはありません。

私は元のBugzillaのドキュメントを見て、最初は中国語の方が読みやすいと思いました。少なくとも私はテレビでミニシリーズ将軍を見たことがありますが、それは日本人でした。 Bugzilla CentOS7ガイドへのリンクを教えてくれたWebホストプロバイダーに連絡しました。

パーミッションやPlesk、または私が言った変更については説明していなかったため、これは不完全でした。 Bugzillaのドキュメントは、今では中国語のようではなく、数日間の苦しみの後で英語のようになっていますが、それでも仕事は完了していません。私のウェブホストプロバイダーに最初に変更を加えさせることはおそらく良かったので、サイトが立ち上がることができましたが、説明と現在の知識が不足しているため、次に実行したときにすべてがすぐに機能しなくなりました./checksetup.plスクリプト。

私はそれがすべてをカバーしていると思います。私はまだ専門家ではありませんが、私の記事がお役に立てば幸いです。

0

この質問はサポートメーリングリストに届いたので、完全を期すためにここに回答を追加しますが、他のすべてについて議論することをお勧めします。

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関連の追加の依存関係を提供する可能性が最も高いです。 install-module.plは、CPANだけが実際に利用できる場合の最後のステップにすぎません。その場合、パッケージマネージャーを手動で使用して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

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

Office 365は現在OOBで動作しません。サポートのメーリングリストには、このトピックに関するスレッドがたくさんあります。

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

多くの回避策のどれを​​好むか、または単にOffice365をまったく使用しないかを選択することしかできません。私はBugzillaをできるだけカスタマイズしないことを好みます。したがって、Office 365へのメール転送を処理するローカルsendmailなどを好みます。しかし、それは最終的にはあなた次第です。

SMTPサーバー:smtp.office365.com:587 smtp_ssl:on

Smtp_sslは実際にはSSLであり、Office 365で必要なTLSではないことをある程度確信しているため、Bugzillaが365をサポートしていても、この構成はおそらく機能しません。

私は私のウェブホスティングプロバイダーであるMediaTempleに連絡しましたが、彼らは非常に専門的ではなく、支援を検討することすら拒否しました。

最初のエラーメッセージのSSL依存性に加えて、とにかく実際には役に立ちません。 Office 365のサポートは、Bugzillaで実装するか、他のローカルMTAを使用して回避する必要があります。

0