Baba Centerfolds FAQ

Baba Centerfolds が1997年12月にスタートしてはや3年。少々おこがましいですが FAQ を作りました。
まぁ、一応ご覧ください。といいつつもう6周年(笑)。

BASP21 Pro は、絶賛販売中。 BASP21 Proは、こちらで購入できます。

1999.12.1 初出
2003.9.19 更新

目次

基礎編

  1. BASP21を商用利用または会社の業務で使ってもかまいませんか
  2. BASP21を使いたいのですが会社の方針でフリーウエアは使っちゃダメといわれました
  3. ホームページにリンクしたいのですが
  4. Centerfolds ってなんでしょう
  5. ハンドル名 babaq について
  6. BASP21 のASPの意味は
  7. 思ったように動かないのですが
  8. 今動いているBASP21のバージョンを知りたいのですが
  9. マニュアルはないのですか
  10. 英語版のマニュアルはないのですか
  11. BASP21ファミリーってなに
  12. ソースコードは公開しないのですか
  13. BASP21 Pro(商用バージョン)はいつ出荷で特徴は

メール編

  1. メールアドレスの中に日本語は使えるの
  2. HTML形式でメールを出したい
  3. To field invalid ってどんなエラー
  4. Cant connect Server 11001 っていったい
  5. 501 Syntax error がでました
  6. メールを送ったのですが本文の途中が文字化けしてます
  7. 本文の改行はどうするの
  8. 他の文字セット例えばBIG5でメールを出したい
  9. メモ帳に受信メールを表示したい
  10. ASPでメールを送るとき "File notfound" が返る
  11. クライアントのファイルをサーバ側でSendMailしたい
  12. 1回のSendMail呼出しで送れる最大アカウント数は
  13. メール送信を早くするには
  14. mailto/mailfromパラメータはどのように送られるのですか
  15. メール送信時にBASP21が勝手に半角カナを全角にしてません?
  16. どうしても半角カナやiモードの絵文字を送りたい
  17. 決まった日時に自動的にメールを送りたい
  18. EZwebにクリッカブルURLメールを送りたい
  19. 開封確認メールを送ってもらうには
  20. 英語版WindowsでSendMailが文字化けします
  21. FlushMailメソッドってよくわかりません
  22. ドコモのメールアドレス(xxxx...xxx@xxxやxxxx.@xxx)がエラーで送れない
  23. 587番ポートで送信したい

BASP21メソッド編

  1. BASP21のSpaceメソッドはなんであるの
  2. W3getやGetFileメソッドでサーバ側にファイルが作成されてしまうのですが
  3. MD5メソッドってなんでしょう
  4. JavaScript でReadDir やFGrep などの配列を返すメソッドが動かないような
  5. ソケットオブジェクトでtelnetしたい
  6. C++ でBASP21を使うには
  7. Windows NT/2000+クリスタルレポート8で「ライブラリが登録されていない」
  8. メッセージ一覧はないの

ファイルアップロード編

  1. 動くサンプルを見せて
  2. Request.Form コレクションを使用できません というエラー
  3. Request.Form コレクションを使用した後には BinaryRead を呼び出せません とういうエラー
  4. 他にアップロード機能をもつコンポーネントはありますか
  5. ブラウザからではなく、WSH や VB からアップロードしたい
  6. MAC+Netscape で日本語ファイル名が %93%FA%96%7B%8C%EA.txt のようになってしまう
  7. アップロード中にブラウザの中止ボタンを押すとサーバがCPU使用率100%になる
  8. MAC+IE4.xでアップロードファイルの先頭の余分なデータを取るには
  9. ファイル名をあらかじめ固定してアップロードしたいです
  10. FormSaveAsメソッドで -2
  11. アップロード状況を確認したい
  12. ディレクトリ単位でどっとアップロードしたい
  13. 複数サーバに1クリックでアップロードしたい
  14. ファイルをドラッグ&ドロップで指定したい
  15. JScript でFormSaveAsが-3
  16. ブラウザからのアップロード内容を確認したい
  17. RFC1867ってなんでしょう
  18. IISで他のマシンの共有フォルダにアクセスしたい
  19. Windows 2003+IIS6で200KBを超えるファイルがアップロードできない 2003/09/19 New

COM(Component Object Model)編

  1. BASP21.DLL だけが COM サーバですか
  2. COM サーバは、レジストリに登録するって聞きました
  3. それで、COM サーバってなんでしょう
  4. どうやってメソッドを呼出すんでしょうか
  5. BASP21.TLB って何に使うの
  6. 作成したオブジェクトの開放はどうするの

