作成日:2002年06月15日、更新日:2004年01月10日 作成:鷹の巣

Windowsの自宅サーバーで、Perl で記述されたCGI(Common Gateway Interface)のフォームメールの設置方法を示します。


Windows自宅サーバー用フォームメールの設定例(sendmail.cgi編)

「にゃぁぁぁぁぁぁぁ?」(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編)をお薦めしています。どうしてもご使用される場合のみ、下記の内容を読んで下さい。

まえがき


目次

  1. CGIのインストール先とフォルダの構造
  2. AN HTTPDの設定例
  3. ArGosoft Mail Serverの設定例
  4. postmail.cgiの設定例
  5. sendmail.cgiの設定例
  6. おまけ(sendmail.cgiの単体試験方法)
  7. CGIの動作試験と参考になる関連FAQ

1.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

2.WWWサーバー(AN HTTPD)の設定例

sendmail.cgi用AN HTTPD一般タブの設定例

上記の設定例は、標準インストール状態から、特に重要な設定だけ赤枠で表示しています。

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

sendmail.cgi用AN HTTPD一般タブの設定例(実行プログラム)
もし、間違って「perlIS.dll」にしていたのならば、「perl.exe」に変更して、Windowsを再起動した方が、確実かもしれません。 Windows 2000/XPでしたら、タスクマネージャ画面から、常駐ファイルを削除可能ですけど。

3.ArGosoft Mail Serverの設定例プロバイダのSMTPサーバーを使用する場合は、この項の設定は不要です。)

ArGosoft Mail ServerのOptions画面の設定例です。特に重要な設定だけ赤枠で表示しています。 設定の詳細な内容は、ArGoSoft Mail Server(Windows用メールサーバー)フリーウェア版の設定例の方をご覧願います。
ArGosoft Mail ServerのOptionsのGeneralタブの設定画面例  ArGosoft Mail ServerのOptionsのLocalDomainsタブの設定画面例  ArGosoft Mail ServerのOptionsのPortsタブの設定画面例  ArGosoft Mail ServerのOptionsのLoggingタブの設定画面例  ArGosoft Mail ServerのOptionsのSMTP Authenticationタブの設定画面例

注)
  1. フォームメールのCGIで送信先のメールアドレスが自宅メールサーバーの場合
    上図の様に「SMTP Authentication」タブの「Do NOT Authenticate Following IP Address」欄は、空欄にして下さい。
  2. フォームメールのCGIで送信先のメールアドレスが自宅メールサーバーではない場合
    「SMTP Authentication」タブの「Do NOT Authenticate Following IP Address」欄に「127.0.0.1」を入力して、中継を許可して下さい。 又、CGIにBcc(ブラインド カーボン コピー)を追加改造して、どこにどんな内容が送信されたかをメールで受信した方が管理が楽です。

下図は、ArGosoft Mail ServerのUser Setup画面の設定例です。特に重要な設定だけ赤枠で表示しています。
ArGosoft Mail Serverの新規ユーザー設定画面例 ArGosoft Mail Serverの新規ユーザー追加のGeneralタブの設定画面例
上記の場合は、sendmail.cgiで、「webpage@example.com」というメールアドレスのユーザID「webpage」とユーザパスワード「PASSWORD」を認証に利用してにメールが送信されます。 フォーム入力ページ(postmail.html)で、入力した内容は「webpage@example.com」というメールアドレスのユーザを利用して認証が行われますが、 送信元のメールアドレスと送信先のメールアドレスは、あくまでpostmail.htmlとpostmail.cgiで設定されたメールアドレス間でメールの送受信が行われます。

