2008年4月23日水曜日

.NET ウェブサービスが SOAP リクエスト パラメータを受理しない

http://www.nsoftware.com/kb/showentry.aspx?entry=04300305

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


VS.NET でウェブサービスを書いているのですが、SOAP コンポーネントを使ってこのサービスをアクセスした場合、SOAP リクエストに付与したパラメータをウェブサービス側で受け取れません。

解決法:


あなたが呼び出そうとしているウェブサービスは RPC スタイルですか?それとも Document スタイルですか?

もし不明の場合は、当該サービスの文書をチェックしてください。あるいはもしそのサービスが .NET サービスでありそのソースコードにアクセスできるのであれば、当該サービスおよび webmethod の SoapRPCService 属性および SoapRPCMethod 属性をチェックするか、あるいは同じく当該サービスおよび webmethod の SoapDocumentService 属性および SoapDocumentMethod 属性をチェックします。

当該サービスが Document スタイルの場合、メソッド名のプレフィックスが存在しないことを確認します。(既定値では "m" がメソッド名前空間プレフィックスとして使用されます。) これを行うには、MethodNamespacePrefix 構成設定パラメータをコード内で設定します。例:
SOAP1.Method = "MyTest"
SOAP1.MethodURI = "http://localhost/webservice/"
SOAP1.ActionURI = "http://localhost/webservice/MyTest"
SOAP1.URL = "http://localhost/WebService/test.asmx"
SOAP1.AddParam "x", "something"
SOAP1.Config "MethodNameSpaceprefix="
SOAP1.SendRequest

SOAP MethodURI およびその他のプロパティ

http://www.nsoftware.com/kb/showentry.aspx?entry=06050217

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


SOAP コンポーネントを使ってアクセスしたい SOAP サービスの MethodURI やその他の必要事項を知るにはどうすれば良いですか?

解決法:


MethodURI、Method、ActionURI およびその他の必要事項は全てアクセスしたいいサービスの WSDL ファイルを調べることで判明します。それぞれの SOAP サービスには1つずつ WSDL ファイルが存在しており、通常は http://サービスURL?WSDL でアクセスできます。

弊社サイト http://nsoftware.com/kb/ には "Web Service Proxy Generator" が用意されており、これをご利用いただくことで自動的に WSDL ファイルを調査し、そのサービスを利用するためにどのように弊社の SOAP コンポーネントを使用するかが示されます。

【訳注】直接のリンクは http://www.nsoftware.com/kb/apps/wspg/

HTTP 経由でのプロクシサーバ認証

http://www.nsoftware.com/kb/showentry.aspx?entry=12119701

該当製品:


  • IP*Works!


現象:


プロクシサーバを使うように変更したのですが、そのサーバはプロクシ認証を必要とします。"USER" プロパティと "PASSWORD" プロパティを使おうとしているのですが、"407 proxy authenticate required" で失敗するようになってしまいました。

解決法:


.User プロパティおよび .Password プロパティは認証文字列を計算しウェブサイトに送信します。一方プロクシ認証では、ProxyUser プロパティおよび ProxyPassword プロパティを使用することになります。

旧バージョンの IP*Works! では、Proxy-Authorization ヘッダをあなた自身が手で設定する必要があります。

この場合、認証文字列の計算は以下の例のように、まず .User プロパティおよび .Password プロパティに値を設定し、.Authorization プロパティを読み取ります。(この手順は基本認証を使って認証文字列を計算するために、1度だけ行う必要があります。)
     '認証文字列の計算
HTTP1.User = "myname" 'put your proxy login name here
HTTP1.Password = "mypassword" 'put your proxy password here
HTTP1.OtherHeaders = "Proxy-Authorization: " + _
HTTP1.Authorization + chr(13) + chr(10)

'認証はプロキシに対してのみなので空文字列を設定しておく
HTTP1.User = ""
HTTP1.Password = ""

プロキシサーバを通過する全てのリクエストはこの "Proxy-Authorization: ..." ヘッダを .OtherHeaders プロパティ内に保持しているべきです。

個々のプロパティについてはヘルプファイルを参照して下さい。

なお、.URL プロパティに値を設定する時にサーバ値を変更すると、User プロパティおよび Password プロパティの値はクリアされる点に注意してください。これはセキュリティ上の理由によります。

HTTP におけるリダイレクトの取り扱い方

http://www.nsoftware.com/kb/showentry.aspx?entry=07190014

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


HTTP でリダイレクトを扱うには、どのようにすれば良いですか?

解決法:


IP*Works! Version 5 は【訳注: V6, V8 も】FollowRedirects プロパティをサポートしており、リダイレクトを自動的に処理させることが可能です。実例:
HTTP1.FollowRedirects = frAlways
HTTP1.Get "http://www.nsoftware.com"

IP*Works! の過去のバージョン: サーバは Location ヘッダに新しい URL を設定した上でエラーコード 301 または 302 を返します。HTTP コントロールは "Redirected" という説明文と共にエラーまたは例外を発生させますので、Header イベント内で Location ヘッダを保存した上でコントロールが生成するエラーイベントあるいは例外を処理し、この新しい場所へリクエストを送信します。

VB による実例を以下に示します。
     Dim gNewURL as String

Private Sub HTTP1_Header(Field As String, Value As String)
If LCase(Field) = "location" Then gNewURL = Value
End Sub

Private Sub Command1_Click()
On Error GoTo errhandler
HTTP1.WinsockLoaded = True
HTTP1.URL = "http://www.microsoft.com/support"
HTTP1.Action = a_GetDocument
Exit Sub
errhandler:
If Err.Number = 20152 And (Left(Error, 4) = "303 " Or _
Left(Error, 4) = "302 ") Then
HTTP1.URL = gNewURL 'assign new URL
Resume 'repeat action
End If
End Sub

HTTP コントロールでバイナリファイルを受信する方法

http://www.nsoftware.com/kb/showentry.aspx?entry=09039731

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


非テキストデータ (gif、jpg 等) の取得に HTTP コンポーネントを使用したいと思います。HTTP でこれは可能でしょうか?それとも何か他のもの (例えば IPPORT) を使わなければならないでしょうか?

解決法:


可能です。まず最初に URL プロパティと (オプションで) LocalFile プロパティを割り当てます。次に Get メソッドを呼び出します。データは LocalFile プロパティに指定されたファイル内に格納されるか、あるいは Transfer イベントの引数に付与されます。実例については httpget デモをご覧下さい。

2008年4月22日火曜日

HTTP で部分ダウンロードをする方法

http://www.nsoftware.com/kb/showentry.aspx?entry=07180010

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


HTTP で部分ダウンロード (partial download) を行うにはどうすれば良いですか?

解決法:


HTTP/1.1 では部分ダウンロードをサポートしています。(RFC2068 の第14.36節) あるファイルを部分ダウンロードするには、Range プロパティにバイト範囲を指定します。
     'the actual byte range
HTTP1.Range = "0-499" 'get only the first 500 bytes
HTTP1.Get URL

Range プロパティの書式は '-' で区切られた2つの数字により指定されるバイト範囲 (例えば '0-499') から成ります。例: 最初の500バイト: 0-499 次の500バイト: 500-999 最後の500バイト: -500

IP*Works! の旧バージョンには Range プロパティは含まれておらず、HTTPVersion プロパティに HTTP/1.1 プロトコルを設定すると共に OtherHeader プロパティを用いて Range ヘッダを設定する必要があります。

サーバ名を HTTP ヘッダ内に指定する方法

http://www.nsoftware.com/kb/showentry.aspx?entry=09039737

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


HTTP リクエストヘッダにサーバ名称を含めて送信する必要があります。今日の幾つかのウェブサーバ単一の IP に対してマルチホームを許容しています。サーバが違いを認識する際には HTTP リクエストヘッダ内からサーバ名称を探し出します。IP*Works! コントロールはこれらを扱うことができますか?

解決法:


はい、扱うことができます。既定値では HTTP コントロールは自動的に Host ヘッダを送信します。

旧バージョンの IP*Works! はこれを既定値では行いませんでした。特別なヘッダを追加する場合は以下のようにします:
     HTTP1.URL = ...
HTTP1.OtherHeaders = "Host: " + HTTP1.URLServer + chr$(13)+chr$(10)

HTTP リクエストが IE の送出するものと異なっている

http://www.nsoftware.com/kb/showentry.aspx?entry=07210402

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


HTTP リクエストを送信しようとしているのですが、失敗してしまいます。しかし、同じリクエストが IE ではうまく動作します。何が悪いかを知り、対応するにはどうすれば良いですか?

解決法:


あなたが HTTP コンポーネントで送出しているデータと、IE で送出しているデータを比較してみましょう。これを行うには、弊社製品に同梱されている "tcpecho" サーバデモを実行し、リスン状態にします。次にあなたの HTTP コンポーネントコードを変更し、http://localhost:777/ に POST します。次に IE で http://localhost:777/ にリクエストを送信し、両者の結果を比較します。

また、ウェブフォームに対する POST を模倣したいのであれば、まず IE でそのフォームを表示し、ウェブページをディスクに保存します。次にそのウェブページを編集し、当該フォームのアクション URL を http://localhost:777/ になるようにします。