正規表現編

  1. Perlのマッチ変数 $` $' $& $1 $2 $3.. に対応する機能は使えますか
  2. () を使いたいがメモリに記憶させない方法
  3. 全角の正規表現がうまくいかない

その他編

  1. 伊南村ってどこ
  2. Patriciaって気になります
  3. VBScriptで文字列のバイト数を知るには
  4. Response Center の記事を削除したいのですが
  5. Response Center のオプションですけど、選んでも何も変わりません
  6. ASPでサーバ側で印刷したい
  7. BASP21 が使えるプロバイダは

基礎編

  1. BASP21を商用利用または会社の業務で使ってもかまいませんか
    まったくかまいません。ご自由にどうぞ。不具合の報告も気軽に レスポンスセンタへどうぞ。 再配布 OK。 配布ソフトのインストーラーの中にBASP21を同梱してもOK。
  2. BASP21を使いたいのですが会社の方針でフリーウエアは使っちゃダメといわれました
    まあひとそれぞれに事情はあります。次から答えを見つけてください。
    • 商用バージョンBASP21 Proを使う(2001年4月1日出荷開始)
    • 上司をなんとか説得する
    • 他の商用ソフトを使う
    • 自分で作る
    • こっそり使う
    • あきらめる
  3. ホームページにリンクしたいのですが
    ご自由にどうぞ。Response Center や他のページに直接リンクしてもかまいません。
  4. Centerfolds ってなんでしょう
    雑誌の真ん中にある見開きページのことです。それを真っ先にみる人が多いようです。 注目を集めるようなページにしたかったからです。 特定の雑誌やよく訪問したサイトの名前からとったわけではありません。 私のURLを忘れたとき、インターネットで Centerfolds で検索することはあまりお勧めしません。 babaq か BASP21 で検索しましょう。
  5. ハンドル名 babaq について
    これは、次のような意味があるようです。
    □Quality の Q (50%)
    □Quick レスポンス/サポートの Q (10%)
    □オバQと babaq でごろがいいから (10%)
    □シャランQ というバンドがいたから (10%)
    □誰も使ってないハンドル名と思われるので (10%)
    □顔がキューピーみたいといわれて悲しかったから (笑...10%)
    
  6. BASP21 のASPの意味は
    Active Server Pages です。Windows NT の Webサーバで動かす CGI みたいなしくみをいいます。 このASP環境でメール問題を解決する目的で登場したのが BASP21。詳しくは、 BASP21 小史をどうぞ。 でもASPだけでなく、Visual BasicやWSH(Windows Scripting Host)で使うことができます。 もちろん、B は、Baba のことです。
  7. 思ったように動かないのですが
    まず、 最新版をダウンロードしてみてください。 それでも動かなかったら、 Response Centerという掲示板があります。ここに質問をなさるといいと思います。
  8. 今動いているBASP21のバージョンを知りたいのですが
    Versionメソッドを使うと BASP21.DLL と BSMTP.DLL のバージョンがわかります。
    ver = bobj.Version()
    次のようにバージョン文字が返ります。
    BASP21.DLL = Sep 11 2001 BSMTP.DLL = Sep 11 2001
    Versionメソッドがエラーで呼出せないときは、あなたのBASP21は古すぎ。 バージョンアップをお勧めします。
    BASP21更新履歴はこちら
  9. マニュアルはないのですか
    次の HTML 文書があります。
    ファイル名対象説明
    faq.html FAQ 本書です。最初に読みましょう。
    basp21.html BASP21.DLL BASP21のメイン文書です。次に読みましょう。
    basp21s.html BASP21.DLL BASP21のSocketオブジェクトの使い方の説明があります。
    basp21f.html BASP21.DLL BASP21のFTPオブジェクトの説明です。
    bsmtp.html BSMTP.DLL BSMTP.DLL を使うとメールの送受信が簡単にできます。 BSMTP.DLL を単独で使うときに参考にどうぞ。
    bregexp.html BREGEXP.DLL BREGEXP.DLL は、Perl5の正規表現を実装してます。 C++などからBREGEXP.DLL を直接使いたいとき。 正規表現についても説明があります。
    bsendm.html BSENDM.EXE コマンドラインから実行できるメール送信アプリケーションの説明があります。 メールをバッチ処理で送信するときに使います。
    bcount.html BCOUNT.DLL カウンターエンジンの説明があります。 Visual Basic からBCOUNT.DLL を使ったサンプルがあります。
    binetx.html BINETX.DLL HTTP/FTPエンジンの説明があります。 Visual Basic/Visual C++ からBINETX.DLL を使ったサンプルがあります。
    vbtips.html BSMTP.DLL
    BREGEXP.DLL
    Visual Basic からBSMTP.DLL/BREGEXP.DLL を使ったサンプルがあります。
    mhead.html メールヘッダー メールヘッダーは、メールを送受信するための基礎となります。
    history.html BASP21ファミリー BASP21小史。BASP21のちょっとした歴史を説明してます。
    bfup.html BFup ActiveX コントロール ファイルのアップロードをもっとスマートに実行したい方、必見。
  10. 英語版のマニュアルはないのですか
    あります。TK Upperfield さんと Hippo2000 さんに作っていただきました。ありがとうございます。
    ファイル名対象説明
    basp21.html BASP21.DLL BASP21のメイン文書です。次に読みましょう。
    basp21s.html BASP21.DLL BASP21のSocketオブジェクトの使い方の説明があります。
    basp21f.html BASP21.DLL BASP21のFTPオブジェクトの説明です。
    bsmtp.html BSMTP.DLL BSMTP.DLL を使うとメールの送受信が簡単にできます。 BSMTP.DLL を単独で使うときに参考にどうぞ。
    bregexp.html BREGEXP.DLL BREGEXP.DLL は、Perl5の正規表現を実装してます。 C++などからBREGEXP.DLL を直接使いたいとき。 正規表現についても説明があります。
    bsendm.html BSENDM.EXE コマンドラインから実行できるメール送信アプリケーションの説明があります。 メールをバッチ処理で送信するときに使います。
    bcount.html BCOUNT.DLL カウンターエンジンの説明があります。 Visual Basic からBCOUNT.DLL を使ったサンプルがあります。
    mhead.html メールヘッダー メールヘッダーは、メールを送受信するための基礎となります。
  11. BASP21ファミリーってなに
    BASP21がサポートする機能は、BASP21.DLL ファイルだけで実現されていません。 複数の DLL や EXE でそれらの機能が実装されています。 BASP21をインストールすると次のように複数のファイルがコピーされます。
    • BASP21.DLL
    • BSMTP.DLL
    • BREGEXP.DLL
    • BCOUNT.DLL
    • BINETX.DLL
    • BSENDM.EXE
    • BASP21.TLB(タイプライブラリ)
    これらのファイルを総称してBASP21ファミリーと呼ぶことがあります。 BASP21.DLL のメソッドを実行すると、これらのDLL が間接的に呼ばれます。 それぞれのDLLやEXEは、再利用やメンテナンスを考慮して設計されていますので、 BASP21.DLL からだけでなく、単体での利用が可能です。 単体での使い方は、それぞれの ページに解説があります。
    例えば、メール機能をVisual Basic で利用する場合は、BSMTP.DLL のみを使えばいいのです。
  12. ソースコードは公開しないのですか
    「オープンソースがはやりなのになぜ公開しないのですかぁ。」
    「早くっ。3つ数えるうちにだしなさいよ、1、2、、、」
    そういわれてもね。自己都合です。 えーと現在公開しているものは:
    BCOUNT.DLL(win32)
    Bregexp ライブラリ (linux)
    Bsmtp ライブラリ (linux) 
    bsendm (linux) 
    
    だけ。
  13. BASP21 Pro(商用バージョン)はいつ出荷で特徴は
    BASP21 Pro は、2001年4月1日に出荷を開始いたしました。
    詳細は、BASP21 Pro FAQをどうぞ。

メール編

  1. メールアドレスの中に日本語は使えるの
    使えます。次のようにメールID の前におきます。 メールIDは、半角の<> で囲んでください。
    馬場さん<xxxx@xxxx.xxx>

    また、次のようにメールIDの後ろに、半角の()の中に日本語を入れてもかまいません。
    xxxx@xxxx.xxx(馬場さん)
    2003
  2. HTML形式でメールを出したい 2003/02/11 Update
    次のようにContent-TypeヘッダーをメールIDの前に指定してください。
    mailto=">Content-Type: text/html; charset=iso-2022-jp" & vbTab & "mail-id"
    body="<HTML><BODY bgcolor=#008284><H1>こんにちは</H1>さようなら</BODY></HTML>"
    
    HTML形式のメールは、OutlookなどのMicrosoft系のメーラでサポートされています。
    「花粉バージョン(2,3,2,11)」なら HTMLメールでの画像埋めこみができます。
    '-- HTML 画像埋めこみサンプル  test.vbs ---
    set bobj=CreateObject("basp21")
    svr="your-server"
    mailaddr = "your@address"
    mh = ">Content-Type: text/html; charset=iso-2022-jp"
    mto = mh & vbtab & mailaddr
    mfrom = mailaddr
    subj="試験"
    backjpeg = "c:\temp\yourbest.jpg|||backjpeg"
    imgjpeg = "c:\temp\yourgood.jpg|||imgjpeg"
    body="<HTML><BODY background=""cid:backjpeg"">" & vbcrlf & _
      "<H1>こんちは</H1>" & vbcrlf & _
      "<IMG SRC=cid:imgjpeg>" & vbcrlf & _
      "</BODY></HTML>" & vbcrlf
    files = backjpeg & vbTab & imgjpeg
    rc = bobj.SendMail(svr,mto,mfrom,subj,body,files)
    
    HTML形式をサポートしていないメーラの場合(ほとんどのメーラがしてませんよ)、HTMLのタグがそのまま 表示されて非常に読みにくくなります。
    HTML 形式のメールを送り付けられると不機嫌になる人もいますのでご注意を。
  3. To field invalid ってどんなエラー
    SendMailメソッドでこのエラーが出ます。これは、宛先メールアドレスが正しくないということです。 例えば次のようにドメイン名のみを指定した場合などです。
    mailto = "who.com"
    次のように正しく @ をつけてメールアドレスを指定しましょう。
    mailto = "who@who.com"
    mailto = "<who@who.com>" ' このように<> で囲まないとエラーになるメールサーバもあります。
    From filed invalid というエラーは、送信元メールアドレスが正しくないってことです。
  4. Cant connect Server 11001 っていったい
    サーバに接続できないとこのエラーがでます。5桁の数字は、 Winsock (Microsoftのソケットライブラリ)のエラーコードです。 Visual C++ をインストールしてあるPC で winsock.h というファイルを 探してみてください。
    11001 は、ホスト名(つまり名前)が間違っていることが多いです。 サーバがダウンしているとき、10060 が出ます。
  5. 501 Syntax error がでました
    メールサーバによっては、メールアドレスを<> で囲まないと501エラーになることがあります。 次のように指定してみてください。
    mailto = "<who@who.com>"
  6. メールを送ったのですが本文の途中が文字化けしてます
    1行の長さが長すぎると、つまり改行コード(CR + LF) が適切に入ってない場合に、 発生します。意識的に改行を挿入しましょう。改行は、次のように入れます。
    body = "こんにちは" & vbCrLf & "さようなら"
    または、CR のみか LF のみで改行しようとしています。ちゃんと CR LF をセットで使ってください。 日本語がすべて化けるようなら、SJIS コード以外の漢字コードを渡しています。
  7. 本文の改行はどうするの
    改行コードを使います。 メールの世界の改行コードは、CR(0x0d) + LF(0x0a) です。CR のみとか LF のみを 使うと文字化けの原因になります。次のようにちゃんと CR LF を使ってください。
    body = "こんにちは" & vbCrLf & "さようなら"
    あるいは、
    body = "こんにちは" & chr(13) & chr(10) & "さようなら"
  8. 他の文字セット例えばBIG5でメールを出したい
    次のようにContent-TypeヘッダーでcharsetをメールIDの前に指定してください。
    mailto=">Content-Type: text/plain; charset=big5" & vbTab & "mail-id"
  9. メモ帳に受信メールを表示したい
    BASP21 を使えば簡単です。WSH のサンプルです。
    Set bobj = CreateObject("basp21")
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set WshShell = CreateObject("Wscript.Shell")
    WshShell.Run ("notepad")    ' メモ帳を起動
    bobj.debugclear
    ar = bobj.RcvMail("server","user","pass","SAVEALL","c:\temp") ' メール受信
    call snap     ' メールの表示
    bobj.debug "Done. " & bobj.Version()
    WScript.Quit
    Sub snap
      ctr = 0
      if not IsArray(ar) then	' NG ?
        if ar = "" then
           bobj.debug "No mail."
        else 
           bobj.debug "RcvMail Error=" & ar
        end if
        exit sub
      end if
      for each file in ar    ' メール数だけ繰り返す
         ar2 = bobj.ReadMail(file,"subject:from:date:cc:","c:\temp")
         if IsArray(ar2) then	' OK ?
            ctr = ctr + 1
            bobj.debug ar2   ' メモ帳にメール内容を表示
         else 
            bobj.debug "ReadMail Error=" & ar2 & file
         end if
          bobj.debug "file=" & file
          fs.DeleteFile file
      next
      bobj.debug ctr & " Message(s) processed."
    end sub
    
  10. ASPでメールを送るとき "File notfound" が返る
    SendMailで添付ファイルが見つからないとこのエラーになります。 サーバサイドスクリプトでクライアント側のローカルなファイルを添付しようと してませんか。ASP環境では添付できるファイルは、IIS が動くマシンからアクセスできる ファイルに限られます。
    クライアントのファイルをメールで添付したいときは、一旦、そのファイルを アップロード(サーバのDiskに保存)してから、SendMailを呼出してください。
    例:
    a=Request.TotalBytes
    b=Request.BinaryRead(a)
    files = bobj.FormFileName(b,"F1")    ' ファイル名
    files="c:\temp" & Mid(files,InstrRev(files,"\"))   ' サーバ上のパス
    lx = bobj.FormSaveAs(b,"F1",files)   ' ファイルを保存
    subj = bobj.Form(b,"subject")
    body = bobj.Form(b,"body")
    rc = bobj.SendMail(svname,mailto,mailfrom, subj,body,files)
    
  11. クライアントのファイルをサーバ側でSendMailしたい
    ファイルアップロードしてから、SendMailを呼出します。 次のサンプルをどうぞ。
    =============== fup1.html start ====================================
    <HTML><BODY>
    <FORM ACTION="fup1.asp"  ENCTYPE="multipart/form-data" METHOD=POST>
    Mailto: <INPUT TYPE=TEXT NAME="mailto"><BR>
    Sub: <INPUT TYPE=TEXT NAME="subject"><BR>
    Body: <TEXTAREA NAME="body"></TEXTAREA><BR>
    File: <INPUT TYPE=file NAME="file1"><BR>
    <INPUT TYPE=SUBMIT VALUE="Submit">
    </FORM></BODY></HTML>
    =============== fup1.html end   ====================================
    =============== fup1.asp  start ====================================
    <%
    a=Request.TotalBytes
    b=Request.BinaryRead(a)
    set obj=Server.Createobject("basp21")
    mailto=obj.Form(b,"mailto")
    subject=obj.Form(b,"subject")
    body=obj.Form(b,"body")
    f1=obj.FormFileName(b,"file1")
    fsize1=obj.FormFileSize(b,"file1")
    newf1="e:\temp\" & Mid(f1,InstrRev(f1,"\")+1)
    flen=obj.FormSaveAs(b,"file1",newf1)
    rc=obj.SendMail("server",mailto,"webmaster@who.com",subject,body,newf1)
    %>
    <HTML><HEAD><TITLE>File Upload and SendMail attached file</TITLE>
    <BODY>
    <H1>Testing Done!</H1>
    <BR>
    rc = <%= rc %><BR>
    mailto: <%= mailto %><BR>
    subject: <%= subject %><BR>
    file1: <%= newf1 %><BR>
    filelen: <%= flen %><BR>
    body= <%= body %><BR>
    </BODY></HTML>
    =============== fup1.asp  end   ====================================
    
  12. 1回のSendMail呼出しで送れる最大アカウント数は
    4096アカウント、65536 バイトまでです。Bcc ファイル入力モードの場合は、無制限です。
  13. メール送信処理を早くするには
    SendMail 処理が遅い場合、サーバ名の指定を変更してみてください。 "ホスト名.ドメイン名" + "/" + "IPアドレス" の形式でサーバ名を指定します。
    smtp = "host-a.your.co.jp/1.2.3.4"
    rc = obj.SendMail(smtp,....)
    
    "ホスト名.ドメイン名"は、SMTPのHELOコマンドで送信される文字列です。 メールを送信するマシンのホスト名とドメイン名を示します。 SMTPサーバは、この情報を Received: ヘッダなどに保存したり、ログに書出したりします。 通常は ホスト名.ドメイン名をDNS逆引きで求めてますので時間がかかります。
    サーバ名をIPアドレスで指定するとDNS正引き処理が不要になり、早くなります。
  14. mailto/mailfromパラメータはどのように送られるのですか
    mailto と mailfrom は、エンベロープとヘッダとして送信されます。
    
    1.エンベロープ送信
    最初にエンベロープを送信します。
    エンベロープは、メールの送信元を示すMAIL FROM コマンドと
    メールの送信先を指定するRCPT TO コマンドです。
    mailfrom が MAIL FROMコマンド、mailto が RCPT TO コマンドに対応します。
    
    エンベロープで使われるのは、メールアドレスのみで、
    メールアドレス以外の文字は削除して送信します。
    
    このとき、mailto の中に複数の宛先があれば、RCPT TO コマンドを宛先ごとに
    送信します。
    
    例1:
    mailfrom ="name1<from@hoge.com>"
    mailto ="name2<to@hoge.com>"
    
    MAIL FROM: <from@hoge.com>
    RCPT TO: <to@hoge.com>
    
    例2:
    mailfrom ="name1<from@hoge.com>"
    mailto ="name2<to1@hoge.com>" & vbTab & "name3<to2@hoge.com>"
    
    MAIL FROM: <from@hoge.com>
    RCPT TO: <to1@hoge.com>
    RCPT TO: <to2@hoge.com>
    
    
    2.ヘッダ送信
    次にヘッダを送信します。
    mailto パラメータは、
    To 、Cc 、Bcc 、または >で指定されたヘッダそのものにそれぞれ分解されて
    送信されます。
    
    mailfrom パラメータは、From ヘッダが対応します。
    
    ヘッダは、mailfrom や mailto で渡されるメールアドレスがそのまま使われます。
    例外として日本語を含む場合には、メールアドレスを除いた部分をMIME変換します。
    
    エンベロープとヘッダの例を次に示します。
    例1:
    mailfrom ="name1<from@hoge.com>"
    mailto ="優香<to@hoge.com>"
    
    MAIL FROM: <from@hoge.com>
    RCPT TO: <to@hoge.com>
    
    From: name1<from@hoge.com>
    To: =?ISO-2022-JP?B?GyRCTSU5YRsoQg==?=<to@hoge.com>
    
    例2:
    mailfrom ="name1<from@hoge.com>"
    mailto ="name2<to1@hoge.com>" & vbTab & "name3<to2@hoge.com>"
    
    MAIL FROM: <from@hoge.com>
    RCPT TO: <to1@hoge.com>
    RCPT TO: <to2@hoge.com>
    
    From: name1<from@hoge.com>
    To: name2<to1@hoge.com>,
       name3<to2@hoge.com>
    
    例3:
    mailfrom ="name1<from@hoge.com>"
    mailto ="name2<to1@hoge.com>" & vbTab & "cc" & vbTab & "name3<to2@hoge.com>"
    
    MAIL FROM: <from@hoge.com>
    RCPT TO: <to1@hoge.com>
    RCPT TO: <to2@hoge.com>
    
    From: name1<from@hoge.com>
    To: name2<to1@hoge.com>
    Cc: name3<to2@hoge.com>
    
    
    BASP21では、Toヘッダには、次のようにメールアドレスでない任意の文字を
    送信できます。
    
    To: BASP21-Users
    
    "@" が先頭に付くメールアドレスは、
    To ヘッダとしてのみ扱う仕様になってます。
    
    mailto = "@BASP21-Users" & vbTab & "<to@hoge.com>"
    
    とするとエンベロープには、<to@hoge.com> 、
    To ヘッダには、BASP21-Users が使われます。
    
    RCPT TO: <to@hoge.com>
    
    To: BASP21-Users
    
    
  15. メール送信時にBASP21が勝手に半角カナを全角にしてません?
    はい。半角カナは、全角に変換して送信するのがBASP21(BSMTP.DLL)の仕様です。 これを変換しないようにすることはできません。 メールの世界では、半角カナを送信すると文字化けすることが多いので、 半角カナを使ってはいけません。
  16. どうしても半角カナやiモードの絵文字を送りたい
    次のようにContent-Typeヘッダを指定すると半角カナやiモードの絵文字などを 送ることができます。
    mailto="hoge@hoge.com" & vbtab & ">Content-Type: text/plain; charset=x-sjis"
    charset=x-sjis は、charset=sjis でも charset=sjis-jp でもいいようです。 メーラによっては、正しく表示されないかもしれませんのでご注意。 charsetを指定すると 送信データをjis コードには変換せず、base64 でエンコードして送信します。 そのままSJIS(8bit)で送信するわけではないのでご安心を。
  17. 決まった日時に自動的にメールを送りたい
    ATコマンドを使って、BSENDM.EXE を起動するとメール送信を
    スケジュールできます。
    次の例は、毎週金曜日の18:00にメールを送信します。
    at 18:00 /every: f /interactive bsendm c:\temp\p1.txt
    
    c:\temp\p1.txtは、BSENDM.EXE のパラメータファイルです。
    ============== start c:\temp\p1.txt ================
    c:\temp\log.txt
    xxx.xxx.co.jp
    mailto<mailto@maito.com>
    mailfrom<mailfrom@mailfrom.com>
    subject
    
    こんにちは
    さようなら
    ============== end c:\temp\p.txt ================
    
    パラメータファイルの詳細は:
    http://www.hi-ho.ne.jp/babaq/bsendm.html
    
    
    以下は、ATコマンドのHELPから引用:
    =========== 引用開始 =======================================================
    AT コマンドは、指定した日時にコマンドとプログラムがコンピュータで
    実行されるようにスケジュールします。
    AT コマンドを使用するには、Schedule サービスが 実行中でなければなりません。
    
    AT [\\コンピュータ名] [ [id] [/DELETE] | /DELETE [/YES]]
    AT [\\コンピュータ名] 時刻 [/INTERACTIVE]
        [ /EVERY:日付[,...] | /NEXT:日付[,...]] "コマンド"
    \\コンピュータ名   リモート コンピュータを指定します。このパラメータを
                       省略したときは、ローカル コンピュータでコマンドが
                       スケジュールされます。
    id                 スケジュールされたコマンドに割り当てられた識別番号です。
    /delete            スケジュールされたコマンドを取り消します。
                       id を指定しなかったときは、コンピュータでスケジュール
                       されているすべてのコマンドが取り消されます。
    /yes               確認せずにすべてのジョブ コマンドを取り消すときに
                       使用します。
    時刻               コマンドが実行される時刻を指定します。
    /interactive       ジョブの実行中、ジョブはログオンしているユーザーの
                       デスクトップとの対話を許可します。
    /every:日付[,...]  毎週指定した曜日に、または毎月指定した日にコマンドが
                       実行されます。
                       日付を省略したときは、その月の今日の日付が使用されます。
    /next:日付[,...]   指定したコマンドが次の日付 (たとえば、次の火曜日) に
                       実行されます。日付を省略したときは、その月の今日の日付が
                       使用されます。
    "コマンド"         実行したい Windows NT コマンド、またはバッチ プログラムです。
    =========== 引用終了 =======================================================
    
    
  18. EZwebにクリッカブルURLメールを送りたい
    Content-Type: multipart/mixed で HDML 形式で送るとできるようです。 multipart/mixedでは、body内容を変換しないで送信するため、 jis に変換して SendMail に渡します。
    情報提供の安藤さん Thanks。
    mailto = ">Content-Type: multipart/mixed; boundary=xxxx" & vbTab & _
             "hoge@hoge.com"
    body = "--xxxx" & vbCrLf & _
      "Content-Type: text/plain"  & vbCrLf & _
      vbCrLf & _
      "メールの本文" & vbCrLf & _
      vbCrLf & _
      "--xxxx"  & vbCrLf & _
      "Content-Type: text/x-hdml"  & vbCrLf & _
      vbCrLf & _
      "<HDML version=3.0 PUBLIC=TRUE>"  & vbCrLf & _
      "<DISPLAY name=""mails"">"  & vbCrLf & _
      "<ACTION type=accept task=gosub"  & vbCrLf & _
      "label=""見る!"""  & vbCrLf & _
      "dest=""http://www.xxxx.xxxx.hdml"">"  & vbCrLf & _
      "<ACTION type=soft1 task=return label=""戻る"">"  & vbCrLf & _
      "<WRAP>My Home Page へどうぞ"  & vbCrLf & _
      "</DISPLAY>"  & vbCrLf & _
      "</HDML>"  & vbCrLf & _
      vbCrLf & _
      "--xxxx--"  & vbCrLf
    body = bobj.Kconv(body,6)  ' jis に変換
    ======================== body start====================================
    --xxxx
    Content-Type: text/plain
    
    メールの本文
    
    --xxxx
    Content-Type: text/x-hdml
    
    <HDML version=3.0 PUBLIC=TRUE>
    <DISPLAY name="mails">
    <ACTION type=accept task=gosub label="見る!" dest="http://www.xxxx.xxxx.hdml">
    <ACTION type=soft1 task=return label="戻る">
    <WRAP>My Home Page へどうぞ
    </DISPLAY>
    </HDML>
    
    --xxxx--
    ======================== body end =====================================
    
    
  19. 開封確認メールを送ってもらうには
    ヘッダに、Disposition-Notification-To: メールアドレス とすると、 相手のメーラーが対応していれば相手が開封したときに開封確認のメールを 返信してくれます。
    オプションなので実装していない可能性があります。
    mailto = ">Disposition-Notification-To: <your@mail.com>" & _
                                  vbTab & "<hoge@hoge.com>"
    
  20. 英語版WindowsでSendMailが文字化けします
    以下のようにASPスクリプトにCodePageを設定してみてください。
    1.冒頭に<% @CodePage=932 %> を記入する。
    これでBASP21コンポーネントに正しい文字コードが渡されます。
    2.Set bobj = Server.CreateObject("basp21")    'basp21コンポーネント
    の次の行にbobj.CodePage = 932を記入する。
    CodePageプロパティは、BASP21コンポーネント内部での文字コード変換(Unicode-SJIS)の
    パラメータとして使われます。
    
  21. FlushMailメソッドってよくわかりません 2003/02/11 New
    「花粉バージョン(2,3,2,11)」で FlushMailメソッドが追加されました。 以下のようにSendMailメソッドでサーバ名の代わりにフォルダ名を指定します。 SendMailメソッドでは、メール送信はせずにフォルダ内にメールファイルを保存します。 FlushMailメソッドでサーバ名とフォルダ名を指定することで実際にメール送信します。
    mdir = "c:\temp\mail"
    rc = bobj.SendMail(mdir,.....) ' メールファイルを mdir に作成するのみ
    ...............
    svr = "server-name"
    rc = bobj.FlushMail("&" & svr,mdir,logfile) ' mdir内のすべてのメールを送信
                                ' サーバ名の前に"&" をつけるとバックグラウンドで送信
    
    ではFlushMailの利点とは:
    - メール送信時のTCP/IPコネクト回数を減らす
      複数メールを一度のTCP/IPコネクトで効率よく送信
      メールサーバの負荷の軽減
    - ASPレスポンスの改善
      セション時間(IISの負荷)を短く
      SendMailメソッドではメールファイルを作成するのみ
    - エラーメールの管理が容易
      errサブフォルダ内のメールファイルをFlushMailで再送可能
      メールサーバを変更して送信可能 
    - その他
      FlushMailの入力となるメールファイルはテキストファイル
      メールファイルは他のアプリケーションでも簡単に作成可能
      SendMailExメソッドのようにバックグラウンドで送信可能
      SendMailExメソッドとは違い一通ごとにプロセス数を消費しない
    
  22. ドコモのメールアドレス(xxxx...xxx@xxxやxxxx.@xxx)がエラーで送れない 2003/02/11 New
    メールアドレスのホスト名にドットが2つ以上並んだり、最後にドットが含まれる場合、メールサーバによっては 不正なメールアドレスとみなされエラーが返ります。ドコモのメールアドレスによく見られます。 以下のようにホスト名を""で囲んでみてください。
    <"xxxxx....xxxx"@xxxxx>
    <"xxxxx."@xxxxx>
    
  23. 587番ポートで送信したい 2007/06/23 New
    はい。可能です。 SsendMailメソッドやBSMTP.DLLのSendMail APIでは、デフォルトで25番ポートを使ってメール送信します。 587番ポートを使って送信するには、 以下のようにメールサーバ名の後に":"(コロン)で区切って587を指定します。
    svr="mail-server:587"
    svr="192.168.0.1:587"
    

BASP21メソッド編

  1. BASP21のSpaceメソッドはなんであるの
    えーとこれは、作者の無知からくる全くのゴミメソッドです。 HTML でスペースをあけるのに全角のスペースを使うことがありますが、 IMEでなぜか入力できなかったから(IMEのプロパティが半角スペースになっていただけ)。 たぶん、誰も使ってないと思いますがどうでしょう。
  2. W3getやGetFileメソッドでサーバ側にファイルが作成されてしまうのですが
    それが仕様です。 ASPなどでサーバサイドのスクリプトの中で BASP21 を使った場合、 BASP21は、サーバ側で動作しますので、 サーバがアクセスできるドライブにファイルは保存されます。 そもそもサーバ側のスクリプトでさっとクライアントにファイルが保存できたら セキュリティ上、困ったことになります。
    クライアント側のドライブにファイルを保存したい場合は、クライアントにもBASP21を インストールして、クライアント側のスクリプトでBASP21を実行すればできます。
  3. MD5メソッドってなんでしょう
    MD5メソッドは、 128 ビットのチェックサム (「指紋 (fingerprint)」「メッセージダイジェスト」と 呼ばれることもある) を文字列またはファイルに対して計算して32バイトの16進文字を返します。 チェックサムは、どんなに巨大なファイルでも128 ビットなので、 ファイルのコピーの代わりに32バイトのチェックサムのみを保存しておけば ファイルが変更されていないことを確認できます。
    どんなときに使うかというと:
    - FTP などでダウンロードしたファイルの改ざんをチェック
    - サーバ内のファイルの改ざんチェック用のハッシュ方式として
    - ワンタイムパスワード発行(POP3 プロトコルのAPOPなど)
  4. JavaScript でReadDir やFGrep などの配列を返すメソッドが動かないような
    戻り値の配列をVBArray を使って変換すると使えます。Thanks SIGNAL9 さん。
    //WSH でのサンプル
    var farray;
    var farlength=0;
    var i;
    var bobj = new ActiveXObject("basp21");
    var dir = "D:\\*.*";
    var option =" :St";
    farray  = bobj.ReadDir(dir + option);
    // BASP21はVB互換のSafeArrayを返すので、その参照を取得し、
    var jsArray = new VBArray(farray);
    // それをJS用のArrayに変換する。
    farray = jsArray.toArray();
    farlength = farray.length;
    WScript.echo(farlength);
    for (i = 0; i < farlength; i++)    {
          WScript.echo(farray[i]);
    }
    bobj = "";
    
    // ASP でのサンプル  Thanks skierbasserさん。
    <%@ language="JavaScript" %>
    <HTML><HEAD><TITLE>ReadDirテスト</TITLE></HEAD>
    <BODY>
    <%
    var farray;
    var babaq = Server.CreateObject("basp21");
    Response.Write(babaq.Version()+"<BR>");
    var dir = Server.Mappath(".") + "\\*.*";
    //var dir = "D:\\*.*";
    var option =" :StT";
    farray = babaq.ReadDir(dir + option);
    var jsArray = new VBArray(farray);
    farray = jsArray.toArray();
    farlength = farray.length;
    Response.Write(farlength + "<BR>");
    for (i = 0; i < farlength; i++)
        {
          Response.Write(farray[i] + "<BR>");
       }
    %>
    </BODY></HTML>
    
  5. ソケットオブジェクトでtelnetしたい
    telnetプロトコルは、端末表示する文字以外に、コマンドや画面制御コードなどの 非表示文字のやり取りがあるため、ちょっと複雑です。
    "Login:" という文字を受信するまでにはネゴシエーションと呼ばれる コマンド/レスポンスを適切に実行する必要があります。
    ネゴシエーションコマンドは、TeraTerm のteraterm.ini のtelnet ログオプションで 確認できますので参考にしてください。 コマンドは、IAC(x'FF')で始まり次のような形式になります。
    IAC + コマンド + オプション
    サーバのオプションを有効/無効にしたい場合、DO/DONT を送信します。 ローカル(ソケットオブジェクト側)のオプションを有効/無効にしたい場合、 WILL/WONT を送信します。
    コマンド意味応答意味
    WILL x'FB'自己側オプションの実行要求 DO x'FD'
    DONT x'FE'
    同意
    同意せず
    WONT x'FC'自己側オプションの無効要求 DONT x'FE'同意
    DO x'FD'相手側オプションの実行要求 WILL x'FB'
    WONT x'FC'
    同意
    同意せず
    DONT x'FE'相手側オプションの無効要求 WONT x'FC'同意
    SB x'FA'Sub-negotiation Begin
    SE x'F0'Sub-negotiation End
    コマンドの次の1バイトがオプションであり、telnet オプションの一覧は、 RFC 1700で、オプションの詳細は、それぞれ異なる RFC に定義されてます。
    //WSH でのサンプル
    Set bobj = Wscript.CreateObject("basp21")
    Set s = Wscript.CreateObject("basp21.socket")
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    WshShell.Run ("notepad")
    bobj.sleep 3
    bobj.Debugclear
    dim cmd  ' 受信データバッファ グローバル変数
    dim ps1  ' シェルプロンプト グローバル変数
    ps1 = "$"  ' Bシェルの場合
    account = "hoge"
    password = "hogepass"
    svr="your.server"
    rc = s.connect(svr,23,10)  ' 接続 ポート23 タイムアウト10秒
    TelnetNego                 ' telnet ネゴシエーション
    ' 16進モードだったので
    HexWait "6C6F67696E3A"      ' ログインプロンプトlogin: を待ってアカウント名を送信
    s.Write account & vbcr     ' ユーザアカウント送信
    Wait "Password:"            ' パスワードプロンプトPassword:を待つ
    s.Write password & vbcr   ' パスワード送信
    Wait ps1                    ' シェルプロンプト$を待つ
    res = Shell("whoami")       ' シェルコマンド実行
    bobj.Debug res
    res = Shell("ps aux")        ' シェルコマンド実行
    bobj.Debug res
    s.Write "exit" & vbcr       ' bye.
    bobj.Debug "end of telnet session."
    WScript.Quit
    
    ' telnet ネゴシエーション
    Sub TelnetNego
      a ="FFFB18FFFD03FFFB03FFFD01FFFB1F"  ' telnet ネゴシエートコマンド
      s.WriteHex a
      Do While 1  ' telnet ネゴシエート開始
        c = ReadCommand()  ' 16進モードでコマンドを受信
        bobj.Debug c
        Select Case Mid(c,1,6)
          Case "FFFD20","FFFD23","FFFD27","FFFD01","FFFD21","FFFD24"
             s.WriteHex "FFFC" & Mid(c,5)
          Case "FFFB05"
             s.WriteHex "FFFE" & Mid(c,5)
          Case "FFFD1F"  ' IAC SB Window
             s.WriteHex "FFFA1F00500018FFF0"   ' window size  80x24
             's.WriteHex "FFFA1F00840020FFF0"   ' window size  132x32
          Case "FFFA18"  ' IAC SB Terminal-Type
             s.WriteHex "FFFA18007674313030FFF0"   ' IAC SB Terminal-Type vt100
          Case ""  ' コマンド終了
             Exit Do
        End Select
      Loop
    End Sub
    
    ' ネゴシエートコマンドを1個ずつ読む
    Function ReadCommand
      ReadCommand = ""
      While Len(cmd) < 6    ' cmd はグローバル変数
        rc = s.Read(b,2) ' 16進モード
        if rc <> 0 Then
           bobj.Debug "Read Error " & rc
           WScript.Quit
        End If
        cmd = cmd & b
      Wend
      c = Mid(cmd,1,4) 
      If c = "FFFB" or c = "FFFD" or c = "FFFE" Then ' FFxxxx 
        ReadCommand = Mid(cmd,1,6)
        cmd = Mid(cmd,7)
        Exit Function
      End If
      If c = "FFFA" Then  ' SB 可変長。SE(FFF0) までがコマンド
        While InStr(cmd,"FFF0") <= 0
          rc = s.Read(b,2) ' 16進モード
          if rc <> 0 Then
            bobj.Debug "Read Error " & rc
            WScript.Quit
          End If
          cmd = cmd & b
        Wend
        i = InStr(cmd,"FFF0")
        ReadCommand = Mid(cmd,1,i+3)
        cmd = Mid(cmd,i+4)
     end if
    End Function
    
    ' 指定された文字列を16進モードで受信したら送信
    Sub HexReadWrie(indata,outdata)
      While InStr(cmd,indata) <= 0  ' cmd はグローバル変数
        rc = s.Read(b,2) ' 16進モード
        if rc <> 0 Then
           bobj.Debug "Read Error " & rc
           WScript.Quit
        End If
        cmd = cmd & b
      Wend
      s.Write outdata
      cmd = ""
    End Sub
    
    ' 指定された文字列を受信したら送信
    Sub ReadWrite(indata,outdata)
      While InStr(cmd,indata) <= 0
        rc = s.Read(b)
        if rc <> 0 Then
           bobj.Debug "Read Error " & rc
           WScript.Quit
        End If
        cmd = cmd & b
      Wend
      s.Write outdata
      cmd = ""
    End Sub
    
    ' 指定された文字列を受信するまでwait
    Sub Wait(indata)
      While InStr(cmd,indata) <= 0
        rc = s.Read(b)
        if rc <> 0 Then
           bobj.Debug "Read Error " & rc
           WScript.Quit
        End If
        cmd = cmd & b
      Wend
      cmd = ""
    End Sub
    
    ' 指定された文字列を受信するまでwait
    Sub HexWait(indata)
      While InStr(cmd,indata) <= 0
        rc = s.Read(b,2)      ' 16進モードで受信
        if rc <> 0 Then 
           bobj.Debug "Read Error " & rc
           WScript.Quit
        End If
        cmd = cmd & b
      Wend
      cmd = ""
    End Sub
    
    ' shellコマンド実行
    Function Shell(outdata)
      s.Write outdata & vbCr & Chr(7)   ' BELL を最後に送信 linux 系
      's.Write outdata & vbCr           ' 
      data = ""
      While Right(data,1) <> Chr(7)   ' BELLまで受信
      'While Right(data,2) <> "$ "    ' 
        rc = s.Read(b)
        if rc <> 0 Then
           bobj.Debug "Read Error " & rc
           WScript.Quit
        End If
        data = data & b
      Wend
      Shell = Mid(data,1,Len(data)-1)  ' 最後のBELL を除く
      'Shell = Mid(data,1,Len(data)-2)  ' 最後の "$ " を除く
    End Function
    
    
  6. C++ でBASP21を使うには
    #import <basp21.tlb> を使ってスマートポインタでメソッドを呼びます。
    #include "stdafx.h"
    #import <basp21.tlb> no_namespace
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow )
    {
      CoInitialize(NULL);
      _bstr_t ver,str,ret;
      try {
        IBasp21Ptr pIBasp21(__uuidof(Basp21));
        str = "優香";
        ret = pIBasp21->MD5(str,0);
        MessageBox(NULL,ret,"",MB_OK);
        ver = pIBasp21->Version(0);
        MessageBox(NULL,ver,"",MB_OK);
      }
      catch (_com_error e) {
        MessageBox(NULL,e.ErrorMessage(),"",MB_OK);
      }
      CoUninitialize();
      return 0;
    }
    
  7. Windows NT/2000+クリスタルレポート8で「ライブラリが登録されていない」
    クリスタルレポート8をインストールしてあるマシンで、 Server.CreateObject("basp21") の行で「ライブラリが登録されていない」エラーになり BASP21を実行できないという不具合が発生することがあります。
    これはクリスタルレポート8 の不具合でパッチがでてます。
    このパッチ(SCR8_regfix.exe)は、SCR8 を Windows NT/2000 にインストールした際に書き換えられた ODBC および COM 関 連のレジストリ権限を元に戻す物です。 http://www.japan.seagatesoftware.com/support/updates/default.asp#SCR
  8. メッセージ一覧はないの
    BASP21.DLLやBSMTP.DLL のメッセージ一覧はありません。作成する予定もありません。 BASP21 Proにはあります(笑)。

ファイルアップロード編

  1. 動くサンプルを見せて
    1.以下のfileup.htm とfileup.asp ファイルを IISまたはPWSの
        仮想ディレクトリに置く
    2.ブラウザのアドレス欄にhttp://server/test/fileup.htm を入力してENTER
      (サーバ名をserver 仮想ディレクトリ名を test とした場合)
    3.[参照]ボタンでファイルダイアログを開いてファイルを選択
    4.[UPLOAD]ボタンを押す
    サンプルソース:
    ============== fileup.htm start =====================================
    <HTML><BODY>
    <FORM ACTION="fileup.asp"  ENCTYPE="multipart/form-data" METHOD=POST>
    氏名: <INPUT TYPE=TEXT NAME="yourname"><BR>
    ファイル1: <INPUT TYPE=file NAME="file1"><BR>
    ファイル2: <INPUT TYPE=file NAME="file2"><BR>
    <INPUT TYPE=SUBMIT NAME=UPLOAD>
    </FORM></BODY></HTML>
    ============== fileup.htm end ========================================
    ============== fileup.asp start =====================================
    <%
    a=Request.TotalBytes
    b=Request.BinaryRead(a)
    set obj=server.createobject("basp21")
    name=obj.Form(b,"yourname")
    f1=obj.FormFileName(b,"file1")
    f2=obj.FormFileName(b,"file2")
    fsize1=obj.FormFileSize(b,"file1")
    fsize2=obj.FormFileSize(b,"file2")
    newf1=Mid(f1,InstrRev(f1,"\")+1)
    newf2=Mid(f2,InstrRev(f2,"\")+1)
    l1=obj.FormSaveAs(b,"file1","e:\temp\log\" & newf1)
    l2=obj.FormSaveAs(b,"file2","e:\temp\log\" & newf2)
    %>
    <HTML><HEAD><TITLE>File Upload Test</TITLE>
    <BODY>
    <H1>Testing</H1>
    <BR>
    <%= name %>さん、アップロードされました<BR>
    file1= <%= newf1 %><BR>
    file2= <%= newf2 %><BR>
    len1= <%= l1 %><BR>
    len2= <%= l2 %><BR>
    </BODY></HTML>
    ============== fileup.asp end =====================================
    
  2. Request.Form コレクションを使用できません というエラー
    アップロードのスクリプトで次のエラーがでることがあります。
    BinaryRead を呼び出した後には Request.Form コレクションを使用できません。
    a=Request.TotalBytes
    b=Request.BinaryRead(a)
    set obj=Server.Createobject("basp21")
    mailto=Request.Form("mailto")
    
    これは、Request.BinaryReadを使うとRequest.Formが使えなくなる、Microsoft の仕様によるものです。 次のようにRequest.Formの代わりに BASP21 の Form メソッドを使ってください。
    a=Request.TotalBytes
    b=Request.BinaryRead(a)
    set obj=Server.Createobject("basp21")
    mailto=obj.Form(b,"mailto")
    
  3. Request.Form コレクションを使用した後には BinaryRead を呼び出せません とういうエラー
    これも Microsoft の仕様でRequest.Form を使用したら、BinaryRead が失敗します。 Request.Formは使わずに、BASP21 の Form メソッドを使ってください。
    a=Request.TotalBytes
    b=Request.BinaryRead(a)
    set obj=Server.Createobject("basp21")
    mailto=obj.Form(b,"mailto")
    
  4. 他にアップロード機能をもつコンポーネントはありますか
    あります。BASP21 Proをどうぞ。 やっぱり商用がいいというかたはどうぞ。
  5. ブラウザからではなく、WSH や VB からアップロードしたい
    まず、WSH。BASP21のSocketオブジェクトを使います。
    =================== upload.vbs start =========================
    Set bobj = WScript.CreateObject("basp21")  
    Set bsocket = WScript.CreateObject("basp21.socket")   
    rc1 = bsocket.Connect("localhost", 80, 10)
    bobj.debugclear
    bobj.debug rc1
    fname = "d:\basp21.gif"   ' アップロードするファイル名
    cmd2 = "--sep" & vbCRLF & _ 
            "Content-Disposition: form-data; name=""file1""; " & _
            "filename=""" & fname & """" & vbCRLF & _ 
            "Content-Type: text/plain" & vbCRLF & vbCRLF
    cmd3 = bobj.BinaryRead(fname)   ' 送信ファイルをバイナリで読みます
    cmd4 = vbCRLF & "--sep--" & vbCrLf
    conlen = len(cmd2) + Ubound(cmd3) + 1 + len(cmd4)  ' 長さを求めます
    cmd1 =  "POST /fileup.asp HTTP/1.0" & vbCRLF & _ 
            "Content-Type: multipart/form-data; " & _
            "boundary=""sep""" & vbCRLF & _ 
            "Content-Length:" & conlen & vbCrLf & vbCrLf
    rc1 = bsocket.write (cmd1)
    rc1 = bsocket.write (cmd2)
    rc1 = bsocket.write (cmd3)  ' バイナリもそのまま送れます
    rc1 = bsocket.write (cmd4)
    bobj.debug cmd1 & cmd2
    rc1 = bsocket.read(data)    ' 結果を受信します
    bobj.debug data
    =================== upload.vbs end  =========================
    =================== fileup.asp start =========================
    <%
    a=Request.TotalBytes
    b=Request.BinaryRead(a)
    set obj=server.createobject("basp21")
    c=obj.binarywrite(b,"d:\fup1.txt")  ' 内容確認
    name=obj.Form(b,"yourname")
    f1=obj.FormFileName(b,"file1")
    fsize1=obj.FormFileSize(b,"file1")
    newf1=Mid(f1,InstrRev(f1,"\")+1)
    l1=obj.FormSaveAs(b,"file1","d:\temp\fup\" & newf1)
    %>
    <HTML><HEAD><TITLE>File Upload Test</TITLE>
    <BODY><H1>Testing</H1><BR>
    <%= name %>さん、アップロードされました<BR>
    file1= <%= newf1 %><BR>
    len1= <%= l1 %><BR>
    =================== fileup.asp end   =========================
    
    Visual Basic からは、Winsockコントロールを使います。
    Option Explicit
    Private Sub Form_Load()
     Winsock1.RemoteHost = Winsock1.LocalHostName
     Winsock1.RemotePort = 80
     Winsock1.Connect
    End Sub
    
    Private Sub Winsock1_Connect()
     Dim fname As String
     Dim cmd1 As String, cmd2 As String
     Dim cmd4 As String, conlen As Variant
     fname = "d:\basp21.gif"
     Dim cmd3() As Byte, flen As Long, ff As Long
     flen = FileLen(fname)
     ReDim cmd3(flen - 1) As Byte
     ff = FreeFile
     Open fname For Binary Access Read As #ff
     Get #ff, , cmd3
     Close #ff
     cmd2 = "--sep" & vbCrLf & _
            "Content-Disposition: form-data; name=""file1""; " & _
            "filename=""" & fname & """" & vbCrLf & _
            "Content-Type: text/plain" & vbCrLf & vbCrLf
     cmd4 = vbCrLf & "--sep--" & vbCrLf
     conlen = Len(cmd2) + flen + Len(cmd4)
     cmd1 = "POST /fileup3.asp HTTP/1.0" & vbCrLf & _
            "Content-Type: multipart/form-data; " & _
            "boundary=""sep""" & vbCrLf & _
            "Content-Length:" & conlen & vbCrLf & vbCrLf
     Winsock1.SendData cmd1
     Winsock1.SendData cmd2
     Winsock1.SendData cmd3
     Winsock1.SendData cmd4
     Debug.Print cmd1 & cmd2
    End Sub
    
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
     Dim data As String
     Winsock1.GetData data
     Debug.Print data
     End
    End Sub
    
    
  6. MAC+Netscape で日本語ファイル名が %93%FA%96%7B%8C%EA.txt のようになってしまう
    Base64 メソッドの URI デコードをすれば 大丈夫 。
    f1=obj.FormFileName(b,"file1")
    f1=obj.Base64(f1,5)
    
  7. アップロード中にブラウザの中止ボタンを押すとサーバがCPU使用率100%になる
    IISの不具合だそうです。Thanks SIGNAL9 さん。 http://support.microsoft.com/support/kb/articles/Q218/8/80.ASP
    □事象 ASPのRequest.BinaryReadメソッドを使ってファイルアップロード中に中止ボタンを押すとCPUが100%使われてしまう
    □理由 Request.BinaryReadメソッドの途中でクライアントのシャットダウンが検知できないため
    □対応 Windows NT 4.0 Service Pack 6で改修。日本版は待つしかないみたいですね。 ということでボタンは、押さないようにしましょう。
  8. MAC+IE4.xでアップロードファイルの先頭の余分なデータを取るには
    MAC のIE4.x を使って画像ファイルをアップロードすると、 ファイルの先頭に 128 バイトのMacBinary というデータがつく場合があるそうです。 MidB メソッドを使うとバイト配列データを操作できます。
    MAC + IE4.x に対応したスクリプトのサンプルをどうぞ。Thanks muさん。
    拡張子がない、もしくはJPEGとGIFのときのみ、ファイル形式をチェックして
    拡張子を変更して保存します。
    
    fname=basp.FormFileName(b,"upload_file")
    filename=Mid(fname,InstrRev(fname,"\")+1)
    ext = Mid(filename,InstrRev(filename,".")+1)
    fpath = my_private_path() & "\" & filename
    user_agent = request.ServerVariables("HTTP_USER_AGENT")
    if instr( user_agent , "Mac" ) <> 0 and instr( user_agent , "MSIE 4" ) <> 0 then
    	fbin = basp.FormBinary( b, "upload_file")
    	idMatch = basp.MatchB( "/mBIN/" , basp.MidB( fbin,102,4) )
    	fnMatch = basp.MatchB( "/" & filename & "/" , basp.MidB( fbin,2,63 ))
    	if idMatch or fnMatch then
    		offset = 128
    	else
    		offset = 0
    	end if
    end if
    jpeg_p = basp.MatchB( "/JFIF/" , basp.MidB(fbin , offset + 6, 4 )) or _
    	basp.MatchB( "/Exif/" , basp.MidB(fbin , offset + 6, 4 ))
    gif_p = basp.MatchB( "/GIF8/" , basp.MidB(fbin , offset  , 4 ))
    select case lcase(ext)
    case ""				'拡張子がないとき
    	if gif_p = 0 then
    		fpath = replace_ext( fpath , "gif" )
    	elseif jpeg_p = 0 then
    		fpath = replace_ext( fpath , "jpg" )
    	end if
    case "gif"
    	if gif_p = 0 and jpeg_p > 0 then
    		fpath = replace_ext( fpath , "jpg")
    	end if
    case "jpg" , "jpeg"
    	if jpeg_p = 0 and gif_p > 0 then
    		fpath = replace_ext( fpath , "gif")
    	end if
    end select
    l1 = basp.BinaryWrite( basp.MidB( fbin , offset ), fpath )
    
    function replace_ext( Filepath , Ext )
    	replace_ext = Left( Filepath , InstrRev(Filepath,".")) & Ext
    end function
    
    ※MacBinaryの見分け方
    102byte目に'mBIN'が入っている(MacBinary-III)
    2byte目以降、63byteにファイル名が入っている(MacBinaryI,II,III)
    
    ※GIFファイルの見分け方
    先頭に'GIF8'がある
    
    ※JPEGファイルの見分け方
    6byte目に'JFIF'もしくは'Exif'がある
    
    参考資料:
    
    GIFファイル
    http://www.geocities.co.jp/SiliconValley/3453/gif_info/source_jp.html
    
    MacBinary 
    
    http://www.lazerware.com/macbinary/macbinary.html
    
    http://www.lazerware.com/macbinary/macbinary_ii.html
    
    http://www.lazerware.com/macbinary/macbinary_iii.html
    
    JPEGファイル
    
    ftp://ftp.uu.net/graphics/jpeg/jfif.txt.gz
    
    
    
  9. ファイル名を固定してアップロードしたい
    アップロードするとき、ファイル名を選択しないですむようにしたいんですね。 BFup ActiveX コントロールを使うとできます。
  10. FormSaveAsメソッドで -2
    -2 は、パラメータの誤り(TYPE=file NAME="xxxx")か、 ファイルのサイズが 0 の場合に返ります。サイズ 0 のファイルは、保存できません。
  11. アップロード状況を確認したい
    BFup ActiveX コントロールを使うとできます。 ゲージや転送率、推定終了時間などを表示します。
  12. ディレクトリ単位でどっとアップロードしたい
    BFup ActiveX コントロールを使うとできます。 一度に最大999個までのファイルを送れます。
  13. 複数サーバに1クリックでアップロードしたい
    BFup ActiveX コントロールを使うとできます。 豊富なメソッドとイベントでカスタマイズにも柔軟に対応。
  14. ファイルをドラッグ&ドロップで指定したい
    BFup ActiveX コントロールを使うとできます。 一度に最大999個までのファイルを送れます。
  15. JScript でFormSaveAsが-3
    JScript でサンプルどおり書くとFormSaveAs が -3 で失敗します。
    JScript では、VBScript と違い、スクリプト内の\ 文字は \\ を使ってください。
    skierbasserさん、Thanksです。
    ============== fileup.asp start =====================================
    <%@ language="JavaScript" %><%
    var obj = new Object(Server.CreateObject("basp21"));
    var b = Request.BinaryRead(Request.TotalBytes);
    var name=obj.Form(b,"yourname");
    var f1=obj.FormFileName(b,"file1");
    var f2=obj.FormFileName(b,"file2");
    var fsize1=obj.FormFileSize(b,"file1");
    var fsize2=obj.FormFileSize(b,"file2");
    newf1=f1.slice(f1.lastIndexOf("\\")+1);
    newf2=f2.slice(f2.lastIndexOf("\\")+1);
    l1=obj.FormSaveAs(b,"file1","e:\\temp\\log\\"+newf1);
    l2=obj.FormSaveAs(b,"file2","e:\\temp\\log\\"+newf2);
    Response.Write("<HTML><HEAD><TITLE>File Upload Test</TITLE></HEAD><BODY>");
    Response.Write("<H1>Test</H1>");
    Response.Write(name + "さん、アップロードされました<BR>");
    Response.Write("file1=" + f1 + " " + fsize1 + "<BR>");
    Response.Write("file2=" + f2 + " " + fsize2 + "<BR>");
    Response.Write("len1=" + l1 + "Bytes<BR>");
    Response.Write("len2=" + l2 + "Bytes<BR>");
    Response.Write("</BODY></HTML>");%>
    ============== fileup.asp end =====================================
    
  16. ブラウザからのアップロード内容を確認したい
    アップロードがうまく行かない場合、ブラウザからどんなデータが送信されているか 確認するには次のような asp ファイルを実行してみましょう。 アップロード内容をそのままダイアログでファイルを保存することができます。
    RFC1867形式で各フィールドが区切られているはずです。
    <%
    a=Request.TotalBytes
    b=Request.BinaryRead(a)
    Response.Expires = 0
    Response.Buffer = TRUE
    Response.Clear
    Response.ContentType= "application/x-binary"
    Response.AddHeader "Content-Disposition","Attachment; filename=""your.dat"""
    Response.BinaryWrite b
    Response.End
    %>
    
  17. RFC1867ってなんでしょう
    RFC(Request For Comment)1867番で定義されている仕様のことを意味します。 RFC1867 は multipart/form-data 形式でサーバにデータをPOST します。 データは、HTTPプロトコルで送信され、デフォルトポートは80 です。 各データパートは boundary 文字列 で区切られています。
    ブラウザの機能では、HTMLのFORMのtype=file を使うと RFC1867 形式で ファイルを送信できます。
    サーバ側では、クライアントから受取ったmultipart/form-data 形式のデータを 各パートに分解する必要があります。 つまり受信したデータを各パートパート単位にデータの取出しを行う ソフトウエアが必要になります。

    RFC1867を実装しているサーバサイドソフトウエア
    #Product説明
    1BASP21 Form* メソッドIIS。説明不要ですね。安心の国産(笑)
    2BASP21 Pro Form* メソッドIIS。安心の商用版。B21Soft, Inc.
    3Posting Acceptor(PA)IIS。Microsoft社のISAPI DLL
    4SA FileUpIIS。SoftArtisans, Inc。
    5NETMan UpLoader for ASPIIS。System.Lab.。
    6PHP3/4UNIX+Windows。一番簡単かも。
    7perl/cで書いたCGIUNIX+Windows。フリーの物が多い

  18. IISで他のマシンの共有フォルダにアクセスしたい
    これをどうぞ。
    マイクロソフト サポート技術情報 - 207671
    [HOWTO] IIS からネットワーク ファイルへのアクセス方法 http://support.microsoft.com/default.aspx?scid=kb;ja;207671
  19. Windows 2003+IIS6で200KBを超えるファイルがアップロードできない
    Windows 2003+IIS6のデフォルト設定では、アップロードの最大値は 200KBに制限されています。
    これを変更するには:
    %windir%\system32\inetsrv\MeataBase.xml ファイルのAspMaxRequestEntityAllowedパラメータを変更します。
    AspMaxRequestEntityAllowed="204800"   ... デフォルト値は、200KB
    

COM(Component Object Model)編

  1. BASP21.DLL だけが COM サーバですか
    そうです。他の DLL (BSMTP.DLL や BREGEXP.DLLなど)は、通常の DLL です。 COM (Common Object Model) というのは、Microsoft 社が提唱する、 プログラムの保守性の向上、再利用のしやすさを考慮した開発の規約のことです。 BSMTP.DLLやBREGEXP.DLL などは、VB/VBA/C++ などから単体で使えるように設計してあります。
  2. COM サーバは、レジストリに登録するって聞きました
    COM サーバは、レジストリに登録する必要があります。BASP21 のインストーラは、 BASP21 をレジストリに自動的に登録します。 インストーラを使わずにBASP21.DLL をコピーした場合、レジストリに登録するために regsvr32 コマンドを実行する必要があります。
    [ファイル名を指定して実行]で次のようにプログラムを実行してください。
    regsvr32 パス名\basp21.dll
    レジストリには、COMサーバ(BASP21.DLL)がインストールされている場所(パス名)や ProgIDなどが登録されます。
  3. それで、COM サーバってなんでしょう
    1つ以上のCOM オブジェクト(コンポーネント)を含む DLL または EXE です。 COM オブジェクトは、COM に基づいたインターフェイスを持っており、 クライアントプログラムから利用されるプログラムの実体のことです。
    BASP21.DLL は、次の3つのCOM オブジェクトを実装しています。 ProgIDは、それぞれのCOM オブジェクトを作成するときに使います。
    オブジェクト名ProgID説明
    メインオブジェクト BASP21 BASP21 の核になるオブジェクトです。メール送受信、ファイルアップロード などのメソッドを提供します。
    Socket オブジェクト BASP21.Socket Socket をサポートする Winsock のラッパーです。
    FTP オブジェクト BASP21.FTP FTPプロトコルをサポートするオブジェクトです。
    COM オブジェクトは、メソッド(関数)を持っており、さまざまな言語から簡単に 呼び出すことができます。
  4. どうやってメソッドを呼出すんでしょうか
    まず、CreateObjectメソッドを使って、オブジェクトを作成します。
    Set オブジェクト変数 = CreateObject("ProgID")
    SetステートメントでCreateObjectメソッドを使うことにより、 新規オブジェクトを作成してそのオブジェクトへの参照をオブジェクト変数に 代入します。ProgIDは、オブジェクトに割当てられた固有の名前です。 次にそのオブジェクト変数を使ってメソッドを呼出します。
    戻り値 = オブジェクト変数.メソッド名(パラメータ)

    オブジェクトの作成方法は、言語によって次のように微妙に異なります。
    言語オブジェクトの作成方法
    VBScript/Visual Basic Set bobj = CreateObject("BASP21")
    WSH(Windows Scripting Host) Set bobj = WScript.CreateObject("BASP21")
    Active Server PagesのVBScript Set bobj = Server.CreateObject("BASP21")
    CreateObjectメソッドは、レジストリにBASP21 が登録されていないと失敗します。
  5. BASP21.TLB って何に使うの
    BASP21.TLB は、タイプライブラリです。この中に BASP21 の各オブジェクトが サポートするすべてのインタフェースとメソッドの情報が入ってます。 Visual Basic で Newキーワードを使いたい場合と C++ で BASP21 のオブジェクトを使うときに使います。
    Visual Basic でBASP21 のタイプライブラリを使うには:
    [プロジェクト]-[参照設定]で[Basp21 1.0 Type Library]をチェックします。
    タイプライブラリを使う利点としては、コーディング時にメソッド名や パラメータを補完してくれるのでタイプミスが減ります。 それと、若干のパフォーマンスの向上が見込めるかもしれません。
    Visual Basicでは、Set ステートメントで New キーワードを使って オブジェクトを作成できます。
    Dim obj As BASP21Lib.Basp21
    Set obj = New BASP21Lib.Basp21
    Debug.Print obj.Version
    
    Dim socket As BASP21Lib.Socket
    Set socket = New BASP21Lib.Socket
    Dim rc As Long
    rc = socket.Connect("server", 80)
    Debug.Print rc
    
    Dim ftp As BASP21Lib.FTP
    Set ftp = New BASP21Lib.FTP
    rc = ftp.Connect("server", "user", "pass")
    Debug.Print rc
    

    Visual C++では、スマートポインターを使うと簡単にメソッドを呼出せます。
    #import <basp21.tlb> no_namespace
    // このimport文で basp21.tlhとbasp21.tli の2つの
    // インクルードファイルがdebugとreleaseディレクトリに作成されます。
    // このインクルードファイルにスマートポインターを使った関数の
    // プロトタイプが作成されますので、これを参考にメソッドを呼出します。	
    
    	AfxOleInit();
    
    	CLSID clsid;
    	CLSIDFromProgID(OLESTR("BASP21"),&clsid);
    	try {
    		IBasp21Ptr pbasp21(clsid);
    		_bstr_t ver;
    		ver = pbasp21->Version(0);
    		AfxMessageBox(ver);
    
    	}
    	catch (_com_error e) {
    		AfxMessageBox(e.ErrorMessage());
    	}
    
  6. 作成したオブジェクトの開放はどうするの
    CreateObject や New キーワードで作成したオブジェクトは、使い終わったら 開放する必要があります。
    次のようにオブジェクト変数に Nothing を設定します。
    Set bobj = Nothing
    また、すべての変数はスコープから抜けると自動的に開放されます。 意図的に Nothing を設定して早めに開放したほうがいいとされてます。
    Visual C++ でスマートポインターを使った場合、スマートポインターの デストラクタが開放します。

正規表現編

  1. Perlのマッチ変数 $` $' $& $1 $2 $3.. に対応する機能は使えますか
    使えます。Perl でのマッチ変数 $` $' $& $1 は、次のような意味を持ちます。
    $_ = "abc-123-def";
    $b = /-(\d{3})-/;
    print "$&\n";  # マッチした文字列
    print "$`\n";  # マッチした文字列の前
    print "$'\n";  # マッチした文字列の後
    print "$1\n";  # メモリの内容
    結果:
    -123-
    abc
    def
    123
    
    BASP21.DLL のMatchExメソッド、BREGEXP.DLL のMatchEx 関数で簡単に使えます。
    C++ では、BMatch 関数で BREGEXP構造体を次のように使います。
    char szTarget[] = "03-3333-8888 045-4444-9999 024-5555-0000";
    char szRegstr[] = "/045-(\\d{4})-(\\d{4})/";
    long mode = 0;
    
    char msg[256];
    BREGEXP *rxp = NULL;		// compile block 
    int matched = BMatch(szRegstr,szTarget,
    		szTarget+lstrlen(szTarget),&rxp,msg);
    
    if (matched < 0) {		// error 
    	TRACE1("error  %s\n",msg);
    	return false;
    }
    if (!matched) {
    	TRACE("not match\n");
    	return false;
    }
    // now analize me !
    char sv;
    int len = rxp->endp[0] - rxp->startp[0];
    char *tp = rxp->startp[0];
    sv = tp[len];
    tp[len] = 0;
    TRACE1("$& = %s\n",tp);  // $&
    tp[len] = sv;
    
    len = rxp->startp[0] - szTarget;	// Before data length
    if (len > 0) {
    	tp = szTarget;
    	sv = tp[len];
    	tp[len] = 0;
    	TRACE1("$` = %s\n",tp);  // $`
    	tp[0] = sv;
    }
    
    TRACE1("$' = %s\n",rxp->endp[0]);  // $'
    
    // $1 $2 $3 ....
    for (int j = 1;j <= rxp->nparens;j++) {
    	tp = rxp->endp[j];
    	sv = tp[0];
    	tp[0] = 0;
    	TRACE2("$%d = %s\n",j,rxp->startp[j]);  // $n
    	tp[0] = sv;
    }
    
    
  2. () を使いたいがメモリに記憶させない方法
    "(?:" と ")" で区切ります。 例えば /(?:\d{4})-(\d{4})/ とすれば、後ろの()が$1になります。
  3. 全角の正規表現がうまくいかない
    正規表現やデータの日本語を処理するには、k オプションを使います。このオプションは、Perl にはありません。 例えば "m/メニュー/k" とします。kオプションをつけると日本語をsjis 漢字として処理します。 k オプションをつけないと日本語の処理がうまくいかない場合があります。

