私は perl で sendmail を使用していますが、スクリプトをコマンド ラインで実行するときに、電子メールと受信者の電子メール アドレスの後に \n(s) を省略する必要があることに気付きました (壁に頭をぶつけた後)。メールを正しくフォーマットするために必要ですが、CGI を介して実行すると、これらの\nが存在しない場合、受信者の電子メールの形式が正しくないというエラーが返されます。
他の誰かがこれに遭遇しましたか?2 人のやり方の違いは何ですか?
私はあなたがコマンドラインのプロンプトからデータを取得していて、次のようにそれらを切り刻んでいないことを確信しています:
my $send_to = <>;
これは、$send_toにすでに「\n」があることを意味します。それらを両方とも同じように機能させるには、変数を切り刻みます。
my $send_to = <>;
chomp($send_to);
あるいは単に
chomp(my $send_to = <>);
いくつかのコメントで、コマンドラインから-lオプション(perl -l foo.cgi)を使用してスクリプトを実行していると述べています。
-lオプションを使用すると、自動行末処理が有効になります。問題は行末にあるため、-lなしで試してみることをお勧めします。
データはどこから来ていますか?スクリプトにハードコードされていますか、それとも Web フォームからですか?
余談ですが、Web フォームから受信者の電子メール アドレスを取得すると、そのフォームはスパマーに使用されます。100%保証です。
したがって、コマンドラインから実行するには、次のようなものがあると思います。
my $your_email = "you@foo.bar";
my $recipient_email = "them@foo.bar";
そしてこれは「CGI経由で実行」する場合:
my $your_email = "you@foo.bar\n";
my $recipient_email = "them@foo.bar\n";
そこで私が質問したいのは、上記の変数を使用して sendmail を呼び出す方法と、「CGI 経由で実行」とコマンド ライン経由で実行する場合の意味についてです。CGI コードを追加しただけで、コマンド ラインまたは Web ブラウザでその URL にアクセスして実行していますか?
「CGI」という用語は広義です。CGI として実行される perl スクリプトと、コマンド ラインで実行される yur perlscript を意味する場合、スクリプトが持つパスとその一般的な継承された環境に注目します。特に、別のユーザー ID として実行している場合。ウェブサーバーが chroot などにある場合。
use Data::Dumper;
warn(Dumper(\%ENV));