そして、コントロールのプロパティ (例えば UserAgent 等) を使用して、それらが IE のヘッダに一致するようにすることができます。さらに、コントロールが提供しないプロパティ (例えば Accept 等) に関しては、そのようなヘッダを追加するために OtherHeaders プロパティをご利用いただけます。(追加される各ヘッダは CRLF で区切ります。) 例:
Http1.Otherheaders = "headerfield1: headervalue1" + crlf + "headerfield2: headervalue2"

HTTP Post がエラー "303 See Other" を返す

http://www.nsoftware.com/kb/showentry.aspx?entry=01260502

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


HTTP (あるいは WebForm、WebUpload 等) で POST 処理をすると、HTTP プロトコルエラー "303 See Other" になります。

解決法:


これはサーバから返されるコード (トラップするには標準的なエラーハンドリングを使用すべきもの) であり、あなたの行った POST に対するサーバの応答は、別の URL に対する GET を使用して取得すべきものであることを通知しています。使用すべき URL は Location ヘッダ内に格納されており、これはコンポーネントの Header イベントを使用して取得します。例:
Private Sub HTTP_Header(...)
If (e.Field.ToUpper() = "LOCATION") Then
newurl = e.Value
End If
End Sub

Try
HTTP.Post("http://server/script.aspx")
Catch ex1 as nsoftware.IPWorks.IPWorksException
If (ex1.Code = 303) Then
HTTP.Get(newurl)
string postresponse = HTTP.TransferredData
End If
End Try

HTTP コントロールでのクッキーへのアクセスおよび設定

http://www.nsoftware.com/kb/showentry.aspx?entry=11119701

該当製品:


  • IP*Works!


現象:


私が試用しなければならないウェブサーバはクッキーを必要としています。どうやればクッキーを受理したり設定したりできるのでしょうか?

解決法:


サーバから送られてくるクッキーは SetCookie イベントで受け取ります。このイベント内で後ほど使用できるようにクッキーを保存することができます。HTTP リクエストでサーバにクッキーを送信する必要がある場合は、AddCookie メソッドにクッキー名称と送信したい値を引数として与えて呼び出すだけです。

クッキーに関する詳細は Netscape の定義も参照して下さい: http://home.netscape.com/newsref/std/cookie_spec.html
【訳注】この URL はもはや存在していません。下記をご利用ください。
http://wp.netscape.com/newsref/std/cookie_spec.html

HTTP プロトコルでのエラーの取り扱い方

http://www.nsoftware.com/kb/showentry.aspx?entry=12049701

該当製品:


  • IP*Works!


現象:


HTTP コントロールを使用して VB アプリケーションを開発しています。大抵の場合このアプリケーションはうまく動作するのですが、たまにタイムアウトとかエラーコード 404 などプロトコル関連のエラーが発生します。そこで私はエラー条件を取り扱うコードを書き始めなくてはなりません。

良くあるエラーを取り扱うのに必要な手段や情報、あるいはやらなければならない事ややってはならない事
などの情報はありますか?

解決法:


まず、StatusLine プロパティをチェックすることでサーバ応答の最初の行をチェックできます。サーバが 3xx (リダイレクション)や 4xx(クライアントエラー) あるいは 5xx (サーバエラー) といったエラーコードを返す場合、HTTP コントロールはこのエラーをユーザに対し提示します。

またコントロールは エラー 20152 (Visual Basic/ActiveX Edition) または 151 (その他のエディション) をテキスト 'xxx Error Description' (ここで 'xxx' は3桁の HTTP エラーコード) を返すことがあります。

サーバから返される最も重要なエラーコードを以下に示しておきます。HTTP プロトコルの詳細については コントロールのプロパティのヘルプファイルの他、RFC 文書を参照して下さい。
301 Moved Permanently
302 Moved Temporarily
303 See Other

上記3つは全て、Header イベント内の Field パラメータ 'Location' の値の URL へとリダイレクトします。(フィールドは大文字小文字を区別しませんが、その場所 (location) は大文字小文字を区別します。) FollowRedirects プロパティを設定することで、これらのリダイレクト指定を自動的に実行させることができます。
304 Not changed

Get アクション内で NotModifiedSince プロパティが使用された場合にのみ送られてきます。
400 Bad Request

リクエストに誤りがあります。リクエストを修正してください。
401 Unauthorized

当該リクエストにはユーザ認証が必要です。User プロパティおよび Password プロパティを使用してください。
403 Forbidden

サーバはリクエストを解釈しましたが、応答を拒否しています。サーバから詳細情報がないかメッセージをチェックしてください。
404 Not Found

Request-URL に一致するものがサーバ側に見つかりませんでした。
500 Internal Server Error

サーバがリクエストの処理中に、それを妨げる予期せぬ状況に遭遇しました。
501 Not Implemented

サーバは当該リクエストを処理する機能をサポートしていません。
503 Service Unavailable

過負荷あるいはサーバメンテナンスのため、サーバは現在当該リクエストを処理することができません。

コントロールのプロパティについてはヘルプファイルを、また HTTP プロトコルについては RFC を参照して下さい。

HTTP 圧縮機能のサポート

http://www.nsoftware.com/kb/showentry.aspx?entry=09260710

該当製品:


  • IP*Works!


現象:


貴社コンポーネントは HTTP 圧縮機能をサポートしていますか?

解決法:


はい、HTTP 圧縮機能は AllowHTTPCompression プロパティを設定することでご利用頂けます。このプロパティが true に設定されると、コンポーネントは自分が deflate および gzip アルゴリズムをサポートする旨をサーバに対し通知します。
    http.AllowHTTPCompression = true;
http.Get("http://myserver/document.zip");

XMPP コンポーネントがサポートする認証方式

http://www.nsoftware.com/kb/showentry.aspx?entry=09270706

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


XMPP コンポーネントがサポートする認証方式にはどんなものがありますか?

解決法:


XMPP (Jabber) コンポーネントは Google Talk で必要となる SASL PLAIN を含め何種類もの認証方式をサポートしています。サポートされている認証方式の一覧についてはヘルプ等の添付文書をご参照ください:
  • SASL/DIGEST-MD5
  • AuthIQ/Digest
  • SASL/PLAIN
  • AuthIQ/Plaintext

上記の認証方式のいずれかを使用する際には、添付文書に記載されている文字列を AuthMethods プロパティに設定するだけです。また AuthMethods への "*" の設定には、コンポーネントは利用可能な認証方式のうち最も強度の高いものを使用させるという特別な効果があります。

IPInfo は MX レコードを扱えますか?

http://www.nsoftware.com/kb/showentry.aspx?entry=09039724

該当製品:


  • IP*Works!


現象:


IPInfo は MX レコードを扱えますか?私の email アドレスは myname@domain.com で、mail.domain.com が管轄しています。ここで 'domain.com' は私のウェブサーバのアドレスを持っています。どうすればその情報を自動的に得られますか?

解決法:


現時点では MX レコードは IPInfo では解決できません。

MX レコードを問い合わせるには、MX コントロールあるいは DNS コントロールを使う必要があります。

イベントから GUI をアクセスすると、.NET コンポーネントがハングする

http://www.nsoftware.com/kb/showentry.aspx?entry=12060401

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


非同期コンポーネントのイベント内から GUI をアクセスすると、コンポーネントがハングしてしまいます。

解決法:


.NET では、GUI コンポーネントは GUI スレッドからアクセスされなければなりません。非同期コンポーネントのイベント内から GUI を更新しようとすると、アプリケーションはハングアップしてしまう可能性があります。

IP*Works! コンポーネントはスレッド動作の観点からは2つのカテゴリーに分類できます。これは、効率や実装されるプロトコルの性格から決まります。Ipport、Udpport、Icmpport、Mcast、Xmpp、Telnet、Mx、Dns は非ブロックかつ非同期なコンポーネントであり、これ以外はブロックかつ同期的なコンポーネントです。

ブロック/同期コンポーネントは、GUI アプリケーション内でさえそれらを動作させるための特別な手順を実装する必要が全く無いという意味では「プラグ&プレイ」です。

一方非ブロック/非同期コンポーネントは、GUI アプリケーション内で使用される場合には「GUI コンポーネントは GUI スレッドからのみアクセスされなければならない」という .NET の制限のため特別な手順を要します。

非ブロック非同期なやり方で接続やデータ送信および切断を行うには、それぞれ Connect、Send および Disconnect を使用します。

そしてそれらの操作結果を後ほど通知するイベント Connected、DataIn および Disconnected がそれぞれ用意されています。各メソッドの呼び出しは、コンポーネントに処理を実行するよう「依頼」するだけであり制御は直ちに呼び出し側スレッドに戻されますが、それらに対応するイベントは当該コンポーネントの内部のワーカスレッドから生成され発生します。従って、このイベント内から GUI コンポーネントの更新を行おうとすると、アプリケーションは恐らくハングアップしてしまうことでしょう。

.NET Edition の V6 (【訳注】V8 も) ではコンポーネントの InvokeThrough プロパティに当該フォームのインスタンスを設定することで、コンポーネントに対処し、メインスレッド上で自動的に実行するようになります。
    xmpp1.InvokeThrough = this;

別の方法としては、InvokeThrough を既定値 (null) のままにしておき、イベントから GUI フォームをアクセスしないようにする、あるいはあなた自身が invoke 処理を記述すのいずれかを行うことも可能です。

