NTserverでメールを送るには?(sendmailで)

[上に] [前に] [次に]
プログラマー希望 2000/02/25(金) 16:43:17
始めまして、プログラマー希望です。どなたか教えて下さい!!
NTserverでsendmailを使いたいのです。sendmailはあるのですが、
上手く動いてくれません。パスの指定が悪いと思うのですがどうすれば良いのでしょうか?
今は以下のソースです。(c:は自分のサーバーです。)
#!/usr/local/bin/perl

$mailto = 'abc@efg.co.jp';
$sendmail = 'c:\\sendmail\\sendmail.exe';#ここがおかしい?
open(MAIL,"| $sendmail $mailto");
print MAIL "test contents";
close(MAIL);

print "Content-type: text/html\n\n";
print "<HTML><BODY bgcolor=lightyellow>Thank You!\n";

どなたか教えて下さい。よろしくおねがいします。

無責任官庁 2000/02/25(金) 16:58:19
> 上手く動いてくれません

メールが送信できるできないはともかく、CGIとしては動いていると
いう前提でいいんですよね。

> $sendmail = 'c:\\sendmail\\sendmail.exe';#ここがおかしい?

シングルクォートで囲む場合は、¥を二つ書いてエスケープする
必要が無いと思いますが。

$sendmail = 'c:\sendmail\sendmail.exe'

EMI 2000/02/25(金) 17:11:03
ところで、1行目の
#!usr/local/bin/perl
は必要ありません。パスも、明らかに間違ってるし。(というか、どう見てもUNIXのもの)
これは、UNIX系OSでスクリプトを動作させるためのおまじないなので、NTでは必要ないです。

プログラマー希望 2000/02/25(金) 17:22:45
無責任官庁さん返事ありがとうございます。
>メールが送信できるできないはともかく、CGIとしては動いていると
>いう前提でいいんですよね。
はい。エラーは出ていません.

>$sendmail = 'c:\sendmail\sendmail.exe'
で早速試したのですが、やはり動いてません。sendmailのlog
を見てみたのですが、動いた形跡がありません。sendmailが機能していないと言うことなのでしょうがどうすればいいのでしょうか?
宜しくお願いします。

2000/02/25(金) 17:34:18
あの〜〜〜、NTサーバーはsendmailコマンド対応してないのではないでしょうか?
少なくとも私のところはそうですが。
メールの発信をしたいのなら、blat.exeと言うプログラムを入手して(フリー)システムに入れないといけなかったと思います。
私もこの設定をしたのは?年前なので今一つしっかり覚えていません。
いい加減ですいません。

プログラマー希望 2000/02/25(金) 17:39:15
EMIさんありがとうございます。
>#!usr/local/bin/perl
を取ってもエラーになりませんでした。決まり文句なんだとおもってました。ちなみにopenエラーはどうやって使うのでしょうか?(dieの使い方)教えて下さい。
宜しくお願いします。

EMI 2000/02/25(金) 17:54:24
決まり文句としてはこんな感じ。
open MAIL,"| $sendmail $mailto" or die "Error: open failed!";
より、具体的に書くとこう。
if(not open(MAIL,"| $sendmail $mailto")){
  die("Error: open failed!");
}

プログラマー希望 2000/02/25(金) 18:11:16
エラーになるかためしてみたのですが。"Error: open failed!"
はでませんでした。ますます解りません。
陽さんがいうようにsendmailは使えないのでしょうか。
なにか良い方法は・・・(あくまでsendmailで)。

ma3ki 2000/02/25(金) 19:00:39
NT+IIS環境(社内LAN上)でASPからSMTPを使用し、SENDメールを
現在行っています。
ただ、まだ社外発信が上手く出来ていません。
参考までに。

EMI 2000/02/25(金) 19:23:45
dieを通過しても、目に見えるところにエラーメッセージが表示されるとは限りません。
Thank You!
は、表示されてますか?
もし、表示されてなければ、おそらくdieで落ちています。
エラーログを確認してみましょう。

EMI 2000/02/26(土) 04:00:50
落ち着いて考えてみれば、dieを通ればInternal Server Errorが出るはずですね。
エラーは出たのでしょうか?それとも、一応正常に動いたのでしょうか?

B-Cus 2000/02/26(土) 04:29:58
> open MAIL,"| $sendmail $mailto" or die "Error: open failed!";
UNIX だと、"〜" 中に | があるので、perl が子プロセスを
作り、子プロセスは exec sh して (この辺あやしい)、
その sh から $sendmail を実行しようとします。
で、open はその子プロセス (sh) のプロセス番号を返すので、
これでは
 - $sendmail が存在しない
 - $sendmail のパーミッションがおかしい
 - $sendmail の実行時にこけた (例えば exit(1) した)
