投稿日:2003年01月12日 作成鷹の巣

No.7777 Unixサーバで、sendmail.cgiが動作しない。



Unixサーバで、sendmail.cgiが動作しない。

No.7777 投稿時間:2003年01月12日(Sun) 00:08 投稿者名:toto URL:

学校のunixサーバでどうしてもqmailが動かないので、にゃぁぁぁぁぁぁぁ? さんの
sendmail.cgiを設置しようと思ったのですが、上手く行きません。
一応、シェルから"perl < mailtest.txt sendmail.cgi -t" と打つとメールは送信されるのですが、

cgiから open(MAIL,"| sendmail.cgi -t") || &error("メール送信に失敗しました");
とやると実行できないのか エラーになります。
そこで、open(MAIL,"| sendmail.cgi [-itfr] [$mailto]") || &error("メール送信に失敗しました");
とやると エラーはでないのですが、メールは送信されません。
色々と試してみたのですが上手く行きません。どなたか分かる方がいたらよろしくお願いします。


sendmail.cgiを使う理由が分かりません。

No.7779 投稿時間:2003年01月12日(Sun) 12:01 投稿者名:カイナン URL:http://yaguma.com

http://sakaguch.com/CGIsendmail.htmlからの抜粋です.
拡張子のcgiファイルがperl.exeに関連付けされていても以下の書式では、送信できません。
$mailprog = '../sendmail/sendmail.cgi';
$mailprog = 'D:/WWW/public_html/sendmail/sendmail.cgi';
$mailprog = 'D:\WWW\public_html\sendmail\sendmail.cgi';
尚、$mailprog = 'D:\Perl\bin\Perl.exe D:\WWW\public_html\cgi\WebMail\sendmail\sendmail.cgi'; なら、送信できます。
この辺りが参考にならないでしょうか?
ちょっと待ってください.ここまで書いて,お使いの機械がunixであることに気がつきました.上記の例はWindowsからです.unixであればsendmailを直にインストールすればよいのでは?それともqmailが動かない原因を突き止めてsendmail wrapperを使うかです.sendmail.cgiを使う理由が分かりません.


qmailのsendmail wrapperが動かないので困っています。

No.7781 投稿時間:2003年01月12日(Sun) 13:20 投稿者名:toto URL:

カイナンさん返信有り難うございます。ここは"Windows自宅サーバ"のページなので
場違いは承知なのですが、sendmail.cgiの話題が乗っていたので立てさせて頂きました。

学校のサーバがsendmailを廃止して、qmailに移行したのですが、qmailのsendmail wrapperが
動かないので困っていた所、sendmail.cgiは設定が比較的簡単だと書いてあったので
sendmail.cgiを入れてみたのですが上手く行きませんでした。
シェルから"/var/qmail/bin/sendmail -t" と "/var/qmail/bin/qmail-inject" は送信できますが、
open(MAIL,"| /var/qmail/bin/sendmail -t") || &error("メール送信に失敗しました"); とやると全く送信できません。

話は戻りますが、sendmial.cgiなのですが、
$mailprog = 'D:\Perl\bin\Perl.exe D:\WWW\public_html\cgi\WebMail\sendmail\sendmail.cgi'
となっていますが、cgiで送信する時のコマンドは 以下のどちらかでいいのでしょうか?
1番 open(MAIL,"| sendmail.cgi -t") || &error("メール送信に失敗しました");
2番 open(MAIL,"| sendmail.cgi [-itfr] [$mailto]") || &error("メール送信に失敗しました");
。。print MAIL "To : $mailto\n";
。。close(MAIL);


Unixでsendmail.cgiが動くかどうか分かりません。

No.7783 投稿時間:2003年01月12日(Sun) 15:10 投稿者名:カイナン URL:http://yaguma.com

> open(MAIL,"| /var/qmail/bin/sendmail -t") || &error("メール送信に失敗しました"); とやると全く送信できません。
私の環境ではqmailで
$Sendmail = '/usr/sbin/sendmail';として/usr/sbin/sendmailがsendmail wrapperとなっています./var/qmail/bin/sendmailのシンボリックです.
open(MAIL,"|$Sendmail -t") || &error("$mail は送信に失敗しました");
私のところでは,これできちんと動いています.なぜ動かないんだろう?|と/varの間に空白がありますがこれのせいということはないでしょうね.まさかね
> 1番 open(MAIL,"| sendmail.cgi -t") || &error("メール送信に失敗しました");
> 2番 open(MAIL,"| sendmail.cgi [-itfr] [$mailto]") || &error("メール送信に失敗しました");
私は,sendmail.cgiのコードを解析したことはありませんが,http://wan.magical.gr.jp/txt/winsendmail.htm
「$sendmail = '/usr/bin/sendmail'; # sendmail のパス
こんな設定がCGIにあったとしたら、次のように変更します。
$sendmail = 'c:\perlまでのパス\perl.exe c:\sendmail.cgiまでのパス\sendmail.cgi';
これだけで大抵のCGIでメールが送信できるようになるはずです。」
とありますから両方だめではないでしょうか.申し訳ありませんが,試したことがないので私にはunixでsendmail.cgiが動くかどうか分かりません.ここはもう少し達人の方の登場を待ってみましょう.他力本願ですいません.