その他編

  1. 伊南村ってどこ
    福島県は会津の山村です。非常に山奥であり、その昔、新任の小学校の先生を 役場の職員が迎えにいったところ、車の中で峠の景色のあまりのさみしさに 泣き出したという伝説があります。わたしのヨメも同じ峠を通ったけど(今度聞いてみる)。
  2. Patriciaって気になります
    Patricia Ford というPlayBoyのモデルのこと。結構ファンがいまして、 Webで出回るイメージには、pfmlxxxx と連番がちゃんとふられて管理されてました。
    転じて、テクニカルでない話題のことを総称していうときに使ったりします。 うーん、無理があります?やっぱり。
  3. VBScriptで文字列のバイト数を知るには
    BASP21のByteArray メソッドを使います。
    temp = "馬場さん001"
    templen = UBound(bobj.ByteArray(temp)) + 1
    
  4. Response Center の記事を削除したいのですが
    まず、記事を書き込んだパソコンでブラウザを起動します。 Response Center にいき、記事を開きます。[削除]という文字をクリックします。 まあ、一度試しに練習してみてください。気にしませんので。
  5. Response Center のオプションですけど、選んでも何も変わりません
    選んだら記事を投稿してください。投稿したときに効果があらわれます。 これもやってみないとわかりませんのでお試しください。
  6. ASPでサーバ側で印刷したい
    アプリケーションの実行はできるようですが、印刷はそのままでは できないようです。レジストリを変更する必要があります。 サーバ側で次の手順で設定をします。Thanks mate さん。
    1. IISサービスのプロパティ変更
      ログオンは『ローカルシステムアカウント』、『デスクトップとの対話をサービスに許可』をチェックする。
    2. レジストリからファイル書き出し
      レジストリエディタで HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\ の中の以下のKEYを選択し、メニューバーより『レジストリファイルの書き出し』を選択。それぞれ .reg という拡張子でファイルを作成する。
      1) Devices
      2) PrinterPorts
      3) Windows
      
    3. ファイルの内容変更
      出力した3つのファイルそれぞれをメモ帳等で開き、以下の通り修正する。
      "HKEY_CURRENT_USER" を "HKEY_USERS\.DEFAULT" へ
    4. レジストリへの登録
      エクスプローラを開き、修正した3つのファイルをそれぞれダブルクリックして レジストリへの取り込みを行う。
    ※ 手順詳細はこちら http://support.microsoft.com/support/kb/articles/q184/2/91.asp
  7. BASP21 が使えるプロバイダは
    あります。 ウイルネット インターネットサービス さんです。もっと他にもあるようです。 http://www.willnet.ne.jp/will/hosting.html