--

Compact Framework 開発においては、事態は若干複雑です。.NET CF Edition には InvokeThrough プロパティが無いため、この問題はあなた自身が処理しなくてはなりません。(【訳注】初期の V8 には InvokeThrough は実装されていませんでしたが、その後 V8 では .NET CF でも InvokeThrough をご利用頂けるようになっています。) 以下は IPPort コンポーネントを使って .NET CF でどのように invoke を扱うかを示す C# コードです:
    nsoftware.IPWorks.IpportConnectedEventArgs e; 


private void ipport1_OnConnected(object sender,nsoftware.IPWorks.IpportConnectedEventArgs e)
{
ipport1.DataToSend = "Thanks for connecting!";
this.e = e;
this.Invoke(new EventHandler(MyClientConnected));
}


void MyClientConnected(object sender, EventArgs e)
{
tbLog.Text = "Connected to remote host: " + this.e.Description;
}

---
VB.NET では、例として XMPP コンポーネントを使ってみましょう。
  1. まずイベント引数を保持するオブジェクトを生成します。
        Private e As nsoftware.IPWorks.XmppMessageInEventArgs
  2. 次にあなたの GUI コードを実行する delegate 関数を記述します。(ここでは MyXmppMessageIn と名前をつけましたが、好きな名前を使って構いません。)
        Delegate Sub MyEventHandler(ByVal sender As Object, ByVal e As nsoftware.IPWorks.XmppMessageInEventArgs)
    Private MyXmppMessageInD As MyEventHandler

    ...
    MyXmppMessageInD = New MyEventHandler(AddressOf MyXmppMessageIn)
    ...

    Sub MyXmppMessageIn(ByVal sender As Object, ByVal e As EventArgs)
    'My gui code, use Me.e for event args
    End Sub
  3. そして IP*Works! のイベントそのものから MyXmppMessageIn を invoke します:
        Private Sub xmpp1_OnMessageIn(ByVal sender As Object, ByVal e As nsoftware.IPWorks.XmppMessageInEventArgs) Handles Xmpp1.OnMessageIn 
    Invoke(MyXmppMessageInD)
    End Sub

2008年4月21日月曜日

ターミナル エミュレーション (VT100, VT220)

http://www.nsoftware.com/kb/showentry.aspx?entry=02140503

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


Telnet コンポーネントはターミナル エミュレーションをサポートしていますか?

解決法:


Telnet コンポーネントは Telnet プロトコルそのものを実装しているだけであり、ターミナル エミュレーション機能は実装していません。弊社では、Telnet コンポーネント上に VT100 をどのように実装するかを示す VB6 サンプルコードを保有しています。このコードに興味を持たれた肩は弊社サポートまでお問い合わせください。

Telnet で 'login:' プロンプトが表示されない

http://www.nsoftware.com/kb/showentry.aspx?entry=09039721

該当製品:


  • IP*Works!


現象:


Telnet コントロールを使用してサイトにアクセスした場合、サイトによっては "login:" プロンプトが表示されないのは何故ですか?

解決法:


まず最初に、各種オプションのネゴシエーションを実装しているかどうかを確認してください。サーバはオプションのネゴシエーションが完了するまで可読なテキスト (DataIn イベント) を送信しません。

またサイトによっては、NULL (0 文字) を送信することがあります。テキストボックスは NULL 文字以降の文字は全て無視するため、DataIn イベントで受け取った Text は表示に先立ち不要な文字を除去 (trim) する必要があります。

受取人のサーバに直接メールを送信する

http://www.nsoftware.com/kb/showentry.aspx?entry=06050211

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


私自身の SMTP サーバを介さず電子メールを送るにはどうすればよいですか?

解決法:


SMTP サーバを経由せずに電子メールを送信することはできません。ただし、あなた自身の SMTP サーバをバイパスし、メッセージの受取人に最適な SMTP サーバへ直接メールを送信することは可能です。これを行うには、MX コントロールを使用する必要があります。MX コントロールに受取人の電子メールアドレスを与えれば、その受取人にメールを送信するのに最適な SMTP サーバが返されます。
例:
    MX1.Resolve "tom@nsoftware.com"

処理結果は MX の Resolved イベントで得られます。このイベントで、当該電子メールアドレスにサービスを提供しているメールサーバの IP アドレスを知ることができます。

SMTP - メールを中継できない

http://www.nsoftware.com/kb/showentry.aspx?entry=07200401

該当製品:


  • IP*Works!
  • IP*Works! S/MIME
  • IP*Works! SSL


現象:


SMTP で電子メールを送信すると、「メールを中継できない (Unable to relay mail)」あるいは「中継は許されていない (Relaying not allowed)」というエラーになります。

解決法:


SMTP による中継は、異なるドメインに対し送信された電子メールをメールサーバがを受け入れ、他のドメインへと転送する際に発生します。多くのメールサーバは中継機能をサポートしていません。サポートする場合は、しばしば最初に認証をまず最初に行うことが要求されます。この認証は、送信に先立ちユーザ名とパスワードを指定することで行います。

受取人の属するサーバではないメールサーバに電子メールを送ることで中継を要求する代わりに、その電子メールを受取人のメールサーバに直接送信することができます。(もし受取人のメールサーバが不明の場合は、MX コンポーネントを使って調べることができます。)

SMTP 送信時に開封確認を設定する方法

http://www.nsoftware.com/kb/showentry.aspx?entry=11060101

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


SMTP 経由でメッセージを送信する際に、開封確認を設定するにはどうすればよいですか?

解決法:


メッセージ送信前に、コンポーネントの ReadReceiptTo プロパティを設定するだけでOKです。ReadReceiptTo には開封確認 (read-receipt) を受け取るべきメールアドレスを指定します。

例:
    SMTP1.ReadReceiptTo = "myaddress@mydomain.com"

2008年4月18日金曜日

HTML メールまたはアタッチファイル付メールの送信に SMTP を使用する

http://www.nsoftware.com/kb/showentry.aspx?entry=06050215

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


アタッチファイルや メッセージ本文が HTML テキストを送信するにはどうすれば良いですか?

解決法:


これを行う最も簡単な方法は、HTMLMailer コントロールを使用することです。このコンポーネントには引数としてファイル名を取る AddAttachment メソッドが用意されており、自動的にファイルをエンコードして送信電子メールを生成します。このコンポーネントにはまた MessageHTML プロパティがあり、これを使用することで電子メールに HTML のパートを指定することができます。

HTMLMailer コントロールも FileMailer コントロールも使用しない場合は、SMTP コントロールに MIME オブジェクトを組み合わせて、メッセージを MIME エンコードする必要があります。

NetClock の仕様

http://www.nsoftware.com/kb/showentry.aspx?entry=06050212

該当製品:


  • IP*Works! V8


現象:


NetClock は SNTP プロトコルを実装していますか?

解決法:


はい、NetClock コンポーネントは SNTP プロトコルと Time プロトコル (RFC868 - ポート37) をサポートしています。既定値では当該コンポーネントは Time プロトコルを使用しますが、Protocol プロパティを使用して切り替えることができます。

V8 より前のバージョンのコンポーネントでは Time プロトコルのみをサポートしていました。

PEM ASN.1 構造の解析時にエラー: デコードエラー

http://www.nsoftware.com/kb/showentry.aspx?entry=08060701

該当製品:


  • IP*Works! S/Shell
  • IP*Works! SSH


現象:


SFTP Adapter や SFTP コンポーネントを使用すると、"Error parsing PEM ASN.1 structure: Error decoding" (PEM ASN.1 構造の解析エラー: デコードエラー) というエラーが表示されます。

解決法:


このエラーは、提示した PEM キーが当該 Adapter や当該コンポーネントにより解析できない形式であった場合に発生します。SSH の CertStore プロパティに設定した PEM キーは OpenSSH RSA 形式ですか?そうでない場合は、その書式を変換する必要があります。その方法の1つとして、PuTTYgen を使用した次のような方法があります:
  1. Conversions メニューから Import Key を選択し、既存の秘密鍵をインポートします。
  2. Conversions メニューから Export OpenSSH Key を選択します。

エラー 20274 または 273: セキュリティ証明書を取得できません

http://www.nsoftware.com/kb/showentry.aspx?entry=11010102

該当製品:


  • IP*Works! SSL


現象:


何種類ものトランザクションで、エラーコード 273 または 20274、メッセージ「セキュリティ証明書を取得できません (could not acquire security credentials)」が表示されるとユーザからレポートされます。

解決法:


このエラーが発生する最も良くあるケースは、クライアントサーバ証明書の発行者を信頼していないというケースです。この問題は、(当該証明書の)発行機関の証明書をインストールするか、あるいは発行者を信頼するようプログラムすることで解決できます。

この問題はまた、クライアントまたはサーバにより使用されている証明書が正しくない場合にも発生します。

もしお使いの証明書がトランザクションで無効とされるのであれば、新しい証明書を取得すべきです。

弊社ではこの基準に適合するテスト用証明書を提供しています。ただし、この証明書はテスト目的のものであり、商用証明書の持つ全ての利点を提供するものではありません。/n software, Inc. は提供する証明書そのもの、あるいは本証明書を使用するサーバのセキュリティ管理に対しいかなる責任をも持つことはありません。この条件に同意されるのであれば、評価用証明書のダウンロードを行って頂けます。