といったチェックはできないんですが ($? と $! を見ないと
いけないのかな?)、Windows だと この書き方で OK なんですか?


とりあえず、コマンドラインから実行すべきでは>プログラマー希望氏
 > c:\sendmail\sendmail.exe abc@efg.co.jp
 test contents
 (Ctrl-Z)
でどうなるか確認、ではないですか。

# 確認その1. DOS の EOF って C-z でしたっけ?
# 確認その2. NT には、いわゆる「DOS 窓」ちゅーのはあるんですよね?

Selly 2000/02/26(土) 15:50:23
Windowsではsendmailが起動できなくてもopenではエラーを返さないようです。

B-Cusさんの書かれたとおり、まずはコマンドラインからテストしてみるべきでしょう。

> # 確認その1. DOS の EOF って C-z でしたっけ?

ですね。

> # 確認その2. NT には、いわゆる「DOS 窓」ちゅーのはあるんですよね?

NTには「コマンドプロンプト」という名前であります。
機能はDOS窓の比ではないですが。
#UNIX系と比較すると劣るけど(笑

プログラマー希望 2000/02/28(月) 13:48:55
>Thank You!
は表示されています。

B-CusさんSelly さんコメントありがとうございます。
とりあえず「コマンドプロンプト」で実行した結果、メールは送信されました。(喜び!!!)
ただ、
> c:\sendmail\sendmail.exe abc@efg.co.jp
では無理でした(上記の指定では上手く起動してくれませんでした。)
> cd sendmail
> sendmail.exe abc@efg.co.jp
でexeを指定してやればメールを送ることはできました。
そこまではできたのですが、この後どう指定すれば良いのでしょうか?
どなたか教えて下さい!
宜しくお願いします。

プログラマー希望 2000/02/28(月) 14:24:59
すみません先程の答えに誤りが有りましたので訂正します。> >c:\sendmail\sendmail.exe abc@efg.co.jp
>では無理でした(上記の指定では上手く起動してくれませんでした。)
は、間違いでした。起動してくれます。(記述を少し間違えてました。まぎらわしくてすみません。)

引き続きどなたか対処法、教えて下さい。
宜しくお願いします。

ラウォッチ 2000/02/28(月) 15:24:50
WINDOWSのパールでは、パイプはサポートされていないみたいです。
ですので、open でなく、一度、一時ファイルにメール文書を掃き出して、
system関数でsendmailを発行するとか...。

プログラマー希望 2000/02/29(火) 09:03:02
ラウォッチさんありがとうございます。
ちなみにsystem関数というのはどのように使ったら良いのでしょうか?
使った事ないのでよかったらサンプル等教えて下さい。
宜しくお願いします。

ラウォッチ 2000/02/29(火) 10:16:40
以下の感じで〜

    if (open(TMP_MAIL,">tmp_mailf.txt")) {
        print TMP_MAIL "To: $mailto\n";
        print TMP_MAIL "From: $email\n";
        print TMP_MAIL "Cc: $mailcc\n";
        print TMP_MAIL "Bcc: $mailbcc\n";
        print TMP_MAIL "Subject: $m_sub\n";
        print TMP_MAIL "MIME-Version: 1.0\n";
        print TMP_MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
        print TMP_MAIL "Content-Transfer-Encoding: 7bit\n";
        print TMP_MAIL "--------------------------------------------------------\n";
        print TMP_MAIL "$m_com";
        print TMP_MAIL "--------------------------------------------------------\n";
        close(TMP_MAIL);
        system("$sendmail < tmp_mailf.txt");
        unlink("tmp_mailf.txt");
    }

ラウォッチ 2000/02/29(火) 10:27:18
補足。
UNIXのsendmailだと
$sendmail = '/usr/lib/sendmail -t';
でいけるけど、
WINDOWSのsendmailだと
$sendmail = 'c:\sendmail\sendmail.exe -t';
ってありかなぁ?

もりちゃん 2000/02/29(火) 10:31:34
ちなみに,NT対応のメール送信フォームなんか探せばいくらでもみつかるのに,
わざわざsendmailを使わなければならない理由は何なんでしょうか?

