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

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


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

以下の説明では、ルータのプライベート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の質疑応答集に作成致しましたので、ご一読願います。

まえがき

目次

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


1.CGIのインストール先とフォルダの構造

フォームメールを設置するのに必要なもの及び条件。(この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

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

sendmane.exe用AN HTTPD一般タブの設定例

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

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

sendmane.exe用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タブの設定画面例
上記の場合は、sendmane.exeで、「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:/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") { &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. このsendmane.exeは、本物のsendmail同様、コマンドラインからの引数を受け取りますので、基本的には、ここだけのCGIの変更で、送信できます。 Windowsのクセが出て、
    $mailprog = 'D:\sendm\sendmane.exe';
    とせずに
    $mailprog = 'D:/sendm/sendmane.exe';
    として下さい。ただし、Windows95の方で、このパス指定を「D:\sendm\sendmane.exe」としないと、送信できなかったというご報告を頂いておりますので、両方試して下さい。
  2. 欠番。
  3. 自宅サーバーのLAN 内にプライベートIPアドレスからホスト名への逆引きの名前解決を行っていない場合に、 gethostbyaddr 関数で、time outになり、時間がかかるのを防止する為です。
  4. http://example.com/cgi/postmail/postmail.cgi?mode=check 時以外は、通常、コメント行にして使用します。 このチェックは、設置する場合に便利ですが、フォルダの絶対パスが露出してしまいます。
  5. 本物のsendmailでは、ないためチェックすると誤判定する可能性が大です。20010913.1731.htmlで、いとのページさんがsendmail.cgiについて既に書かれていました。誤判定した場合は、まずこの行を疑いましょう。
  6. 書き込みがプロキシサーバーからの場合、元IPアドレスも念の為、追加しました。 環境変数の詳細につきましては、CyberSyndrome : ENV Checkerさんにありますので、ご参考にして下さい。

5.sendmane.exeのインストールと設定例

  1. 入手先は、「Naoki's room -なおきの部屋-」の「なおきのパソコン道場!」から、入手します。

  2. フリーウェア:「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 バイトの空き領域
    

  3. 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]:
    
    設定が完了しました。
    
    注)設定例
    1. smtp.provider.co.jp---自宅SMTPサーバーを構築していない方は、プロバイダのSMTPサーバーを指定します。
    2. 192.168.1.2----------自宅SMTPサーバー機のIPアドレスを指定する方法もあります。
    3. 127.0.0.1------------自宅SMTPサーバーとWebサーバーが同じサーバー機の場合、自己診断用IPアドレスを指定します。
  4. 初期設定が終わりましたら、同じフォルダ内にsendmane.iniという設定ファイルが以下の様に出来ていることをメモ帳等で、確認します。

    [SMTP]
    Host=127.0.0.1
    Port=25
    Mail=user@example.com
    [POP3]
    POPUse=0
    Host=
    Port=110
    User=
    Pass=
    
    ここで、再確認。

6.おまけ(sendmane.exeの単体試験方法)

同じフォルダ内に添付してあるread1st.txtの内容に従い、テストメールを送信します。以下の様に何も表示されずにコマンドライン入力になった場合は、正常に送信出来ています。メーラ(メールクライアント)で、webpage@example.comのメールを読み出して下さい。

D:\sendm>type sendtest.txt | sendmane webpage@example.com<---実在する送信先メールアドレスを入力。

D:\sendm>
  1. テストメール送信失敗例1
    以下の「サーバへの接続失敗」は、SMTPサーバーを起動していないか、初期設定でSMTPサーバーの指定方法が間違っています。

    D:\sendm>type sendtest.txt | sendmane webpage@example.com<---実在する送信先メールアドレスを入力。
    Content-type:text/plain
    
    Sendmail.exeでエラーを検出しました。
    
    Error: サーバへの接続失敗
    
    D:\sendm>
    

  2. テストメール送信失敗例2
    以下の「Authentication required for relay」は、初期設定で、送信時のSMTP(POP)認証に利用するメールアドレスの指定が間違っています。 送信先のメールアドレス(webpage@example.com)の指定が間違っている訳ではありませんので、注意して下さい。

    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>
    

以上で、http://example.com/cgi/postmail/postmail.htmlに設置したフォームメールから、メールを送信しますと、 メールは、postmail.cgiで設定した送信先メールアドレス(webmaster@example.com)へ、メールが届きます。
sendmane.iniで設定したメールアドレス(webpage@example.com)は、単にSMTPサーバーを利用する為のメールアドレスであることに注意して下さい。

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

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

その上で、こちらの「掲示板」にご質問をお寄せ下さい。

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

目次▲頁先頭