|目次|手順 0|1|2|3|A|B|C|D|E|F|G|H| I |J|K|L|M|N|O|P|Q|
作成日:2002年06月15日、更新日:2003年01月26日 作成:鷹の巣Windowsの自宅サーバーで、Perl で記述されたCGI(Common Gateway Interface)のフォームメールの設置方法を示します。
以下の説明では、ルータのプライベートIPアドレス(局所機番)を192.168.1.1とし、
サーバをインストールしたマシンのプライベートIPアドレス(局所機番)を192.168.1.2としています。
このページは、Windows95/98/ME/2000/XPの自宅サーバー用フォームメールCGIに特化しています。
このページでは、特に断らない限り、CGIとは、Active Perl(Windows版Perl5)を指します。
CGIを改造する場合は、自己責任で、実施して下さい。又、CGI改造に関して、作者の方へ絶対にご質問しないで下さい。
ご質問は、こちらの「掲示板」にお寄せ下さい。
制約の多いWindows用でのPerlで記述されたCGIに特化した質疑応答集を自宅サーバー用CGIの質疑応答集に作成致しましたので、ご一読願います。
Web上からメールを送信するには、html ファイルに「mailto:webmaster@example.com?subject=表題&body=本文%0D%0A内容」を埋め込むと、 メールの表題と内容の一部を含んだメールを送信することが出来ます。右のリンクをクリックするとメールの表題と本文付きのメーラが起動します。
アンケート等の複雑な内容のメールをWeb上からメールフォームで送信するには、CGIを使用することになりますが、 このCGIがほとんどがSMTPサーバーのsendmailを使用することを前提に作成されています。
PC-UNIXユーザーは、コマンドラインから、送信できるsendmailやそれ以外のsendmail wrapperを使用すれば、 たいした改造をしなくてもCGIをそのまま使用することが出来ます。
Windowsユーザーは、コマンドラインから、送信できるsendmailとして振舞うsendmail wrapperを使用すれば、 たいした改造をしなくてもCGIをそのまま使用することが出来ます。これが現在、最も簡単です。 なおきの部屋[XOOPS版]のsendまね~るのDOWNLOADSから、sendmXXX.lzh(サイズ:約90KB)を ダウンロードして、インストールすれば、sendmane.exeをCGIから、使用することが出来ます。
sendmailへのパス
$sendmail = 'usr/lib/sendmail';を
$sendmail = 'D:/sendm/sendmane.exe';に変更
あまりお薦めしませんが、Windows自宅サーバー用フォームメールの設定例(sendmail.cgi編)もあります。
目次
1.CGIのインストール先とフォルダの構造
2.AN HTTPDの設定例
3.ArGosoft Mail Serverの設定例
4.postmail.cgiの設定例
5.sendmaneのインストールと設定例
6.おまけ(sendmane.exeの単体試験方法)
7.CGIの動作試験と参考になる関連FAQ
フォームメールを設置するのに必要なもの及び条件。(このWebページで、説明している内容です。)
下記のファイルの配置で、以降の内容を説明しますので、ご自身の環境に読み替えて下さい。
| フォルダと主たるファイルの配置例 | 主たるファイルのHTTPアクセス方法 | 補足説明 |
|---|---|---|
| D:\Perl\bin\perl.exe | - | Active Perlの実行ファイル |
| D:\sendm | - | sendmaneのインストール先フォルダ |
| D:\sendm\sendmane.exe | - | sendmail wrapperの実行ファイル |
| D:\WWW\public_html | - | HTTPのドキュメントルートフォルダ |
| D:\WWW\public_html\index.html | http://example.com/index.html | ホームページ |
| D:\WWW\public_html\cgi | - | CGI専用フォルダ |
| D:\WWW\public_html\cgi\postmail | - | postmailのインストール先フォルダ |
| D:\WWW\public_html\cgi\postmail\postmail.html | http://example.com/cgi/postmail/postmail.html | 公開するフォームメール |
| D:\WWW\public_html\cgi\postmail\postmail.cgi | http://example.com/cgi/postmail/postmail.cgi | フォームメール用CGI |

上記の設定例は、標準インストール状態から、特に重要な設定だけ赤枠で表示しています。
赤丸のチェック部分は、CGIだけの設置でしたら、外しておいてSSI等の実行出来なくすることをお薦めします。
拡張子の「.pl,.cgi」の場所をダブルクリックしますと、下記の「実行プログラム」の画面が出ますので、
下記の赤枠部分のみを設定します。
実行ファイルは、必ず「perl.exe」とします。
絶対に「perlIS.dll」にしてはいけません。

もし、間違って「perlIS.dll」にしていたのならば、「perl.exe」に変更して、Windowsを再起動した方が、確実かもしれません。
Windows 2000/XPでしたら、タスクマネージャ画面から、常駐ファイルを削除可能ですけど。
ArGosoft Mail ServerのOptions画面の設定例です。特に重要な設定だけ赤枠で表示しています。
設定の詳細な内容は、ArGoSoft Mail Server(Windows用メールサーバー)フリーウェア版の設定例の方をご覧願います。
下図は、ArGosoft Mail ServerのUser Setup画面の設定例です。特に重要な設定だけ赤枠で表示しています。