おまけ

文字コード表(ASCII) 
------------------------------------------------------------------
| 00 nul| 01 soh| 02 stx| 03 etx| 04 eot| 05 enq| 06 ack| 07 bel|
| 08 bs | 09 ht | 0a nl | 0b vt | 0c np | 0d cr | 0e so | 0f si |
| 10 dle| 11 dc1| 12 dc2| 13 dc3| 14 dc4| 15 nak| 16 syn| 17 etb|
| 18 can| 19 em | 1a sub| 1b esc| 1c fs | 1d gs | 1e rs | 1f us |
| 20 sp | 21  ! | 22  " | 23  # | 24  $ | 25  % | 26  & | 27  ' |
| 28  ( | 29  ) | 2a  * | 2b  + | 2c  , | 2d  - | 2e  . | 2f  / |
| 30  0 | 31  1 | 32  2 | 33  3 | 34  4 | 35  5 | 36  6 | 37  7 |
| 38  8 | 39  9 | 3a  : | 3b  ; | 3c  < | 3d  = | 3e  > | 3f  ? |
| 40  @ | 41  A | 42  B | 43  C | 44  D | 45  E | 46  F | 47  G |
| 48  H | 49  I | 4a  J | 4b  K | 4c  L | 4d  M | 4e  N | 4f  O |
| 50  P | 51  Q | 52  R | 53  S | 54  T | 55  U | 56  V | 57  W |
| 58  X | 59  Y | 5a  Z | 5b  [ | 5c  \ | 5d  ] | 5e  ^ | 5f  _ |
| 60  ` | 61  a | 62  b | 63  c | 64  d | 65  e | 66  f | 67  g |
| 68  h | 69  i | 6a  j | 6b  k | 6c  l | 6d  m | 6e  n | 6f  o |
| 70  p | 71  q | 72  r | 73  s | 74  t | 75  u | 76  v | 77  w |
| 78  x | 79  y | 7a  z | 7b  { | 7c  | | 7d  } | 7e  ~ | 7f del|
------------------------------------------------------------------

Home


Copyright 1999-2001 Tatsuo Baba,All rights reserved.