このテスト用証明書をダブルクリックするだけで、非常に簡単なインストール手順が開始され、当該証明書が「個人 (Personal)」証明書ストアにインストールされます。証明書のインストールに必要なパスワードは "test" です。

もし Thawte や Verisign から証明書を取得するのであれば、SSL サーバ証明書を取得する必要があります。

サーバ証明書を確認できません

http://www.nsoftware.com/kb/showentry.aspx?entry=10080102

該当製品:


  • IP*Works! SSL


現象:


接続を試みると、サーバ証明書が確認できなかった旨のエラーが表示されます。

解決法:


SSL コネクションを確立する際に、サーバは常に接続対象のクライアントに対し証明書を提示します。そしてクライアントはシステムをチェックし、サーバの証明書が有効であるかどうか (つまり証明書の有効期間が正しいか、証明書の CN がリモートホストの名称と一致するか、証明書の発行機関が信頼できるか、等) を調べます。もし当該証明書が無効なものであった場合、"Error verifying server certificate" (サーバ証明書の確認エラー) というエラーが表示されるでしょう。

この問題を解決するには、以下のいずれかを行います:
  1. 当該ウェブサーバにインストールされている有効なサーバ証明書を取得する
  2. 当該証明書を受理するようプログラムで対応
  3. クライアントマシン側に、サーバ証明書を発行する機関の公開鍵を、信頼できる CA (Certificate Authority; 証明書発行機関) ストアにインストールする。

証明書をプログラムで受理する場合は、次のうちのいずれかで行えます:
  1. SSLAcceptServerCert プロパティに、受理すべき証明書の公開鍵を Base64 エンコードしたものを設定します。また、このプロパティには、コネクションを試行すると、それが成功したか失敗したかにかかわらず実際のサーバ証明書が格納されます。
  2. SSLServerAuthentication イベントを使用してサーバ証明書を検査し、Accept パラメータに true を設定する。

実例:
    if Err.number = 20277 then 'Cert not trusted 
control.SSLAcceptServerCert = control.SSLServerCert
control.Method()
end if

あるいは、SSLServerAuthentication イベント内で
    e.Accept = True 

*警告* - 信頼されていない証明書を受理することで、セキュリティ上の問題を発生する可能性があります。たとえデータは暗号化されている場合であっても、サーバの同一性が証明されるわけではありません。

セキュリティ・プロバイダが見つからない - Java

http://www.nsoftware.com/kb/showentry.aspx?entry=06170417

該当製品:




現象:


作成した Java アプリケーションを実行すると、「セキュリティ・プロバイダが見つかりません (Cannot Find Security Provider)」というエラーが表示されます。

解決法:


このエラーは JDK が SSL 機能に必要なセキュリティ・プロバイダを見つけられない場合に発生します。JDK を 1.4 にアップグレードすれば、この問題は発生しなくなります。JDK 1.3 をご利用の場合は、JSSE 1.0 をインストールする必要があります。JSSE のインストールは、ファイルをコピーする以上の意味を持っています。JSSE zip にはインストール時に参照する手順も添付されていますが、以下に JSSE インストール手順から抽出した基本操作を示しておきます:

1) JSSE 1.0.3_03 をダウンロードします。

2) ダウンロードしたファイルを展開し、取り出します。

3) JSSE jar ファイルをインストールします。

JSSE の lib サブディレクトリには jsse.jar、jcert.jar および jnet.jar という拡張ファイルが格納されています。これらのファイルは、JDK/JRE にインストールする (「インストール拡張」) か、あるいはそれらを作成したアプレットやアプリケーションにバンドルする (「バンドル拡張」) のいずれかを行えます。インストール拡張としてそれらをインストールしたいのであれば、それらのファイルを以下のディレクトリに格納します:

java-home/lib/ext

4) SunJSSE プロバイダを登録します。

JSSE 1.0.3_03 には標準で "SunJSSE" という名称の暗号サービスプロバイダ (Cryptographic Service Provider)、あるいは縮めて「プロバイダ」が同梱されています。"SunJSSE" プロバイダはあらゆる JSSE 1.0.3_03 のインストレーション内で提供されていますが、そのサービスがアクセス可能となるためには前もって明示的に、静的または動的に構成されている必要があります。

プロバイダの登録手順は、インストール手順に記載されています。

【訳注】JDK 1.3 は弊社 Java 製品のサポート対象ではありますが、既にかなり古い物となっておりますので実質的には JDK 1.4 以降の利用を想定して製品はリリースされています。

2008年4月17日木曜日

ハンドシェーク エラーについて

http://www.nsoftware.com/kb/showentry.aspx?entry=07120406

該当製品:


  • IP*Works! SSL
  • IP*Works! SSH


現象:


IP*Works! SSL や SSH ツールキットのコントロールを使用すると "Error during handshake" (ハンドシェーク中にエラー) というエラーが発生します。これはどのようにデバグすれば良いのでしょうか?

解決法:


このエラー自体は一般的なものですが、特に SSL や SSH 通信のハンドシェーク処理に対するものです。

より詳細な情報を得るには SSLServerAuthentication イベントだけでなく SSLStatus イベントもチェックしてください。SSLServerAuthentication イベントの Accept パラメータが false になっている場合は、Status パラメータにエラーの理由が格納されています。また、Accept パラメータを true に設定することで、手作業で当該サーバ証明書を受理するよう強制することができます。

また、当該サーバがクライアント認証を要求していないかどうかもチェックする必要があるでしょう。もし要求されているのであれば、当該コントロールの SSLCert プロパティが、サーバに対して提示する必要のある証明書を指すように設定してください。

Squid プロクシサーバ

http://www.nsoftware.com/kb/showentry.aspx?entry=01190501

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


IP*Works! は Squid プロクシをサポートしますか?

解決法:


IP*Works! は Squid プロクシをサポートします。Squid は HTTP Proxy であり、これは即ち HTTP GET リクエストを受理することを意味しますが、HTTPS GET は受理しません。ただし、Squid は非 SSL および SSL リクエストに対する HTTP トンネリングをサポートしていますので、以下にそのアクセス方法を示します。
    https1.FirewallType = nsoftware.IPWorksSSL.HttpsFirewallTypes.fwTunnel; 
https1.FirewallHost = "62.2.204.30";
https1.FirewallPort = 8080;
https1.Get("https://www.microsoft.com");

非 SSL URL をアクセスするのであれば、(URL に http:// を使う点を除き) 上記と同じ HTTP トンネリングコードをご利用頂けるはずです。あるいは、以下のコードもご利用頂けます。
    https1.ProxyServer = "62.2.204.30"; 
https1.ProxyPort = 8080;
https1.Get("http://www.microsoft.com");

SSLClientMode について

http://www.nsoftware.com/kb/showentry.aspx?entry=08040402

該当製品:


  • IP*Works! SSL


現象:


どうやれば IPPortS を「TLS サーバ」として、あるいは IPDaemon を「TLS クライアント」として動作させることができますか?

解決法:


IPPortS はクライアントコンポーネントであるため既定値では常に「TLS クライアント」です。同様に、IPDaemonS はサーバコンポーネントであるため常に「TLS サーバ」です。

通常のシナリオではクライアント (IPPortS) からサーバ (IPDaemonS) に向けて TCP コネクションを確立させます。次にクライアントは SSL クライアント hello を送信し、続けてサーバが承認情報 (acknowledgement) を返すことで SSL/TLS ネゴシエーションを開始します。

一方、この手順の2番目のパートを逆方向で行わねばならない、すなわち TCP クライアントが SSL サーバとして動作し、また TCP サーバが SSL クライアントとして動作せねばならないようなシナリオが幾つか存在します。ここで、TCP コネクションの後 IPDaemonS が SSL クライアントの hello を SSL サーバとして承認する立場の IPPortS に送信するものとしましょう。

IPPortS が TLS サーバモードを使用するよう強制するには、SSLClientMode 構成設定パラメータ (config setting) を false に設定します。IPPortS はあたかもサーバであるかのように証明書情報を提示します。そしてその情報はクライアント証明書を通常取得する場所、即ち SSLCert プロパティから取得されます。

また IPDaemonS に TLS クライアントモードを使用するよう強制するには、SSLClientMode 構成設定パラメータを false に設定します。このモードでは、SSLClientAuthentication イベントはあたかも IPPort の SSLServerAuthentication イベントであるかのように動作します。

【訳注】構成設定パラメータ SSLClientMode および SSLServerMode は V6/V8 共に利用可能ですが、どちらもヘルプファイルには記載されていません。

IP*Works! 製品は Google Talk をサポートしていますか?

http://www.nsoftware.com/kb/showentry.aspx?entry=09270705

該当製品:


  • IP*Works! SSL


現象:


IP*Works! 製品は Google Talk をサポートしていますか?

解決法:


SSL 製品に含まれている XMPPS (SSL 版 Jabber) コンポーネントは Google Talk をサポートしています。SSL 製品が必要なのは、Google Talk が SSL 接続を要求するためです。Google talk に接続するには、talk.google.com に Google Talk ログイン用メールアカウントを使用します。

例:)
    xmpp.IMServer = "talk.google.com";
xmpp.Connect("username@gmail.com", "password");

2008年4月15日火曜日