4.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") { &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;
    }
}
.....以下略.....
注)
  1. 拡張子の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'; なら、送信できます。Windows95の方は、¥記号を使用したパスでしか送信できなかったというご報告を頂いておりますので、ご注意願います。
  2. http://example.com/cgi/postmail/postmail.cgi?mode=check 時に使用します。
  3. 自宅サーバーのLAN 内にプライベートIPアドレスからホスト名への逆引きの名前解決を行っていない場合に、 gethostbyaddr 関数で、time outになり、時間がかかるのを防止する為です。
  4. http://example.com/cgi/postmail/postmail.cgi?mode=check 時以外は、通常、コメント行にして使用します。 このチェックは、設置する場合に便利ですが、フォルダの絶対パスが露出してしまいます。
  5. 本物のsendmailでは、ないためチェックすると誤判定します。20010913.1731.htmlで、いとのページさんが既に書かれていました。
  6. 書き込みがプロキシサーバーからの場合、元IPアドレスも念の為、追加しました。 環境変数の詳細につきましては、CyberSyndrome : ENV Checkerさんにありますので、ご参考にして下さい。

5.sendmail.cgiの設定例

入手先は、「にゃぁぁぁぁぁぁぁ!」さん(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


#◇設定ここまで

.....以下略.....
注)1.プロバイダのSMTPサーバーを使用する場合は、プロバイダのメールアドレスとユーザIDとパスワードを設定して下さい。
 
以上で、http://example.com/cgi/postmail/postmail.htmlに設置したフォームメールから、メールを送信しますと、 メールは、sendmail.cgiで設定した送信元メールアドレス(webpage@example.com)から、 postmail.cgiで設定した送信先メールアドレス(webmaster@example.com)へ、メールが届きます。

もし、メールが届かない場合は、まずSMTPサーバーのログファイルをご確認して下さい。また、過去に掲示板にご質問された方で、「Active Perlをアンインストールし、再度インストールすると難なくフォームメールが送信できた。」というご報告を数多く頂いておりますので、一度お試し願います。

くどいようですが、Windows95/98の方は、Active Perlを利用するのに、win95用mfc42.dllMSI(Microsoft Windows Installer)が必要となりますから、ご注意願います。

その上で、次項を実施するかこちらの「掲示板」にご質問をお寄せ下さい。

6.おまけ(sendmail.cgiの単体試験方法)

No.1943 sendmail.cgi(sendmail.cgiの単体テスト方法)について。を元に説明しますと、

  1. mailtest.txtをコピーして、sendmail.cgiのフォルダにテスト本文のmailtest.txtファイルを入れて下さい。
  2. コマンドプロンプト画面(DOS窓みたいな画面)を開け、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
                                ↑ テストコマンドを実施します。
注)
  1. Perl.exeへのパスの区切り記号は、「¥」を使用して下さい。
  2. cgiファイルの関連付けが出来ていても絶対パスで、D:\Perl\bin\Perl.exeと入力して下さい。
    (メールサーバーにログが記録されてもまともにメールが受信出来ないと思います。)
  3. sendmail.cgiファイルに書式が書かれています。書式: perl sendmail.pl [-itfr] [address]
    この書式に沿って実施しないと、「-t」だけではメールは、受信出来ない可能性もあるかもしれません?

上記のコマンドを実行しますと、SMTPサーバーにログが記録されていることを確認して下さい。 mailtest.txtファイルの先頭行が「To: webmaster@example.com」となっているので、エラーになると考えますが、 SMTPサーバーにログが記録されていれば、まずはSMTPサーバーへの接続は成功したと考えることが出来ます。 勿論、この先頭行を正しい受信メールアドレスに変更すると、メールとして受信出来ます。 "< mailtest.txt"を入れない場合は、 sendmail.cgiは、標準入力(キーボード入力)を要求しますので、mailtest.txtファイルと同等の内容をキーボード入力し、最後に"CTRL"+"Z"キーを同時に押し下げて下さい。

この単体試験が動作して、postmail.cgiが動作しない場合は、一度、perlのアンインストールを行って、再度インストールしてみて下さい。 再インストールによって、postmail.cgiが動作した例も報告されています。

7.CGIの動作試験と参考になる関連FAQ

目次▲頁先頭