sendmail.cgiをコマンドラインから実施した結果。

No.7784 投稿時間:2003年01月12日(Sun) 15:37 投稿者名:toto URL:

カイナンさん有り難うございます。
>私のところでは,これできちんと動いています.なぜ動かないんだろう?|と/varの間に空白がありますがこれのせいということはないでしょ>うね.まさかね.
空白は消しても送信できませんでした。

元々のsendmailも送信するのには"-t"が必要なので、
1番 open(MAIL,"| sendmail.cgi -t")
2番 open(MAIL,"| sendmail.cgi [-itfr] [$mailto]")
cgiをいじってないなら、1番で動いている筈です。
しかし自分の環境(unix)では動かなかったので、sendmail.cgiのソースの4行目の
書式通りに書いたつもりです。 "書式 : perl sendmail.pl [-itfr] [address]"
sendmail
○ %/var/qmail/bin/sendmail -t < mailtest.txt
○ %/var/qmail/bin/sendmail < mailtest.txt -t
× %/var/qmail/bin/sendmail < mailtest.txt
sendmail.cgi
○ %perl sendmail.cgi -t <mailtest.txt
○ %perl sendmail.cgi <mailtest.txt -t
× %perl sendmail.cgi <mailtest.txt


smtpの指定はどうなっていますか。

No.7785 投稿時間:2003年01月12日(Sun) 16:48 投稿者名:カイナン URL:http://yaguma.com

-i メッセージを標準入力から読み込む場合、"." 文字だけ
の行を入力の終りとして扱いません。
-t メッセージヘッダからの受信者の抽出します。これは コ
マ ンドラインで受信者が指定されなかった場合に必要で
す。
-f sender エンベロープの送信者アドレスをセットします。これ は
メッ セージが Errors-To: メッセージヘッダを含まない
場合に配送問題が送られる場所です。
-r sender エ ン ベ ロープの送信者アドレスをセットします。メッ
セージが Errors-To: メッセージヘッダを含ま な い 場
合、これが配送問題が送られるアドレスです。
smtpの指定はどうなっていますか.pop before smtpの指定は?
もともとwindows用のと書いてありますので,socket関係を改造しなければ動かないのかもしれませんね.(自信なし)


家からは$smtp 経由で送信できました。

No.7787 投稿時間:2003年01月12日(Sun) 17:15 投稿者名:toto URL:

カイナンさん、さおさん返信有り難うございます。2週間後に期末テストが迫ってるので、終わったら本気で取り組んでみます。
$smtp = "hc.cc.**.ac.jp";
$pop_before_smtp = "0";
になってます。ちなみに家からはメールソフトでPOPbeforeSMTPを使用しないで、$smtp 経由で送信できました。

さておき、サーバによっては SOCKが"使えない"こともあるらしいのですが、
シェルから %perl < mailtest.txt sendmail.cgi -t" 送れるので、大丈夫だと思います。(自信無し。
でも、SOCKでsmtpと通信はできているみたいなので、replyも帰ってきてるしOKかと。

いま気付いたのですが、別のメールフォームはまだ試してないので、試してみたいともいます。一日が30時間だったら。。


時間があれば実験を進めてください。

No.7786 投稿時間:2003年01月12日(Sun) 16:50 投稿者名:さお URL:http://ito19.dip.jp/

正しいと思いますが…
sendmail.cgiは「winでsendmail(送信のみ)を実現するcgi」ですからメールサーバーでありません。

ちなみにwinでの設定例は
$mailprog = 'D:\Perl\bin\Perl.exe D:\WWW\public_html\cgi\WebMail\sendmail\sendmail.cgi'
として
open(MAIL,"| $mailprog $mailto") || &error("メール送信に失敗しました");
で、オプションは無くてもOKです。