SSL Edition を Windows 9x で利用できますか?

http://www.nsoftware.com/kb/showentry.aspx?entry=06170433

該当製品:


  • IP*Works! SSL V6 およびそれ以前


現象:


SSL Edition 製品は Windows 9x 上で利用可能ですか?使おうとすると、エンクリプションエラーになってしまいます。

解決法


IP*Works! SSL は Windows NT 4.0 SP4 以降および Windows 2000 にインストールされているセキュリティ ライブラリを使用します。

SSL コンポーネント (HTTPS 以外のコンポーネント。HTTPS は以下の手順なしに、UseWininet プロパティに true を設定することで利用可能。) を Win9x プラットフォームで使用する、あるいは wininet を使用せずに利用するためには、SSPI を有効にする必要があります。

以下に必要な手順の概略を示します。
  1. http://www.nsoftware.com/download/ から IP*Works! SSL の最新ビルドをダウンロードします。

  2. Internet Explorer 5.01 またはそれ以降をインストールします。

  3. Windows 95/98 用のディレクトリサービス クライアントをインストールします。また、Windows 2000 サーバー CD に格納されている DSCLIENT.EXE をインストールする必要があります。このファイルは \Clients\Win9x\DSCLIENT.EXE として格納されています。この手順により、セキュリティ・サブシステムの重要部分をいくつか更新します。

  4. レジストリを更新する必要があります。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders に格納されている文字列の末尾に ", schannel.dll" を追加する必要があります。

レジストリ更新に不慣れな方は、regedit でレジストリを編集できます。

また、Win95、98 および NT で使用する証明書は、エクスポート可能とマークされた秘密鍵を含んでいる必要があります。

私の証明書は SSL トランザクションに使用できますか?

http://www.nsoftware.com/kb/showentry.aspx?entry=10190104

該当製品:


  • IP*Works! SSL


現象:


私の証明書が SSL トランザクションに対し有効かどうかはどうやって判定すればよいですか?

解決法:


あなたの「証明書」がデジタル ID であれば、SSL トランザクションに対し有効です。なお、その証明書には公開鍵と秘密鍵の両方が含まれていなければなりません。

秘密鍵証明書のみでは不十分です。

IP*Works! SSL コンポーネントは非 SSL モードでも利用できますか?

http://www.nsoftware.com/kb/showentry.aspx?entry=06170401

該当製品:


  • IP*Works! SSL


現象:


IP*Works! SSL コンポーネントは非 SSL モードでも利用できますか?

解決法:


SSL Edition に含まれる全てのコンポーネントは、非 SSL モードで動作します。SSL の無効化は、SSLStartMode プロパティに None を設定することで行うことができます。

注意: SSL Edition は SSL に無関係なコンポーネント、例えば UDP ベースのコンポーネントやエンコーディング関係のコンポーネントは含まれていません。

2008年4月14日月曜日

HTTP/S コンポーネントにおけるプロクシ関係プロパティの使い方

http://www.nsoftware.com/kb/showentry.aspx?entry=06170416

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


HTTP/S コンポーネントでどのようにプロクシ関連プロパティを使えばよいですか?

解決法:


基本認証をしたい場合:

proxyserver、port、user および password の各プロパティを指定するだけです:
    HTTPS1.proxyserver = proxyserver
HTTPS1.ProxyPort = 8080
HTTPS1.ProxyUser = user
HTTPS1.ProxyPassword = pass
HTTPS1.Get txtURL.Text

ダイジェスト認証をしたい場合 (少なくとも IP*Works! V6 以降が必要):
    HTTPS1.AuthScheme = 1 'authDigest
HTTPS1.proxyserver = proxyserver
HTTPS1.ProxyPort = 8080
HTTPS1.ProxyUser = user
HTTPS1.ProxyPassword = pass
HTTPS1.Get txtURL.Text

NTLM 認証が必要な場合: (少なくとも IP*Works! V8 が必要):

HTTPS1.AuthScheme = 4 'authNtlm
HTTPS1.proxyserver = proxyserver
HTTPS1.ProxyPort = 8080
HTTPS1.ProxyUser = user
HTTPS1.ProxyPassword = pass
HTTPS1.Get txtURL.Text

以前のバージョンの IP*Works! で NTLM 認証を行う必要がある場合 (HTTPS でのみ、usewininet を True に設定することでサポート):

  1. usewininet に true を設定し、proxyserver、port、user および password を指定:
        HTTPS1.usewininet = true
    HTTPS1.proxyserver = proxyserver
    HTTPS1.ProxyPort = 8080
    HTTPS1.ProxyUser = user
    HTTPS1.ProxyPassword = pass
    HTTPS1.Get txtURL.Text

  2. usewininet に true を設定し、全てを wininet に任せる:
        HTTPS1.usewininet = true
    HTTPS1.proxyserver = "*"
    HTTPS1.Get txtURL.Text

  3. usewininet に true を設定し、自分でユーザとパスワードを設定:
        HTTPS1.usewininet = true
    HTTPS1.proxyserver = "*"
    HTTPS1.ProxyPort = 8080
    HTTPS1.ProxyUser = user
    HTTPS1.ProxyPassword = pass
    HTTPS1.Get txtURL.Text

    これは以下のコードと同等です。
        HTTPS1.usewininet = true
    HTTPS1.proxyserver = "*user*password"
    HTTPS1.ProxyPort = 8080
    HTTPS1.Get txtURL.Text

NTLM プロクシ経由で認証する方法

http://www.nsoftware.com/kb/showentry.aspx?entry=11010101

該当製品:


  • IP*Works! V8
  • IP*Works! SSL V8 およびそれ以前


現象:


貴社コントロールを使用して NTLM プロクシ経由で認証しようとすると失敗します。どうすればよいのでしょうか?

解決法:


NTLM は HTTP および電子メール関連の全てのコントロールにおいて AuthScheme プロパティまたは AuthMechanism プロパティ経由でサポートされています。これらのプロパティに NTLM を設定し、User プロパティおよび Password プロパティにそれぞれ適切な値を設定するだけでご利用頂けます。

ただし以前のバージョンでは、NTLM プロクシは IP*Works! SSL パッケージでのみ、UseWininet プロパティあるいは UseWinInet Config 設定 (どちらを使用するかは製品バージョンによります) を通じてをご利用頂けました。既定値では wininet 機能は利用されず、このためこれら古いバージョンでは NTLM をサポートするためには UseWinInet に true を設定する必要があります。

UseWinInet を設定した後は、ProxyServer プロパティ経由でプロクシサーバで認証するための正しいユーザ名およびパスワードを渡す必要があります。
HTTPS1.ProxyServer = "*" & ProxyUsername & "*" & ProxyPassword

これらを設定した後なら一連の HTTP/S メソッドを発行し、NTLM プロクシを通過することができるはずです。

IPMonitor で外に出て行くパケットを表示できません

http://www.nsoftware.com/kb/showentry.aspx?entry=06170430

該当製品:


  • IP*Works!


現象:


IPMonitor コンポーネントを使っているのですが、受信パケットは全く問題なく表示できますが送信パケットが全く表示されません。

解決法:


IPMonitor はインターフェイスによって「受信」されたパケットだけを検出します。ただし、Windows XP のパーソナルファイアウォール機能を有効にすることで送信データが見えるようになります。

パーソナルファイアウォール機能はネットワーク接続プロパティの「拡張機能」タブにあります。

注意: 当該インターフェイスはプロミシャスモードをサポートしていなければなりません。この機能は Windows 2000 以降でのみ利用可能です。(また、多くのワイヤレスカードではセキュリティ上の観点からこの機能は動作しないようになっている可能性があります。)

注意: あなたのコンピュータがスイッチに接続している場合、スイッチはあなたのコンピュータ向けのパケットだけをフォワードします。そうではなくあなたのコンピュータが接続しているのがハブである場合、あなたはあらゆるデータを受信します。

また、この機能をご利用いただく場合は管理者権限 (raw socket 権限) を持っていなければなりません。

2008年4月11日金曜日

Error: Valid Name, no data record

http://www.nsoftware.com/kb/showentry.aspx?entry=12140004

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


貴社製品のコントロールを使おうとすると、"Valid Name, no data record" というエラーになります。

解決法:


この問題は、ご利用頂いている DNS サーバがドメイン名を IP アドレスへと解決できない場合に発生します。正しい名称、例えば 'domain.com' の代わりに 'www.domain.com' を指定してみてください。

これは DNS サーバの問題である可能性もあります。

DNS 解決を手で行い、URLServer 部分を数値 (IP アドレス) で置換する方法もあります。
    HTTP1.GET "http://10.0.1.129/file.htm"

Non-authoritative 'Host not found' (try again or check DNS setup)

http://www.nsoftware.com/kb/showentry.aspx?entry=06170414

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


"Non-authoritative 'Host not found'" が出続けるのですが、これは何を意味していてどう対処すればよいのでしょうか。

解決法:


エラー 11002 は問い合わせを受ける DNS サーバの幾つかあるいは全てが、指定されたタイムアウト時間内に応答を返さなかったことを意味します。従って、'host not found' エラーは信頼できるものではありません。与えられたホスト名が正しいものであるかどうかを確認するか、ホスト名の代わりに IP アドレスを使用してください。

