プロが教える店舗&オフィスのセキュリティ対策術

Lolipopサーバー(Perl Ver. 5.010001 (5.10.1))で 標準インストールされていない
Email::MIMEをユーザーディレクトリにコピーして使おうとしていますが
エラーで使えず困っています。
過去に CGIと同じディレクトリに外部モジュール(単体 pm)を設置して利用したことがありますが
今回 Email::MIME は pmファイル単体ではないので、ディレクトリ単位で
別ディレクトリに設置したところエラーになります。
今まで外部単体モジュールしか利用したことがないのですが、今回ディレクトリ単位で
別ディレクトリにコピーして利用する場合のサンプルや説明が探せません。

実際のコードを載せようとしましたが gooのセキュリティポリシーで
コードが弾かれるようで載せられないので問題部分だけ倍角で記述します。

use lib ’../../lib’;
use Email::MIME;


でエラーが出てしまいます。
Emailモジュールディレクトリは
usr---- bin--- sample---- sample.pl
|--- lib--- Email---- MIME.pm
|---- その他の関連 .pmファイル&フォルダ
にコピーしています。
ちなみに MIME.pmと関連ファイル/ディレクトリを 同じディレクトリにコピーして(属性:755)
use lib qw(./);
としてみましたがエラーは解消しません。
# use Email::MIME;
とコメントアウトすればエラーは出ません。(MIME関連コードはまだ未記述です)
Windows/local では Email::MIME をインストールしてしまったので
確かめられません。
use FimdBin;
use lib ”$FindBin::/lib”;
とか、フルパスでも試してみましたが、エラーは消えません。
ざっと見たところでは、MIME.pm 中で use宣言されている他のモジュールは
全て存在するか、内部モジュールとして使用可能です。
どうすれば外部に置いた Email::MIME が使えるようになるか、
あるいはディレクトリ下の .pmモジュール利用の
サンプルや説明ページを教えていただけないでしょうか。

A 回答 (3件)

○ 500 Internal Server Error


というのは「エラーがあった」ことしかわかりません。
修正のヒントになりません。

具体的にどんなエラーになっているのか確認しましょう。
・サーバーのエラーログを解析する
・サーバーにSSH等でログインして、CGIをコマンドとして実行してみる
・デバッグ中は use CGI::Carp qw(fatalsToBrowser); を書いておく

# Lolipopは使ってないので、それぞれの具体的なやり方は別途確認してください。



○一般論として。
.pmを置くだけで使えるようになるとは限りません。
コンパイルして実行ファイルを作るとか、設定ファイルに適切な内容を書くなどのインストール作業が必要な場合があります。

付属のドキュメントを読んで正しくインストールしましょう。


https://metacpan.org/pod/Email::MIME
の Dependencies を見れば、 Email::MIMEの他にも各モジュールも必要だということがわかります。
それらがインストールされているか確認しましょう。

cpanmコマンドでインストールすると楽です。
    • good
    • 0
この回答へのお礼

何度もありがとうございます。
契約プランの関係で SSHは使えないので、
エラーをフェッチできる KCatch.pmというモジュールを使って
USE KCatch
という一行を加えたところ 以下のようなエラーが表示されたので
サーバーのEncode のバージョンが古いと思われます。

[ContentType.pm:7:die] Encode version 2.87 required--this is only version 2.68 at ../../lib/Email/MIME/ContentType.pm line 7.
BEGIN failed--compilation aborted at ../../lib/Email/MIME/ContentType.pm line 7.
----
Encodeの Ver2.87を同一ディレクトリにコピーして見ましたが
今度は
[DynaLoader.pm:223:die] Encode object version 2.68 does not match bootstrap parameter 2.87 at /usr/local/perl/5.10/lib/5.10.1/x86_64-linux-thread-multi/DynaLoader.pm line 223.
[Creator.pm:9:die] Encode object version 2.68 does not match bootstrap parameter 2.87 at /usr/local/perl/5.10/lib/5.10.1/x86_64-linux-thread-multi/DynaLoader.pm line 223.
Compilation failed in require at ../../lib/Email/MIME/Creator.pm line 9.
-----
などとなってしまいました。
ちょっとサンデープログラマの手には余ってきたので、Email::MIME を諦めて違うモジュールを
使ってみようかと思っています。
・・・単にメールサーバーの受信メールを削除・フォルダ移動する目的なので。

お礼日時:2022/07/14 11:56

そもそも、エラーはそれが原因なのですか?



具体的なエラーメッセージが無いと判断でません。
    • good
    • 0
この回答へのお礼

osamuyさん、kmeeさん
ご回答ありがとうございます。
まだご指摘の点 完全確認できていませんが わかっている部分だけ
とりあえず追加します。
カレントディレクトリは
opendir(DIRHANDLE, './');
で配下のファイル・ディレクトリ名を確認したところでは、
実行ディレクトリ(usr/bin/sample)で間違いないと思います。
@INC の値は
use FindBin;
use lib "$FindBin::Bin/lib";
use lib '/home/users/0/sub.jp-booklovers/web/usr/lib';
print join \"\n\", @INC", $em;
などとして確認しようとしましたが、空白が帰ってきます。
>上位パスのトラバーサル不可とか
カレントディレクトリ配下にコピーして useでそのディレクトリを
相対的に指定してもエラーになったので???です。
>具体的なエラーメッセージが無いと判断でません。
エラーは "500 INTERNAL SERVER ERROR" です。
>そもそも、エラーはそれが原因なのですか?
# use Email::MIME;
とするとエラーは出ないので、探せないモジュールを指定しているのが
原因と判断しています。
サポートにも聞いてみます(サポート対象外 と言われる可能性大?)
とにかく、Email::MIMEのように複数の関連 .pmファイルが
階層ディレクトリに存在するモジュールを外部モジュールとして
指定するサンプルコードが欲しいのですが・・・
英文ページ含めてもう少し検索してみようと思います。

お礼日時:2022/07/11 12:04

まずは、お使いのCGI環境でカレントディレクトリがどこになってるか、実行時の検索パス(環境変数やperl内部変数@INC)がどんな値になってるかを調査してみては。


CGI環境だと、上位パスのトラバーサル不可とかいろいろありそうなので。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!