基本的にsendmail.cgiはwin用ですが、シェルから送信できるのなら書式の工夫でunixでも使えるかも知れませんね。
だとしたら…unixで「メールサーバーはいらないけれどsendmail(送信)のみ使いたい」人には非常に有能なスレッドです。
逆にunixユーザーさんに実験をお願いして結果報告をお願いしたいです。

勘違いでしたらゴメンなさい。


誰か送信できた人いますか?

No.7789 投稿時間:2003年01月12日(Sun) 18:10 投稿者名:カイナン URL:http://yaguma.com

私の環境(Vine linux+qmail)で
# perl < mailtest.txt sendmail.cgi -t
とすると,ログに
[01/12 18:05:33] #Error#SMTPサーバーからのお返事がへんです。 予想:354
実際:503 RCPT first (#5.5.1)
となりエラーになりました.誰か送信できた人いますか?
smtp=127.0.0.1 PBS=0


$to = "user\@domain.com";とするとOKです。

No.7792 投稿時間:2003年01月12日(Sun) 18:29 投稿者名:toto URL:

> [01/12 18:05:33] #Error#SMTPサーバーからのお返事がへんです。 予想:354
> 実際:503 RCPT first (#5.5.1)
> となりエラーになりました.誰か送信できた人いますか?
昨日自分もそれで悩みました。デコードがおかしいのか 宛先(TO:)が見つからないみたいなので、
でsendmail.cgi の 102行目を
# $to = $HEAD{"To"};
$to = "user\@domain.com";
をとするとOKです。
でも送信したメールは ヘッダーの順番がぐちゃぐちゃなので、デコーダ書き換えた方がいいかも。


確かにヘッダ情報はおかしいですけど送れますね。

No.7794 投稿時間:2003年01月12日(Sun) 23:47 投稿者名:カイナン URL:http://yaguma.com

確かにヘッダ情報はおかしいですけど送れますね.どこにでも送れます.
foreach $i (0..$#head){
if($head[$i] =~ /^([A-Z].*?)\s*:/){
$HEAD{($n = $1)} = $head[$i];
$HEAD{$n} .= $head[++$i] if $head[$i + 1] =~ /^\s/;
}
}
$from = $P{'f'} if $P{'f'};
if($P{"t"}){
# $to = $HEAD{"To"};
# $to = "ky3i-tnk@asahi-net.or.jp";
$to = "ky3i-tnk\@asahi-net.or.jp";
上記のように@の前に\がないとだめでした.
この辺りからまず解決していきましょう.私もいろいろやっていますがPerlのことは余りよく分かりません.他人のコードをこそこそいじくるのが関の山です.


当たり前のことですが確認を。

No.7795 投稿時間:2003年01月13日(Mon) 00:29 投稿者名:OAK URL:

当たり前のことですが確認を
(1)sendmail.cgi が実行するCGIと同じディレクトリー内である
(2)sendmail.cgi は rwxr-xr-x
(3)一行目の #!/usr/bin/perl のパス

以下やってみる価値はありかな?
(1)SMTPの指定を送り先のMXサーバーにする
(2)popbeforesmtpを使ってみる。

なおUNIXでperlのプログラムを実行する場合は
$ perl xxx.cgi <XXX でなく
$ ./xxx.cgi <XXX とperlを入れない方が良い。

> 確かにヘッダ情報はおかしいですけど送れますね.どこにでも送れます.
> foreach $i (0..$#head){
> if($head[$i] =~ /^([A-Z].*?)\s*:/){
> $HEAD{($n = $1)} = $head[$i];
> $HEAD{$n} .= $head[++$i] if $head[$i + 1] =~ /^\s/;
> }
> }
> $from = $P{'f'} if $P{'f'};
> if($P{"t"}){
> # $to = $HEAD{"To"};
> # $to = "ky3i-tnk@asahi-net.or.jp";
> $to = "ky3i-tnk\@asahi-net.or.jp";
> 上記のように@の前に\がないとだめでした.
"の中は@は変数と見られてしまい @asahi と言う変数になるのでNG
$to = "ky3i-tnk\@asahi-net.or.jp";
又は $to = 'ky3i-tnk@asahi-net.or.jp'; とシングルクォーテーションにする。
これはperlの初歩の初歩。


これまでわかったことを報告します。

No.7797 投稿時間:2003年01月13日(Mon) 07:36 投稿者名:カイナン URL:http://yaguma.com

OAKさん,ありがとうございます.これまでわかったことを報告します.
1.一行目の #!/usr/bin/perl のパス
これは必要.パーミッションは755.
2.# $to = $HEAD{"To"};
$to = 'ky3i-tnk@asahi-net.or.jp';
の状態で
$ ./sendmail.cgi -t < testmail.txt
とすれば送れますが,ヘッダ情報がおかしくなる.(差出人がtestmail.txtのTo:にかかれた内容になる.よくわからないが,$to = 'ky3i-tnk@asahi-net.or.jp';のようなことをしているので当たり前のような気もする.)この場合$to = $HEAD{"To"};のままだと送れない.
3.$to = $HEAD{"To"};
もともとの状態で,
$Sendmail = './sendmail.cgi';
として,フォームメールのcgiを動かすと,きちんと送れる.この場合ヘッダ情報も正常です.ただ問題点は本文にリターンを入れ2行以上にすると送れなくなることです.1行でリターンなしならば本文も送れます.
今までやってみてsendmail.cgiはlinuxでも使えます.ただ現在のところ本文を2行以上にするとだめというのがネック.これはフォームメールの方に原因があるのか,sendmail.cgiのほうに原因があるのかまだ不明.
もちろん$Sendmail = '/usr/sbin/sendmail';ならば正常に使えます.
ちなみに私の使っているフォームメールのメールを送る部分は下記の通りです.
open(MAIL,"|$Sendmail -t") || &error("$mail は送信に失敗しました");
print MAIL "X-Mailer: xxx.zive.net by Isamu Tanaka\n";
print MAIL "X-HTTP_REFERER: http://xxx.zive.net\n";
print MAIL "To: $mail\n";
print MAIL "From: $yourad\n";
&jis("Subject: $subject"); print MAIL "$msg\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n\n";
&jis("$honbun"); print MAIL "$msg\n";
close(MAIL);

sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis'); }


Unixでsendmail.cgiを使うときのまとめ.

No.7799 投稿時間:2003年01月13日(Mon) 18:03 投稿者名:カイナン URL:http://yaguma.com

unixでsendmail.cgiを使うときのまとめ.

1.一行目の #!/usr/bin/perl のパス
これは必要.パーミッションは755.

2.# $to = $HEAD{"To"};
$to = 'ky3i-tnk@asahi-net.or.jp';
の状態で
$ ./sendmail.cgi -t < testmail.txt
とすれば送れますが,ヘッダ情報がおかしくなる.(差出人がtestmail.txtのTo:にかかれた内容になる.よくわからないが,$to = 'ky3i-tnk@asahi-net.or.jp';のようなことをしているので当たり前のような気もする.)この場合$to = $HEAD{"To"};のままだと送れない.

3.$to = $HEAD{"To"};
もともとの状態で,
$Sendmail = './sendmail.cgi';
として,フォームメールのcgiを動かすと,きちんと送れる.この場合ヘッダ情報も正常.ただ問題点は本文にリターンを入れ2行以上にすると送れなくなること.1行でリターンなしならば本文も送れます.どうも改行コードの違いがいけないようです.それとsendmail.cgiがEUCコードで書いてないとでないとだめです.
非常に泥臭い方法ですが,まずフォームメール側で
&jis("$honbun");
$msg =~ s/\r\n/\n/g;
$msg =~ s/\n/<br>/g;
print MAIL "$msg\n";
close(MAIL);
と改行コードをすべて<br>にでも置き換えておいて
sendmail.cgiの最終チェックの前に
$mail =~ s/<br>/\r\n/g;
と<br>をまた改行コードに直せばうまくいきました.もっとスマートな方法はあると思いますが,とりあえず動きます.


##質問## Socket CGIが動くかどうかは、どこでわかるのでしょうか?

No.7801 投稿時間:2003年01月13日(Mon) 22:12 投稿者名:toto URL:

カイナンさん、OAKさん、返信有り難うございます。。
特にカイナンさん何度も返信有り難うございました。 動きましたか。うらやましい。
自分も $to = $HEAD{"To"}; を 有効、無効にしてみたり。euc_LFにしてみたりしたけど動きませんでした。
もちろん本文は一行です。 学校のunixサーバがSocket CGI 使えないというのが結論なのかなぁ。
##質問## Socket CGIが動くかどうかは、どこでわかるのでしょうかね?詳しい人よろしくお願いします。

virtualaveのアカウントでqmailを試した所送れたので、
同じ設定のまま学校で試してみるとやはり送れず。パスはあってますし。パーミションは755でした。
qmailも使えないしsendmail.cgiも動かない。どうしたものか。。
メールフォームだけ virtualaveのを呼び出すか。。


|目次|掲示板|過去ログ目次|▲頁先頭|