DNS システムは電話番号案内システムに似ています。あなたがオペレーターに問い合わせ、それが市外の番号であればオペレーターは上位管轄のオペレーターに問い合わせ、そしてその番号が国際電話番号であれば恐らく第3のオペレーターに問い合わせを行うでしょう。

簡易な解決法:少し待ってみましょう。Winsock の待ち時間が十分ではなかったのだと思われます。それでも問題が発生するようであれば、インターネット接続やネットワーク等に問題がある可能性があります。

SMTP 認証 (RFC2554)

http://www.nsoftware.com/kb/showentry.aspx?entry=12140001

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


認証を必要とする SMTP サーバに接続したいのですが。

解決法:


IP*Works! の Version 6 では AuthMechanism、User および Password の各プロパティを通じ基本認証および CRM-MD5 認証を SMTP 認証としてサポートします。これらのプロパティに適切な値を設定し、サーバに対し接続するだけです。
  SMTP1.AuthMechanism = 0 'amUserPassword or BASIC
SMTP1.User = "username"
SMTP1.Password = "password"

では、それより古いバージョンの IP*Works! ではどうすればよいでしょうか?この場合は、以下のコマンドをサーバに対し送信します:
  SMTP1.Command = "AUTH LOGIN"
SMTP1.Command = "base64-encoded-username"
SMTP1.Command = "base64-encoded-password"

なお、Base64 エンコーディングには NetCode コントロールをご利用いただけます。

SMTP コンポーネントで送信したメッセージを「送信済み」(Sent) フォルダに移動する方法

http://www.nsoftware.com/kb/showentry.aspx?entry=06250702

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


メッセージを「送信済み」(Sent) フォルダに追加するには、IMAP コンポーネントを使用できます。

解決法:


SMTP コンポーネントを使用して送信したメッセージのコピーを、あなたのメールサーバの「送信済み」アイテムフォルダに保存する必要があるのであれば、以下の方法を利用できます:

まず最初に、送信したメッセージのヘッダと本文を以下のようにして保存します:
  String myMessage = smtp.MessageHeaders + "\r\n\r\n" + smtp.MessageText;

続いて、IMAP コンポーネントを用いて以下のようにします:
  imap.MesageText = myMessage;
imap.Mailbox = "SENT";
imap.AppendToMailbox();

IMAP サーバ上でメールにフラグを設定する

http://www.nsoftware.com/kb/showentry.aspx?entry=10080104

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


IMAP 経由で MessageFlags に "Seen" を設定したのですが、"BAD Protocol Error: Specified set of flags is not valid" (指定されたフラグ集合は無効です) というエラーになってしまいます。

解決法:


