|目次|手順 0|1|2|3|A|B|C|D|E|F|G|H| I |J|K|L|M|N|O|P|Q|
作成日:2002年06月15日、更新日:2004年01月10日 作成:鷹の巣Windowsの自宅サーバーで、Perl で記述されたCGI(Common Gateway Interface)のフォームメールの設置方法を示します。
「にゃぁぁぁぁぁぁぁ?」(http://wan.magical.gr.jp/)さんのMS-Windows用sendmail.cgiは、現在配布されていませんので、ご注意願います。
以下の説明では、ルータのプライベートIPアドレス(局所機番)を192.168.1.1とし、
サーバをインストールしたマシンのプライベートIPアドレス(局所機番)を192.168.1.2としています。
このページは、Windows95/98/ME/2000/XPの自宅サーバー用フォームメールCGIに特化しています。
このページでは、特に断らない限り、CGIとは、Active Perlを指します。
CGIを改造する場合は、自己責任で、実施して下さい。又、CGI改造に関して、作者の方へ絶対にご質問しないで下さい。
ご質問は、こちらの「掲示板」にお寄せ下さい。
制約の多いWindows用でのPerlで記述されたCGIに特化した質疑応答集を自宅サーバー用CGIの質疑応答集に作成致しましたので、ご一読願います。
現在は、最も簡単な
Windows自宅サーバー用フォームメールの設定例(sendmane.exe編)をお薦めしています。どうしてもご使用される場合のみ、下記の内容を読んで下さい。
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自宅サーバー用フォームメールの設定例(sendmane.exe編)」をご参照願います。
Windowsユーザーは、blatjを使用する方法がありますが、CGIをそのまま使用する訳には行きませんし、 これに対応しているCGIのソースリストは、限られたものになります。 この方法は、既に自宅マシンメール送信計画(Blatj編)さんにありますので、そちらをご覧願います。 KENT WEBさんのPostMailをご利用されるのでしたら、そちらの方をお薦めします。
このWebページでは、Windows用のArGoSoft Mail ServerのFreeware versionをsendmailのように振舞えるsendmail.cgiという
perlスクリプトを使用する方法を紹介します。
実際の使用例として、メール本文を削除した形が、自宅メールサーバー(SMTPサーバー)受信試験です。
紹介する理由は、以下の通りです。
いきさつ
掲示板で、以下の様なご質問を受け
No.776 ArGosoft Mail Server をsendmailとして使用してフォームメイルが送れない(未解決)。
No.817 ArGosoft Mail Serverのsendmail wrapperを使用する方法
今までは、Windowsで自宅サーバを作ろう!さんのサイトにお願いして、「ArGosoft Mail Server + sendmail wrapperでSendmail構築」
という内容を作成して頂いておりました。しかし、OSがWindowsから、FreeBSDに変わられ、サポート出来ないというご連絡を頂きました。
従って、CGIの初心者である私が無謀にも設定例を公開し、サポートすることと致しました。
目次
フォームメールを設置するのに必要なもの及び条件。(このWebページで、説明している内容です。)
下記のファイルの配置で、以降の内容を説明しますので、ご自身の環境に読み替えて下さい。
| フォルダと主たるファイルの配置例 | 主たるファイルのHTTPアクセス方法 | 補足説明 |
|---|---|---|
| D:\Perl\bin\perl.exe | - | Active Perlの実行ファイル |
| 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 |
| D:\WWW\public_html\cgi\sendmail | - | sendmailのインストール先フォルダ |
| D:\WWW\public_html\cgi\sendmail\sendmail.cgi | http://example.com/cgi/sendmail/sendmail.cgi | ArGosoft Mail Serverの仲介Perl |

上記の設定例は、標準インストール状態から、特に重要な設定だけ赤枠で表示しています。
赤丸のチェック部分は、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画面の設定例です。特に重要な設定だけ赤枠で表示しています。

上記の場合は、sendmail.cgiで、「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:/Perl/bin/Perl.exe D:/WWW/public_html/cgi/sendmail/sendmail.cgi'; #<---注)1 # $mailprog = 'D:/WWW/public_html/cgi/sendmail/sendmail.cgi'; <-----------------------注)2 # 送信先メールアドレス $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; } } .....以下略.....
入手先は、「にゃぁぁぁぁぁぁぁ!」さん(http://wan.magical.gr.jp/)のMS-Windows用sendmailのwsendmail.txtから、入手して、下記の編集を行い、 ファイル名をsendmail.cgiに変更し、D:\WWW\public_html\cgi\sendmailのフォルダ内に置いて下さい。
#======================================================================# # sendmail.pl for ActivePerl 5.6.1.628 #======================================================================# # 書式 : perl sendmail.pl [-itfr] [address] # 配布元: http://wan.magical.gr.jp #======================================================================# # 設定 #◇SMTPサーバ # $smtp = "SMTPメールサーバ.com"; #$smtp = "smtp.provider.co.jp"; #自宅SMTPサーバーを構築していない方は、プロバイダのSMTPサーバーを指定します。 #$smtp = "192.168.1.2"; #自宅SMTPサーバー機のIPアドレスを指定する方法もあります。 $smtp = "127.0.0.1"; #自宅SMTPサーバーとWebサーバーが同じサーバー機の場合、自己診断用IPアドレスを指定します。 #◇標準 FORM アドレス # $from = 'メールアドレス@SMTPメールサーバ.com'; $from = 'webpage@example.com'; #<---自宅SMTPサーバーのメールアドレス(webpage@example.com)を専用に割り当てます。注)1 #◇ エラーログの作成(sendmail.log) $logs = 1 ; #◇ タイムアウト秒数 (デフォルト推奨) $timeout = 20; #◇ アラームファイル (デフォルト推奨) $alarm =".alarmpid"; #======================================================================# #◇POP before SMTPを使用する yes=1 no=0 # $pop_before_smtp = 0; $pop_before_smtp =1; #自宅SMTPサーバーがArGosoft Mail Serverの場合、SMTP認証ですが1に設定しパスワード認証します。 #◇ POP3サーバアドレス # $pop3 = "202.248.37.133"; #$pop3 = "pop3.provider.co.jp"; #自宅SMTPサーバーを構築していない方は、プロバイダのSMTPサーバーを指定します。 #$pop3 = "192.168.1.2"; #自宅SMTPサーバー機のIPアドレスを指定する方法もあります。 $pop3 = "127.0.0.1"; #自宅POP3サーバーとWebサーバーが同じサーバー機の場合、自己診断用IPアドレスを指定します。 #◇POP3接続用 USER-ID/PASSWORD $user = 'webpage'; #<---自宅SMTPサーバーのメールアドレス(webpage@example.com)のユーザ名(webpage)を設定します。注)1 $pass = 'PASSWORD'; #<---------自宅SMTPサーバーのメールアドレス(webpage@example.com)のパスワードを設定します。注)1 #◇設定ここまで .....以下略.....
もし、メールが届かない場合は、まずSMTPサーバーのログファイルをご確認して下さい。また、過去に掲示板にご質問された方で、「Active Perlをアンインストールし、再度インストールすると難なくフォームメールが送信できた。」というご報告を数多く頂いておりますので、一度お試し願います。
くどいようですが、Windows95/98の方は、Active Perlを利用するのに、win95用mfc42.dllとMSI(Microsoft Windows Installer)が必要となりますから、ご注意願います。
その上で、次項を実施するかこちらの「掲示板」にご質問をお寄せ下さい。No.1943 sendmail.cgi(sendmail.cgiの単体テスト方法)について。を元に説明しますと、
C:\>D: <--------------------------------- sendmail.cgiのドライブに移動します。
D:\>cd \WWW\public_html\cgi\sendmail <--- sendmail.cgiのフォルダに移動します。
D:\WWW\public_html\cgi\sendmail>D:\Perl\bin\Perl.exe < mailtest.txt sendmail.cgi -t
↑ テストコマンドを実施します。
上記のコマンドを実行しますと、SMTPサーバーにログが記録されていることを確認して下さい。 mailtest.txtファイルの先頭行が「To: webmaster@example.com」となっているので、エラーになると考えますが、 SMTPサーバーにログが記録されていれば、まずはSMTPサーバーへの接続は成功したと考えることが出来ます。 勿論、この先頭行を正しい受信メールアドレスに変更すると、メールとして受信出来ます。 "< mailtest.txt"を入れない場合は、 sendmail.cgiは、標準入力(キーボード入力)を要求しますので、mailtest.txtファイルと同等の内容をキーボード入力し、最後に"CTRL"+"Z"キーを同時に押し下げて下さい。
この単体試験が動作して、postmail.cgiが動作しない場合は、一度、perlのアンインストールを行って、再度インストールしてみて下さい。 再インストールによって、postmail.cgiが動作した例も報告されています。
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)の質疑応答集