上記の場合は、sendmane.exeで、「webpage@example.com」というメールアドレスのユーザID「webpage」とユーザパスワード「PASSWORD」を認証に利用してにメールが送信されます。
フォーム入力ページ(postmail.html)で、入力した内容は「webpage@example.com」というメールアドレスのユーザを利用して認証が行われますが、
送信元のメールアドレスと送信先のメールアドレスは、あくまでpostmail.htmlとpostmail.cgiで設定されたメールアドレス間でメールの送受信が行われます。
下記の改造を施したKENT WEBさんのpostmail.cgi改を置いておりますので、ご使用して下さい。
著作権や配布規定は、KENT WEBさんのWebページの記載事項を厳守する必要があります。
#!/usr/local/bin/perl <----- AN HTTPDでは、通常この行は、無視するようになっています。 #┌───────────────────────────────── #│ PostMail v1.8 (2002/05/22) #│ Copyright(C) Kent Web 2002 #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── .....中略..... #------------# # 基本設定 # #------------# # 文字コード変換ライブラリ $jcode = './jcode.pl'; # MIMEエンコードライブラリを使う場合(推奨) # → メールヘッダの全角文字をBASE64変換する機能 # → mimew.plを指定 $mimer = './mimew.pl'; # メールソフトまでのパス # → sendmailの例 :/usr/lib/sendmail # → BlatJの例 :c:\blatj\blatj.exe # $mailprog = '/usr/lib/sendmail'; $mailprog = 'D:/sendm/sendmane.exe'; #<---注)1 # 送信先メールアドレス $mailto = 'webmaster@example.com'; # 送信前確認 # 0 : no # 1 : yes $preview = 1; # メールタイトル $subject = "フォームメール"; # スクリプト名 $script = './postmail.cgi'; # 送信後の戻り先 $back = '/index.html'; # method形式 (POST or GET) $method = 'POST'; # 送信は method=POST 限定 (0=no 1=yes) # → セキュリティ対策 $postonly = 1; # bodyタグ $body = '<body bgcolor="#F1F1F1" text="#000000" link="#000FF" vlink="#800080">'; # プレビュー画面の枠の色 $tbl_col1 = "#800040"; # プレビュー画面の下地の色 $tbl_col2 = "#FFFFFF"; # LAN 内のプライベートセグメントアドレス(192.168.1.0)を設定して、 # LAN 内からのアクセス(192.168.1.*)に対して、gethostbyaddr関数が実行されないようにします。 # わかない場合は、LAN内のクライアント機のプライベートアドレスを設定して下さい。 $PrivateSegAddr = '192.168.1.0'; #<---------------------------------------------------注)3 #------------# # 設定完了 # #------------# .....中略..... # デコード処理 require $jcode; &decode; # チェックモード #if ($in{'mode'} eq "check") { ✓ } <------------- 必ず、コメント行にして下さい。注)4 # POSTチェック if ($postonly && !$postflag) { &error("不正なアクセスです"); } # メールプログラムのパスチェック/種類チェック #unless (-e $mailprog) { &error("メールプログラムのパスが不正です"); }<--- 必ず、コメント行にして下さい。注)5 if ($mailprog =~ /blat/i) { $prog_type=2; } else { $prog_type=1; } .....中略..... # sendmail送信 else { $mail_body .= "「$subject」よりメールの発信がありました.\n\n"; $mail_body .= "送信日時:$date\n"; $mail_body .= "ブラウザ:$ENV{'HTTP_USER_AGENT'}\n"; # $mail_body .= "ホスト名:$host\n\n"; <----------------------------------------------注)6 $mail_body .= "ホスト名:$host ($addr)\n"; $mail_body .= "[ 元IPアドレス:$ENV{'FORWARDED_FOR'} - $ENV{'HTTP_X_FORWARDED_FOR'} ]\n\n"; foreach (@key) { .....中略..... #----------------# # ホスト名取得 # #----------------# sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; # LAN 内からのアクセスに対して、gethostbyaddr関数が実行されないようにします。 <------注)3 if (pack("C3", split(/\./, $addr)) eq pack("C3", split(/\./, $PrivateSegAddr))) { $host = $addr; } elsif ($host eq "" || $host eq $addr) { # if ($host eq "" || $host eq $addr) { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2) || $addr; } } .....以下略.....
入手先は、「Naoki's room -なおきの部屋-」の「なおきのパソコン道場!」から、入手します。
フリーウェア:「sendまね~る」のsendmXXX.lzh(サイズ:約90KB)をダウンロードして解凍し、フォルダ名をsendmに変更します。このフォルダ内にD:\sendm\sendmane.exeがあることを確認します。
C:\>D:↓
D:\>cd sendm↓
D:\sendm>dir↓
ドライブ D のボリューム ラベルは Share です
ボリューム シリアル番号は 84B6-19A1 です
D:\sendm のディレクトリ
2002/12/08 10:13 <DIR> .
2002/12/08 10:13 <DIR> ..
2002/12/07 01:17 4,757 read1st.txt
2002/12/07 00:58 161,792 sendmane.exe
2002/12/08 10:11 110 sendmane.ini
2002/12/07 01:17 5,119 sendtest.txt
4 個のファイル 171,778 バイト
2 個のディレクトリ xxx バイトの空き領域
sendmane.exeを起動して初期設定を行います。
D:\sendm>sendmane.exe↓ ******** sendまね~る * 初期設定 ********* [ ]内は、現在の値です。変更のない時は [Enter]だけを押してください。 SMTPサーバのアドレス?(IPを奨励) []:127.0.0.1↓<--------------------------------注 SMTPポート番号?(通常は25) [25]:↓ 送信者のメールアドレスとは、SMTPサーバとの (接続)通信時に使用されるメールアドレスです。 通常、受信者は知ることができません。 SMTPサーバによっては、メールアドレスにより 接続を許可しているところがありますので その場合は適切なアドレスを設定してください。 送信者のメールアドレス? []:user@example.com↓<-----------------------送信時のSMTP(POP)認証に利用する実在するメールアドレスを入力。 POP before SMTPの使用 Yes=1 No=0 ? [0]:↓ 設定が完了しました。
初期設定が終わりましたら、同じフォルダ内にsendmane.iniという設定ファイルが以下の様に出来ていることをメモ帳等で、確認します。
[SMTP] Host=127.0.0.1 Port=25 Mail=user@example.com [POP3] POPUse=0 Host= Port=110 User= Pass=
同じフォルダ内に添付してあるread1st.txtの内容に従い、テストメールを送信します。以下の様に何も表示されずにコマンドライン入力になった場合は、正常に送信出来ています。メーラ(メールクライアント)で、webpage@example.comのメールを読み出して下さい。
D:\sendm>type sendtest.txt | sendmane webpage@example.com<---実在する送信先メールアドレスを入力。 D:\sendm>
テストメール送信失敗例1
以下の「サーバへの接続失敗」は、SMTPサーバーを起動していないか、初期設定でSMTPサーバーの指定方法が間違っています。
D:\sendm>type sendtest.txt | sendmane webpage@example.com<---実在する送信先メールアドレスを入力。
Content-type:text/plain
Sendmail.exeでエラーを検出しました。
Error: サーバへの接続失敗
D:\sendm>
テストメール送信失敗例2
以下の「Authentication required for relay」は、初期設定で、送信時のSMTP(POP)認証に利用するメールアドレスの指定が間違っています。
送信先のメールアドレス(webpage@example.com)の指定が間違っている訳ではありませんので、注意して下さい。
プロバイダのSMTPサーバー(smtp.provider.co.jp)を指定している場合
実在するプロバイダのメールアドレス(user@smtp.provider.co.jp)を指定していますか?
自宅SMTPサーバー(127.0.0.1)を指定している場合
実在する自宅SMTPサーバーのメールアドレス(user@example.com)を指定していますか?
送信先メールアドレス(webpage@example.com)が自宅SMTPサーバーの管理するメールアドレス以外である場合は、自宅SMTPサーバーにメールの中継設定をする必要があります。ArGoSoft Mail Serverフリーウェア版の場合は、SMTP Authenticationタブの設定で、Do Not Authenticate Following IP Address欄に、メール送信に認証を必要としないWebサーバーのIPアドレスを入れて下さい。(認証を必要としない=ユーザー名とパスワードは何を入れても送信出来ます。)
D:\sendm>type sendtest.txt | sendmane webpage@example.com<---実在する送信先メールアドレスを入力。
Content-type:text/plain
Sendmail.exeでエラーを検出しました。
Error: 550 User not local. Authentication required for relay
D:\sendm>
もし、メールが届かない場合は、まずSMTPサーバーのログファイルをご確認して下さい。また、過去に掲示板にご質問された方で、「Active Perlをアンインストールし、再度インストールすると難なくフォームメールが送信できた。」というご報告を数多く頂いておりますので、一度お試し願います。
くどいようですが、Windows95/98の方は、Active Perlを利用するのに、win95用mfc42.dllとMSI(Microsoft Windows Installer)が必要となりますから、ご注意願います。
その上で、こちらの「掲示板」にご質問をお寄せ下さい。CGIの設置の一般的なことは
KENT WEBさんのユーティリティ(Utility)でCGIの色んな試験が出来ます。
又、サポート・コーナー内のリンク先やFAQのページや過去ログ・キーワード検索が参考になります。
CGIの設置に関するより詳細なことは
AN HTTP Server Home PageさんのAN HTTP Server FAQ/Search、
いとのページさんのAN HTTP Server FAQ2とWinsock Error CodeとAN HTTPDエラーメッセージ集、
自宅サーバー用CGI(Common Gateway Interface)の質疑応答集