あなたの得たい結果を得るには、"\Seen" (C# なら @"\Seen" または "\\Seen") を設定してください。

IMAP MailboxList

http://www.nsoftware.com/kb/showentry.aspx?entry=06050205

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


あるアカウントにおいて、Inbox だけでなく全てのメールボックスの一覧を取得したい。

解決法:


IMAP プロトコルでは、メールボックス上でメールボックスの一覧メソッドを実行した場合、返されるリストには当該アカウントのメールボックスが全て含まれます。例えば以下のようにしてください:

imap.Mailbox = "*"
imap.ListMailboxes

MIME バウンダリが見つかりません

http://www.nsoftware.com/kb/showentry.aspx?entry=06050210

該当製品:


  • IP*Works!


現象:


POP/MIME を試しているのですが、"20283 - No MIME-boundary found" という奇妙なエラーがでてしまいます。

解決法:


このエラーは、デコードしようとしているファイルが MIME エンコードされていないか、あるいは正しくエンコードされていないかのどちらかであることを意味します。POP コントロールからメッセージを Localfile プロパティまたは Transfer イベントを通じて保存しようとしているのであれば、デコード対象のメッセージのヘッダがないことを表しています。このヘッダは MIME コントロールに必須のものです。これらのヘッダは POP コントロールの Headers イベントを通して得られます。同様のことが IMAP オブジェクトについても言えます。デコードしようとしている対象に、ヘッダとメッセージ本文が共に含まれていることを確認してください。

POP で受け取ったメールのデコード方法

http://www.nsoftware.com/kb/showentry.aspx?entry=06170422

該当製品:


  • IP*Works!


現象:


メッセージ受信の際に、POP オブジェクトから受け取ったメッセージがエンコードされています。どうしてこのようにエンコードされたままなのでしょうか。また、そのメッセージを市販の製品と同じように表示するにはどうすればよいのでしょうか。

解決法:


平文より複雑なメッセージは MIME エンコードされます。アタッチメントや HTML パート、インラインイメージやフォーマット済み文書は単一のエンティティにエンコードされます。これらのメッセージはメールクライアントによってデコードされるまでは MIME 形式のままです。POP サーバから受け取ったメッセージを対応するパートへとデコードするには、MIME オブジェクトを使用する必要があります。MIME エンコーディングは何階層にもカプセル化することができるため、MIME エンティティが埋め込まれていることを検出した場合は自分自身を呼び出し可能な再起呼び出しルーチンを使いと思うでしょう。以下に示すのは MIME デコード用の一般用途向けのルーチンです。このルーチンを、POP の MessageHeaders と MessageText の値を使って呼び出すことになります。
Private Sub MimeDecode(ByVal EntityHeaders As String, ByVal Entity As String)
Dim Mime1 As New nsoftware.IPWorks.Mime
Dim i As Integer
Mime1.MessageHeaders = EntityHeaders
Mime1.Message = Entity
Try
Mime1.DecodeFromString()
Catch
'If an error is encountered, the entity is not a valid MIME entity
Exit Sub
End Try
For i = 0 To Mime1.PartCount - 1
'If the Content-Type is "Multipart/????", then that part is an encoded entity
'You will want to call this routine again
If LCase(Mime1.PartContentType(i)).StartsWith("multipart") Then
MimeDecode(Mime1.PartHeaders(i), Mime1.PartDecodedString(i))
End If

'If a part is text/plain and is not an attachment, it is generally
'the plain text body of the message
If Mime1.PartFilename(i) = "" And LCase(Mime1.PartContentType(i)) = "text/plain" Then
'Display your text here; you'll want to read from
Mime1.PartDecodedString(i)
End If

'If you're going to support HTML messages, you'll want to look for this
'part, and if found, use it in place of the plain text
If LCase(Mime1.PartContentType(i)) = "text/html" Then
'Again, read from Mime1.PartDecodedString(i) to access
End If

'External attachments show up with a content-disposition of "attachment"
If LCase(Mime1.PartContentDisposition(i)) = "attachment" Then
'Mime1.PartFilename(i) will contain the name of the file.
'To actually get the file itself, you must read the value of
'Mime1.PartDecodedFile(i). Doing so will return the name of a
'temporary file that contains the file data; this file will not
'be created until PartDecodedFile is queried. Once you have the name
'of a temporary file with the data, simply rename the file to the
'location and name of where you wish to save the file
End If

'Inline data that are sent in the email will generally have a
'content-ID header and a content-disposition of "inline"
If LCase(Mime1.PartContentID(i)) <> "" Then
'Treat these cases as you would external attachments. The HTML that
'is returned will include CID tags that should correspond with this
'data, or you can simply save the images as you would an attachment
'if you do not wish to support HTML
End If
Next
End Sub

POP 経由でメールのヘッダだけを取得する方法

http://www.nsoftware.com/kb/showentry.aspx?entry=10109701

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


POP コントロールの概要ページにあるように、メッセージのヘッダだけを取得するにはどうすればよいですか?

解決法:


メッセージのヘッダだけを取得するために、RetrieveHeaders メソッドが用意されています。このメソッドを呼び出すことで、一連のヘッダが Header イベントまたは MessageHeaders プロパティを通じてアクセスできます。

ご利用頂いている製品が古いバージョンのものである場合は、MaxLines プロパティに 1 を設定することで、Transfer イベントを通じてメッセージの最初の1行を取得するとともに、Headers イベントを通じて全てのヘッダを取得できます。

2008年4月10日木曜日

POP サーバからメッセージが削除できない

http://www.nsoftware.com/kb/showentry.aspx?entry=03039801

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


POP コンポーネントでのメッセージ削除で困っています。

解決法:


変更を反映するには、Disconnect メソッドを呼び出してサーバから切断する必要があります。また、Reset() メソッドを呼び出すことにより、全ての変更を復旧することができます。

FTP サーバにファイルをアップロードする際に、パーミッションを変更できますか?

http://www.nsoftware.com/kb/showentry.aspx?entry=07180003

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


FTP サーバに対しファイルをアップロードする際にパーミッションの設定値も変更したいのですが、可能ですか?

解決法:


はい、問題の FTP サーバがパーミッション変更機能をサポートしているのであれば可能です。パーミッションの変更は以下のように行います:
FTP1.Command = "SITE chmod " + "<permission mask>" + " " + filename

(ここで <permission mask> はchmod に対する引数。例えば "755"。)

あるファイルが FTP サーバ上に存在するかどうかを調べる方法

http://www.nsoftware.com/kb/showentry.aspx?entry=09260705

該当製品:


  • IP*Works! V8


現象:


あるファイルが FTP サーバ上に存在するかどうかを調べるにはどうすればよいですか?

解決法:


IP*Works! V8 製品には FileExists プロパティがあります。このプロパティを使用することで、RemoteFile に指定されたファイルがサーバ上に存在するかどうかをチェックすることができます。初期のバージョンの IP*Works! 製品では同じ機能を RemoteFile にファイル名を設定し、DirectoryList コマンドを実行してその結果発生する DirList イベントをチェックして指定されたファイルが存在するかどうかを確認することで行っていました。

2008年4月9日水曜日

FTP エラー: '425 Can't open data connection'

http://www.nsoftware.com/kb/showentry.aspx?entry=03239801

該当製品:


  • IP*Works!


現象:


ディレクトリ一覧を取得あるいはデータを転送しようとすると、FTP サーバが "425 Can't open data connection" (データコネクションをオープンできません) というエラーを返します。

解決法:


この現象は、ファイアウォールがコネクションの作成を許していない場合は発生します。FTP では2つのコネクション (メインコネクションとデータ転送用コネクション) を使用するため、ファイアウォールではこれが問題となります。

既定値では、FTP コンポーネントの Passive プロパティは false になっています。これは、当該コンポーネントがアクティブモードにあることを意味します。この場合、データ転送用の TCP コネクションはサーバからクライアントに向けてオープンされます。そして、クライアントがファイアウォールの内側にある場合、サーバはコネクションを張ることができないでしょう。このような場合は、Passive プロパティを true に設定してパッシブモードを使用するようにします。

そして FTP サーバが正しく設定されているのであれば - パッシブデータコネクションで使用するポート範囲は、ファイアウォールが当該ポート範囲宛に届く外部からの TCP コネクションを許すようにファイアウォールとの間で調整しておくようにします。

2008年4月8日火曜日

FTP サーバが ''500 command unrecognized'' という応答を返します。

http://www.nsoftware.com/kb/showentry.aspx?entry=09039705

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


FTP コンポーネントを使用してファイルをアップロードすると、リモート側 FTP サーバがコマンドを認識できないと文句を言います。

解決法:


この現象は、FTP コンポーネントが送信するコマンドをサーバ側が解釈できない場合に発生します。通常これはサーバが特定のコマンドをサポートしていないか、あるいは当該コマンドを無効に設定していることが原因です。コンポーネントが何を送信しているかを確認するには、PITrail イベントをご利用いただけます。

2008年4月4日金曜日

アクティブモード転送における FTP ポート範囲について

http://www.nsoftware.com/kb/showentry.aspx?entry=09260706

該当製品:


  • IP*Works! V8


現象:


時として FTP クライアントはファイアウォールを通過するためにアクティブモード転送において特定の範囲のポートを使用する必要がある

解決法:


既定値では FTP コンポーネントはデータ転送にパッシブモードを使用します。これは通常の必須要件です。しかし時にはアクティブモードのデータ転送が必要になる場合がありますが、これはクライアント側のファイアウォールでしばしば問題を引き起こします。弊社 FTP コンポーネントでは、PortRange 構成設定を使用することである一定のポート範囲を指定しアクティブモードのデータ転送を行うことができます:
ftp.Config("PortRange=5000-5005");
ftp.ListDirectory();

NAT ファイアウォールを通して FTPS を使用したい

[http://www.nsoftware.com/kb/showentry.aspx?entry=09260707]

該当製品:


  • IP*Works!


現象:


NAT ファイアウォールを通して FTPS を使用したい

解決法:


NAT ファイアウォールを通しての FTPS の使用には問題があります。なぜならインターネットプロトコルの多くとは異なり、FTP はソケットコネクションを1つではなく2つ必要とするからです。第1のコネクションは制御コネクション (control connection) と呼ばれるもので、クライアントとサーバの間のコマンドとその応答は全てこのコネクション上で交わされます。第2のコネクションはデータコネクション (data connection) と呼ばれるもので、データ (ファイルおよびファイル一覧) を交換するためのものです。

そしてデータコネクションを設定するには、アクティブモードとパッシブモードの2つの方法があります。アクティブモードでは、データコネクションはサーバからクライアントに向けてオープンされます (つまりクライアントはサーバからのコネクションをリスンすることになります)。一方パッシブモードは丁度その反対で、クライアント側からサーバに対しコネクションをオープンします (つまりサーバ側がクライアントからのコネクションをリスンすることになります)。このパッシブモードが、特に SSL 接続のためには必要となります。

通常の暗号化されていないパッシブモードにおける FTP データコネクションは次のように構成されオープンされます:

CLIENT → SERVER: PASV
SERVER → CLIENT: 227 OK, Entering Passive Mode (193,12,1,121,15,6)


クライアントが PASV コマンドを送信するとサーバは "OK" と応答し、クライアントに対し自身の IP アドレスとリスンしているポート番号を通知します。カッコ内の最初の4オクテットはドット表記の IP アドレス (193.21.1.121) を表し、最後の2オクテットがポート番号 (15 × 256 + 6) = 3846 を表しています。この時点でサーバはデータコネクションをリスンしており - クライアントは次のステップとして双方向のデータ転送を開始できるように当該コネクションを張ることが可能となります。

さて、ここで NAT (Network Address Tranlation) を間に挟んでみましょう (CLIENT → NAT → SERVER)。この場合、通信は次のようになるでしょう。

CLIENT-->NAT: PASV
NAT-->SERVER: PASV
SERVER-->NAT: 227 OK, Entering Passive Mode (10,0,1,121,15,6)
NAT-->CLIENT: 227 OK, Entering Passive Mode (193,21,1,121,15,6)


これを見てお分かりのように、NAT は PASV コマンドに対するサーバの応答を覗き見しなければなりません。つまり、NAT はサーバが 10.0.1.121 のポート 3846 でリスンしていることを理解します。しかしこの例では、サーバはクライアントからは到達不可能なプライベートアドレスになっています。そして、NAT にはクライアントと通信可能なパブリックアドレスが割り当てられています。従って、NAT はサーバの応答を自分自身の応答で置き換えて、クライアントに対し NAT のアドレスとポートに対してコネクションをオープンするよう伝えます。そしてその次には当然、NAT がそのアドレスとポートに対するコネクションを受け取ったらその接続を FTP サーバの IP アドレスとポートに対しフォワードすることになります。

ここで別の厄介な問題が発生します。SSL ではどうなるのでしょうか。NAT は PASV 応答を覗き見することも、それを書き直すこともできません。従ってクライアントはファイアウォールの向こう側の、アクセス不可能な IP アドレスに対するデータコネクションを開こうとしてしまうことになります。

ではこれに対する解決法はあるのでしょうか? FTP サーバによっては、パッシブモード時に使用する IP アドレス (およびポート範囲) を管理者が指定できるようになっているものがあります。この場合、管理者はそのパブリック IP アドレスを設定することになるでしょう。また NAT によっては特定のポート範囲を自動的に固有のマシン/ポートにフォワードするよう管理者が設定できるものもあります。従って管理者がこのポート範囲を当該 FTP サーバが使用するパッシブポート範囲に一致するよう設定できれば、問題は解決するでしょう。別の解決法としては、EPSV (Extended Passive Mode) コマンドを使用するように設定する方法があります。この EPSV コマンドはポート番号のみを送信し、IP アドレスは制御コネクションの IP アドレスをそのまま使用します。IP*Works! の FTPS コントロールは UseEPSV 構成オプションをサポートしており、これを TRUE に設定することで対応可能です。

2008年3月27日木曜日

特定のマシンの MAC アドレスを得る方法

[http://www.nsoftware.com/kb/showentry.aspx?entry=09260713]

該当製品:


  • IP*Works!

現象:


特定のマシンの MAC アドレスを取得するにはどうすれば良いでしょうか?

解決法:


まず、IPInfo コンポーネントの GetMAC メソッドを用いる方法があります。
string macaddress = ipinfo.GetMAC("10.0.1.1");

【訳註: GetMAC メソッドは Windows 製品でのみ利用可能です。また、取得可能な対象は、同一 LAN 上の同一サブネットに属する機器に限定されます。】

別の方法としては、SNMP を用いる方法があります。この場合はまず相手デバイス上のインターフェイス数を get リクエストで取得します (ifEntryNum - 1.3.6.1.2.1.2.1)。次に各インターフェイスに対してその MAC アドレスを get リクエストで取得します (ifPhysAddress - 1.3.6.1.2.1.2.2.1.6)。この方法を使う場合、(ifEntry テーブルには幾つか子ノードを持っており) 当該インターフェイスについて MAC アドレス以外にも当該デバイスのタイプ (ifEntryType - 1.3.6.1.2.1.2.2.1.3) 等様々な情報を取得することができます。

2008年3月21日金曜日

HTML ページ内における OCX ライセンシング

[http://www.nsoftware.com/kb/showentry.aspx?entry=09229702]

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


OCX を使用して HTML ページを作成していますが、ユーザ側で Internet Explorer を使用して当該ページを表示すると About ダイアログが表示されてしまいます。

解決法:


Internet Explorer 内の ActiveX コンポーネントにライセンスを付与するためには、Microsoft の LPK ツールを使用する必要があります。また、lpk ファイルは license.lpk という名称でなければなりません。

もし実際に動く実例が必要な場合は、弊社サポートまで email にてご連絡ください。

IP*Works! 製品の ActiveX コンポーネントは ActiveX Control Licensing Mechanisum を実装しています。Web 上でランタイムライセンスを付与されたコントロールを配布するためには、適切なランタイムライセンスファイル (LPK ファイル) を生成し、ウェブページ内に含める必要があります。そうでないと例え当該コントロールをダウンロードしインストールしたとしても当該コントロールはユーザ側マシンでは表示されません。コントロールに対するランタイムライセンスは、当該コントロールに対する有効な開発者ライセンスを持つ人のみが生成することができます。ウェブページにランタイムライセンスを付与済みのコントロールを含める具体的な方法につきましては、ActiveX Software Development Kit (SDK) の「Licensing ActiveX Controls」節を参照して下さい。ActiveX SDK のダウンロードは http://www.microsoft.com/ から行うことができます。以下に SDK 文書からの抜粋で、ウェブページにランタイムライセンス付与済みにコントロールを配布するための方法を示しておきます。

ライセンスパッケージは、既存の <OBJECT> タグ (要素) を使用して HTML ファイルに記載されなければなりません。ライセンスパッケージは、ランセンスマネージャオブジェクトにより解釈され、HTML 上の他のコントロールにライセンスを受け渡します。ライセンスパッケージオブジェクトは、当該ライセンスを必要とする全てのオブジェクトより前に当該 HTML ページに埋め込まれていなければなりません。HTML へのライセンスパッケージ埋め込みのための構文は以下のようになります。
      <OBJECT CLASSID = "clsid:5220cb21-c88d-11cf-b347-00aa00a28331">
<PARAM NAME="LPKPath" VALUE="relative URL to .LPK file">
</OBJECT>

注意: Internet Explorer 3.0 は、ある HTML ページ内の最初のライセンスパッケージのみを有効とみなします。もし当該ページ内で複数のコントロールを使用しているにもかかわらず、最初に見つかったライセンスパッケージにそれらに対するライセンスが含まれていない場合、該当するコントロールはインスタンス化に失敗するでしょう。

ActiveX SDK には自動的に LPK ファイルを生成するユーティリティ (LPK_TOOL.EXE) が含まれています。

詳細に関しては以下の URL を参照して下さい。
http://www.microsoft.com/workshop/components/activex/licensing.htm

2008年3月19日水曜日

C++ Builder におけるライセンスについて

[http://www.nsoftware.com/kb/showentry.aspx?entry=05120501]

該当製品:


  • IP*Works!
  • IP*Works! S/MIME
  • IP*Works! SSL


現象:


C++ Builder Edition のライセンスを購入済みですが、未だに試用版の "About" メッセージダイアログが表示されます。

解決法:


C++ Builder で動的にコンポーネントを生成しているのであれば、以下のコードをご利用ください。
TipwIPPort* ipp;
ipp = new TipwIPPort(NULL, TRUE);

原則として、コンストラクタの第2引数には TRUE を指定すべきです。

.NET Windows サービスアプリケーションのライセンス

[http://www.nsoftware.com/kb/showentry.aspx?entry=04300306]

該当製品:

  • /n software Red Carpet Subcription
  • IP*Works!
  • IP*Works! EDI
  • IP*Works! EDI AS2 Connector
  • IP*Works! S/MIME
  • IP*Works! S/Shell
  • IP*Works! Secure SNMP
  • IP*Works! SSH
  • IP*Works! SSL
  • IP*Works! Zip


現象:


Windows サービスアプリケーション内でもコンポーネントを利用できますか?

解決法:


はい、ご利用いただけます。ただしデモ版をご利用の場合、サービスのプロパティを変更してライセンスダイアログを表示できるようにしておく必要があります。これを行うには以下のようにします。
  1. MMC を起動します。
  2. "Services" スナップインを追加します。
  3. あなたの作成したサービスを探し、右クリックして "properties" を選択します。
  4. "Log On" タブをクリックします。
  5. "Allow service to interact with desktop" と書かれたチェックボックスをチェックします。

これにより当該サービスからのモーダルメッセージボックスがデスクトップに表示されるようになります。

弊社の .NET Edition のコンポーネントは Microsoft 社の .NET ライセンシング・スキームを使用しています。これはつまり、ライセンス済みのコンポーネントをフォームにドロップすると Visual Studio .NET は自動的に "licenses.licx" という名称のファイルを生成し、該当するプロジェクトに埋め込みリソース (embedded resource) として自動的に追加することを意味します。Visual Studio .NET 内でライセンス済みコンポーネントが動作するためには、この licx ファイルが必要となります。

あなたのアプリケーションがフォームを使用しない、あるいはコンポーネントを動的に生成するものである場合は、licenses.licx を手で作成することもできます。このファイルの各行は、それぞれがライセンス済みコンポーネント1個に対応しています。そしてそれぞれの行には当該コンポーネント名とライブラリ名が書かれています。例えば、あなたが利用するコンポーネントが nsoftware.IPWorks.dll の NNTP コンポーネントであれば、licx ファイルは次のようになっているでしょう:

nsoftware.IPWorks.Nntp, nsoftawre.IPWorks

なお既定値では Visual Studio はこれ以外の情報も付加します。もしライセンス上の問題が発生した場合はそれらの余分な情報を除去し、上のように2つの要素のみが含まれるようにしてみて下さい。

重要な注意事項:
  • licx ファイルは必ず "licenses.licx" という名称でなければなりません。また、当該プロジェクトに埋め込みリソースとして含まれていなければなりません。
  • 開発対象がクラスライブラリである場合は、当該クラスライブラリを参照する側のプロジェクトにも .lixc ファイルが埋め込みリソースとして含まれている必要があり、かつ参照する側は有効なライセンスがインストールされているマシンでコンパイルされる必要があります。
  • そして最後に注意する点としては、Visual Studio .NET には不具合があり、当該プロジェクトの名称に空白文字 " " が含まれていると licx ファイルを正しくマッチングすることができません。従ってもしプロジェクト名に空白文字が含まれている場合は、それらを除去するか別の文字に置換してからプロジェクトを再ビルドしてみて下さい。

.NET におけるライセンスについて

[http://www.nsoftware.com/kb/showentry.aspx?entry=01020301]

該当製品

  • IBiz Amazon Integrator .NET Edition
  • IBiz E-Banking Integrator .NET Edition
  • IBiz E-Payment Integrator
  • IBiz FDMS Integrator .NET Edition
  • IBiz FedEx Integrator .NET Edition
  • IBiz Paymentech Integrator .NET Edition
  • IBiz PayPal Integrator .NET Edition
  • IBiz QuickBooks Integrator
  • IBiz USPS Integrator .NET Edition
  • IP*Works!
  • IP*Works! S/MIME
  • IP*Works! S/Shell
  • IP*Works! Secure SNMP
  • IP*Works! SSL
  • IP*Works! Zip


現象:


.NET エディションの製品ライセンスを購入したにもかかわらず、"About" ダイアログが表示されてしまいます。

解決法:


弊社の .NET Edition コンポーネントは Microsoft 社の .NET ライセンシング・スキームを使用しています。これはつまり、ライセンス済みのコンポーネントがフォーム上にドラッグ&ドロップされた場合は常に Visual Studio.NET は自動的に "licenses.licx" という名称のファイルを作成し、当該プロジェクトに埋め込みリソース (embedded resource) として自動追加されることを意味します。Visual Studio .NET 上でライセンス済みコンポーネントが動作するには、この licx ファイルが必要となります。

なお、フォームを使用しない場合、あるいはコンポーネントを動的に生成して使用する場合は、licenses.licx ファイルを手で作成することができます。このファイルはライセンス済みの各コンポーネントに対応する行から構成されており、各行にはコンポーネント名とライブラリ名が格納されます。例えば nsoftware.IPWorks.dll の NNTP コンポーネントを使用するのであれば、licx ファイルは以下のようになるでしょう:

nsoftware.IPWorks.Nntp, nsoftware.IPWorks

既定値では Visual Studio は他の情報 (バージョンやカルチャ等) も記載しますが、ライセンスで問題が発生する場合はこれらの付帯情報を削除して上記2項目のみが含まれるようにすべきです。

重要事項:

  • licx ファイルは "licenses.licx" という名称でなければならず、かつ当該プロジェクトに埋め込みリソース (embedded resource) として含まれなければなりません。
  • クラスライブラリを開発する場合は、参照する側のプロジェクトにもこのlicx ファイルが埋め込みリソースとして含まれていなければならず、かつ有効なライセンスがインストールされているマシン上でコンパイルされなければなりません。
  • そして最後にもうひとつ注意すべき点があります。Visual Studio には、プロジェクト名称に空白文字 (" ") が含まれている場合、正しく licx ファイルを対応付けることができないという問題点があります。プロジェクト名に空白文字が含まれている場合はそれらを削除するか、別の文字に置換してからプロジェクトをリビルドしてください。

本アーカイブについて

このブログには、弊社で提供するナレッジベースを個人的に日本語化したものを随時掲載していきます。

また、ここに投稿される日本語訳はあくまでも私が個人的に訳したものであり、/n software inc. により公式に認定されたものではなく内容の正確性や正当性を保証するものではありません。

内容は随時チェックしているつもりですが、日本語訳掲載後にオリジナルのデータベースが更新されることもあります。内容に違いがある場合はオリジナルの英語版が優先されます。