無責任官庁 2000/02/29(火) 10:44:34
> WINDOWSのパールでは、パイプはサポートされていないみたいです
OS は WinNT4SV、Perl は ActivePerl build 522、メールソフトは cmail.exe で、
open (SMAIL,"| cmail.exe〜");
print SMAIL "本文";
close SMAIL;
ってやって、問題なく運用してます。念の為。

(Perl じゃなくて sendmail 側が対応してないってコト?)

ラウォッチ 2000/02/29(火) 11:11:18
ごめんなさい。勘違いがありました。

>WINDOWSのパールでは、パイプはサポートされていないみたいです。

>ってやって、問題なく運用してます。念の為。

は、よく本を読むとWINDOWSでは | でなく |- が サポートされていないってかいてありました。
| と |- の違いがイマイチわかりませんが...。

プログラマー希望 2000/02/29(火) 11:12:09
>$sendmail = 'c:\sendmail\sendmail.exe -t';
>ってありかなぁ?
これは無理?とおもいます。sendmail.exeは動いてない様子です。
system関数についてはただいまテスト中です。ちなみにopen関数は使えてるのかが心配なのですが。
もりちゃんさんの
>わざわざsendmailを使わなければならない理由は何なんでしょうか?
なのですが、たいした理由はありません。みなさん他のソフトで送られているのですが、sendmailを使われた方が、あまりいなかったのと、使えるのかが、疑問に思ったのが理由(?)です。後perlの勉強というのもあります。(何分初心者でして。(すみません))実際sendmailだけを使うのであればASPを使って組めばいいだけで・・・
無責任官庁さんの
>(Perl じゃなくて sendmail 側が対応してないってコト?)
はそうそうかもしれないです。まだ疑問なのですが。
とりあえずラウォッチさんの方法でテストしてみたいと思っております。(第一だんは失敗しました・・・・。)

プログラマー希望 2000/02/29(火) 12:03:21
ラウォッチさんの方法を試してみたのですが、やはり動いてくれませんでした。perlではなくsendmailが対応してくれないのでしょうか?
他に方法がありましたら教えて下さい。(やはり無理なのでしょうか)
宜しくお願いします。

もりちゃん 2000/02/29(火) 13:59:33
これ以上のことはsendmail.exeの仕様が分からないとどうにもならないのでは?
どこで配布されているんですか?

ラウォッチ 2000/02/29(火) 14:21:11
もりちゃんと同じ!

コマンドラインからのメール成功時に、メール本文はどのように指定しましたか?

プログラマー希望 2000/02/29(火) 14:21:24
よくしらなのですが
http://www.tobata.isc.kyutech.ac.jp/staff/toda/sendmail/
この辺で入手できるのではないかとおもいます。
(これまたソフトに関しても無知でして(すみません))

pa 2000/02/29(火) 14:31:52
> WINDOWSのsendmailだと
> $sendmail = 'c:\sendmail\sendmail.exe -t';
> ってありかなぁ?
これは憶測に過ぎませんが、Windowsの場合は「/t」のようにするのでは?

> どこで配布されているんですか?
これまた憶測に過ぎませんが、これかな?
http://www.ant.co.jp/products/sm26_index.html
(やけに高いし、違うかな)

プログラマー希望 2000/02/29(火) 14:38:00
>コマンドラインからのメール成功時に、メール本文はどのように指定しましたか?
コマンドプロンプトの事でよいのでしたら以下の通りです。
>c:\sendmail\sendmail.exe abc@efg.co.jp
>test
>[Ctrl+z]
であってますか?間違ってたらすみません。(ちなみにこのコマンドは
sendmail.exeのあるpcで入力しました。)

無責任官庁 2000/02/29(火) 14:47:04
> sendmail.exeのあるpc

これって、Perlその他の入ってるNTサーバーじゃないんですか?
違うPCだとしたら、話になりませんけど。
(自分のWSにあったとしても、当然ダメだよ)

あと実行権限はどうなんだろ。
Webサーバーは何なんでしょ。

ラウォッチ 2000/02/29(火) 14:55:23
とりあえず、-tオプションは置いといて...。
以下はもう試しましたか〜

             :
        close(TMP_MAIL);
        system('c:\sendmail\sendmail.exe  abc@efg.co.jp < tmp_mailf.txt');
        unlink("tmp_mailf.txt");
             :

プログラマー希望 2000/02/29(火) 14:59:13
>これって、Perlその他の入ってるNTサーバーじゃないんですか?
NTserverです。perlとうもはいっています。
もちろん自分のマシンも。
>(自分のWSにあったとしても、当然ダメだよ)
はい。テストする時とかはFTPソフトでアップしてから行なってます。
>Webサーバーは何なんでしょ。
NTserver+IISです。パージョンは今ちょっと解らないです。(今サーバーにログインできないので。)
(これだけでは説明不足かもしれませんが。)

プログラマー希望 2000/02/29(火) 15:20:01
>system('c:\sendmail\sendmail.exe  abc@efg.co.jp < >tmp_mailf.txt');
は試してみましたがだめでした。憶測なのですがsystem関数はコマンドプロンプト(DOS)が起動するというイメージで良いのでしょうか?
(Webサーバーの)

無責任官庁 2000/02/29(火) 15:50:42
> もちろん自分のマシンも。
どうもこの一言が気になるんですが。

これって全てサーバー上の話なんで、自分のマシンにあろうと無かろうと、
それは全く関係ありませんよ。
ちょっとひつこいかもしれませんけども、
コマンドプロンプトで動作確認したのは、NTサーバーで、ですよね?
自分のPCのコマンドプロンプトじゃないですよね?
sendmail があったとしても、単にそれだけ入れただけじゃ
sendmail.exe  abc@efg.co.jp ではメールは送信できませんよ。
(メールサーバの設定とかの設定ファイルが必要なハズだし)

NTサーバーのコマンドプロンプトで動作するのを確認したら、
そのあと実行権限を確認しましょう。(もちろんサーバーでね)
自分がコマンドプロンプトで実行するのと、Perl が実行するのでは、
認証方式が「匿名」になってる場合は権限が違いますし。
sendmail.exe を右クリックして「プロパティ」の「セキュリティ」タブの
「アクセス権」の表示が、Everyone とかになってると問題無し…
それ以外だと、ちょっと問題。

> コマンドプロンプト(DOS)が起動するというイメージで良いのでしょうか?
>(Webサーバーの)
そんな感じです。

>テストする時とかはFTPソフトでアップしてから行なってます。
まさかとは思いますが、sendmail.exe を FTP してるってコトはないですよね?

プログラマー希望 2000/02/29(火) 16:08:13
> もちろん自分のマシンも
すみませんたいした意味はありません。
>そのあと実行権限を確認しましょう。(もちろんサーバーでね)
すみません。本日はサーバーにログインできないので明日実行させてもらいます。アクセス権の指定をしないとは知りませんでした。(すみません)perlそのもので起動できると思ってました。意味は違うかもしれませんがASPでは動いたもので。
>まさかとは思いますが、sendmail.exe を FTP してるってコトはない>ですよね?
もちろんしてません。

プログラマー希望 2000/03/01(水) 10:28:47
無責任官庁さん昨日の件なのですが、
>「アクセス権」の表示が、Everyone とかになってると問題無し…
「アクセス権」ですが、フルコントロールになっていたので特に問題ないと思います。
コマンドプロンプトでも実行可能でした。
(system関数等はダメでした。)

無責任官庁 2000/03/01(水) 11:08:12
どうも sendmail.exe へのパスが間違ってるような気も
するんですが・・・で、open とか system とか以前にまず、
$sendmail = 'c:\sendmail\sendmail.exe';
if (-f $sendmail){
print "sendmail あります";
open MAIL,"| $sendmail $mailto" or die "Error: open failed!";
#送信処理&close
}else{
print "sendmail 無いです。アクセスできません";
}
とかやってみてはどうでしょう。
これで“ある”と出た場合は、すみません。私には対処法が分かりません。

プログラマー希望 2000/03/01(水) 16:38:35
無責任官庁さんありがとうございます。
>print "sendmail 無いです。アクセスできません";
が出ていました。すみません結局sendmail.exeまでやはりいけてませんでした。それでいろいろ試した結果sendmailフォルダに入れない事が解り、別のフォルダにsendmail.exeを作りました。
そうすると、今度は、
>アクセスが拒否されました。(cgiエラー)
とメッセージが帰ってきました。(アクセス権等の指定はしてないのですが・・・)
なにか良い方法がありましたらご指導下さい。
宜しくお願いします。

プログラマー希望 2000/03/02(木) 13:13:10
色々テストしてみた結果、sendmail.exeもopenできてるようなのですが、結局メールは送信されませんでした。とりあえずsendmail.exeは使えなかったと言う事で一度終わりたいと思います。
又何か方法等ございましたらお知らせ下さい。
皆様のご意見大変参考になりました。
今後とも宜しくお願いします。

プログラマー希望 2000/03/02(木) 13:14:51
[[解決]]
すみませんチェックを入れるのわすれてました。

[上に] [前に] [次に]