sourceforgeのDelphi Email Clientが動かない

解決


ぽんつく「  2014-05-13 09:26:42  No: 46308

初めまして。ぽんつくと申します。
sourceforgeに置かれているDelphi Email Clientというプロジェクトをダウンロードし解凍してみたのですが、
うまく動きません。何とか動かしたいのでご教授お願いします。
現在以下のような状況です。

1  付属のビルド済みファイル「DelphiEmail.exe」を起動しようとすると「Unavailable database」のエラーが出ます。
  (このプログラムは受信メール等の情報をデータベースとして管理しています。)
2  添付のデータベースの拡張子が.FDBであったため、試しに「Firebird Embedded Server」のDLLファイルを
  プロジェクトと同一フォルダ内にコピーしてみると、エラーの内容が「Access violation at address 0062261E in
  module "DelphiEmail.exe'. Read of address 00000004.」になります。

  ここで取りあえず付属の実行型ファイルの起動をあきらめ、プロジェクトを開いてみることにしました。でも

3  プロジェクトを開こうとすると「応答なし」になってしまいます。
4  仕方ないので空のプロジェクトを作成して各ユニットを追加しビルドすると、起動はするのですが、
  「プロジェクトtest.exeがEaccess violationクラスの例外を生成しました。……」というエラーが出ます。
  このエラーはEmailPop3ユニットのPOP3_Initiateというファンクションの以下の行で発生しているようです。
  
  FoldersTable.SelectSQL.Strings[1] := 'where USERNAME = ' + #39 + UserDetails.UserName + #39;

  原因は良く分からないのですが、プロジェクトが開けない問題を除くと、不具合の要因はデータベースの管理
に起因しているようです。特にエラーが発生する行を見ると、FolderTableデータセットにアクセスしたのが原因
ではなく、代入しようとしているUserDetails.UserNameを格納しているEmailTableデータセットにアクセスしたこと
によってエラーが発生するようです。どなたか、このプロジェクトをビルドして成功なさった方はいらっしゃいます
でしょうか?何か情報をいただけると嬉しいです。

  ちなみに私の環境はWindows7+Delphi7という組み合わせで、プロジェクトが想定している環境とは異なりますが、
XE5を試しにトライアルでインストールしてもプロジェクトは開くことができませんでした。またDelphi7ではありますが、
プロジェクトに付属の「EmbeddedWB」「PBear THtml」は勿論、Project  JEDIの「JCL」「JVCL」はインストール済みです。
またDelphi7付属のIndyでは不足が出るため、Indy10に入れ換えてあります。

よろしくお願いします。


DEKO  2014-05-13 14:53:06  No: 46309

とりあえず、EMAILS.FDB が C:\Program Files\Delphi Email\Data から
読み込まれる仕様をどうにかしてみてはいかがでしょうか?

# 想定されている Delphi は 2009 のようですね。


ぽんつく  2014-05-13 16:12:36  No: 46310

DEKO様、早速のアドバイスありがとうございます。
確かに色々更新が入るデータベースを置くには、
良い場所ではありませんね。
現在作成中のプロジェクトは、\users\の下の\Documents
の下にありますが、同じフォルダ内から読み込む様に変更
してみました。でも、残念ながら動いてくれません。
引き続きご指導お願いします。


DEKO  2014-05-13 18:59:35  No: 46311

> でも、残念ながら動いてくれません。
エラーメッセージからするに、何かを Creete せずに使っちゃったとか、
そういった感じのバグのように思えます。

ソースのコメントに、
"21/08/2009 - Posted on Sourceforge, very buggy, supports MAPI, IMAP and POP3."
なんて書いてあるくらいですからね…(^^;A

そもそもちゃんと動くものをアップしたのかすらアヤしいレベルです。
オプソなので自力でどうにか解決するより他はないかもしれません。

# 申し訳ないですが、コンポーネントをインストールしてまで、
# 原因を追求する気にはなれませんです… m(_ _)m


ぽんつく  2014-05-14 07:53:47  No: 46312

DEKO様

確かに…このプロジェクトが本当に動くのか色々怪しいですね。
ただ、sourceforgeにレビューを寄せている人が2人(^^;もいたので、
ひょっとして日本でも動かした強者がいるのではないか…と思った次第です。

>何かを Creete せずに使っちゃったとか、
試しにエラーが出る1行前に、以下の行を追加してみました。
UserDetails := TUserInfo.Create;
その結果、デバッガーのエラーが以下の通り変化しました。

プロジェクトtest.exeがEIBInterBaseErrorクラスの例外を生成しました。
'Dynamic SQL Error
SQL error code = -206
Column unknouwn
EMAIL.JOBREF
At line 1,column8'

カラムの名前とか、間違っていないはずなのですけど…

>  コンポーネントをインストールしてまで…

ありがとうございます。私もそこまでお願いできません。

でも、動かした猛者がいないかも含め、もう少しこのスレッドはこのままに
させていただきたいです。引き続きご指導お願いします。


DEKO  2014-05-14 09:15:21  No: 46313

> EMAIL.JOBREF
テーブル EMAIL の最後にフィールド JOBREF (Integer) を追加してやる必要があるようです。


DEKO  2014-05-14 09:20:06  No: 46314

> ただ、sourceforgeにレビューを寄せている人が2人(^^;もいたので、
以前の "正常に動作していたバージョン" のレビュワーかもしれませんけどね (^^;A


ぽんつく  2014-05-15 08:08:34  No: 46315

>以前の "正常に動作していたバージョン" のレビュワーかもしれませんけどね (^^;A
ぎくぎくっ!!…(|||△|||)  本当だ!!投稿されたのは2009年と2010年ですね…
確かに、そうかも知れません…(^^;  不安が倍増しました…

>テーブル EMAIL の最後にフィールド JOBREF (Integer) を追加してやる必要があるようです。
アドバイスありがとうございます。
このソース非常に読みにくいのですが、調べてみるとJOBREFは、TPop3Formクラスのずっと下の方で、
TIntegerFieldとして定義されていました。

どうにも良く分からないので、function TPop3Form.POP3_Initiateの最初に次の4行を追加してみました。

     FoldersTable.Open;
     AttachmentTable.Open;
     EditFoldersTable.Open;
     EmailTable.Open;

このユニットの中で使用されている4つのデータセットをそれぞれオープンしてみた訳ですが、
最初の3行はエラー無くオープンできたのに、EmailTableをオープンすると先の'Dynamic SQL Errorが
発生します。この段階では、SQLは何もしていないはずなのですけど…


DEKO  2014-05-15 10:07:50  No: 46316

> このソース非常に読みにくいのですが、調べてみるとJOBREFは、TPop3Formクラス
> のずっと下の方で、TIntegerFieldとして定義されていました。

EmailPop3 ユニットのコンポーネントに指定されている SQL に JOBREF があります。

select 
  EMAIL.EMAILID,
  EMAIL.USERNAME,
  EMAIL.EMAILFOLDER,
  EMAIL.EMAILCONTENT,
  EMAIL.HEADER,
  EMAIL.EREAD,
  EMAIL.JOBREF
from 
  EMAIL 
where
  EMAIL.EMAILID = :EMAILID

insert into EMAIL
(
  EMAIL.EMAILCONTENT, 
  EMAIL.EMAILFOLDER, 
  EMAIL.EMAILID, 
  EMAIL.EREAD,
  EMAIL.HEADER, 
  EMAIL.JOBREF, 
  EMAIL.USERNAME
)
values
(
  :EMAILCONTENT, 
  :EMAILFOLDER, 
  :EMAILID, 
  :EREAD, 
  :HEADER, 
  :JOBREF, '
  :USERNAME
)

update EMAIL
set
  EMAIL.EMAILCONTENT = :EMAILCONTENT,
  EMAIL.EMAILFOLDER  = :EMAILFOLDER,
  EMAIL.EMAILID      = :EMAILID,
  EMAIL.EREAD        = :EREAD,
  EMAIL.HEADER       = :HEADER,
  EMAIL.JOBREF       = :JOBREF,
  EMAIL.USERNAME     = :USERNAME
where
  EMAIL.EMAILID = :OLD_EMAILID

つまり、EMAIL テーブルに JOBREF フィールドが必要という事ですので、
フィールドを追加してみてください。


ぽんつく  2014-05-16 08:48:49  No: 46317

>EmailPop3 ユニットのコンポーネントに指定されている SQL に JOBREF があります。
なるほど…
Pop3Formの「EmailTable:TIBDataSet」を右クリック→「データセットの編集」→
「SQL文」の中で定義されていたのですね。勉強になります。

>つまり、EMAIL テーブルに JOBREF フィールドが必要という事ですので、
>フィールドを追加してみてください。
Pop3Formの「EmailTable:TIBDataSet」を右クリック→「項目の設定」を選択すると
EmailTableの中の項目一覧が表示されますが、JOBREFもその中で定義されていました。
DEKO様が「フィールドの追加を」というのは、ここの部分のことですか?
(良く分からなくて済みません)


DEKO  2014-05-16 09:50:44  No: 46318

> DEKO様が「フィールドの追加を」というのは、ここの部分のことですか?
いえいえ。

Firebird の DB ファイルである EMAILS.FDB の EMAIL テーブルに
JOBREF を INTEGER 型のフィールドとして追加してみてください。


DEKO  2014-05-16 09:59:21  No: 46319

アーカイブの中の EMAILS.FDB の EMAIL テーブルは
以下の様なフィールド構成になっています。

EMAILID      INT64
USERNAME     VARCHAR(30)
EMAILFOLDER  INTEGER
EMAILCONTENT BLOB
HEADER       BLOB
EREAD        SMALLINT

DB 側に JOBREF フィールドがないんですよ。

> Column unknouwn
> EMAIL.JOBREF

これでは件の SQL エラーが出るのは当然です。


ぽんつく  2014-05-17 09:46:24  No: 46320

>DB 側に JOBREF フィールドがないんですよ。
!なるほど!!そうだったのですか!!!
ソースばかり見ていても駄目だったのですね…勉強になります。

>JOBREF を INTEGER 型のフィールドとして追加してみてください。
実はFirebirdを使うのは初めてで、今これを書きながらフィールドの追加の方法を
調べています。(^^;

Firebird ISQL Toolというのを使えば良いらしいことが分かってインストールし、
今EMAILS.FDBのテーブル一覧を見るところまで来ました。
画面はこんな感じです。

SQL> show tables;
          EMAIL                     EMAILATTACHMENT
          EMAILFOLDERS  

この後、恐らくEMAILの中を見て、フィールドを追加する手順があるのですね…


ぽんつく  2014-05-17 10:52:58  No: 46321

>SHOW FIELDS FROM EMAIL;
と入力すると、
Command error : SHOW FIELDS FROM EMAIL
になってしまいます…

>DESCRIBE EMAIL;
と入力すると、
-SQL error code = -104
-Token unknown - line 1 , column 1
-DESCRIBE
になってしまいます…(T△T)


DEKO  2014-05-17 20:39:45  No: 46322

IBConsole を DL して
テーブルのプロパティを右クリックするとフィールドを追加できます。

[IBConsole 日本語版+α]
http://ht-deko.minim.ne.jp/junkbox.html#IBCONSOLE

詳しくはユーザーズガイドの P.31〜32 を参照してください。

SQL で追加する場合には ALTER TABLE を実行します。
http://firebirdwiki.jp/index.php?ALTER%20TABLE#ffcf3b20

ALTER TABLE EMAIL ADD JOBREF INTEGER;

こんな感じです。


DEKO  2014-05-17 20:42:52  No: 46323

Firebird そのものに関しては

[Forum » Delphi » データベース開発 (Delphi Forum)]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewforum&f=11

この辺から検索してみてください。


ぽんつく  2014-05-18 10:17:55  No: 46324

>IBConsole を DL して
> テーブルのプロパティを右クリックするとフィールドを追加できます。

おお!これはとてもありがたいです!!
日本語化されている上にFirebirdに対応しているなんて凄いです!!
Firebirdに関しては、日本語の情報があまりないので
「DEKO様は詳しいなぁ…」と思っていたのですが、
ツールまで作成されていたのですね。

ただ残念ながら、今日はデータベースを読み込むところまでできませんでした。
「サーバーの登録と接続」でローカルを選択し、userに「sysdba」passwordに「masterkey」
と入力しエンターすると、「Cannot attach to password database」という
エラーが出てしまいました。

コマンドラインでgsec.exeを呼び出しても同じエラー「unable to open database」
が出たので、これはIBConsoleの問題ではありません。

元々Delphi  Email  Clientをさわり始めたときはembed版のdllをリネームして使っており、
今回初めてFirebirdをインストールしたので、その手順に問題があるのだと思います。
Firebird_2_5直下にあるsecurity2.fdbのパーミッションの問題らしいのですが、
今日一日色々調べたのですが、原因究明と解決には至りませんでした。

それにしても…X68030  懐かしいですね(^ω^


ぽんつく  2014-05-19 00:32:21  No: 46325

フィールドの追加できました!
件のsecurity2.fdbのアクセス権を変更することで、
テーブルにJOBREFを追加できました!!

変更した新しいデータベースを読み込んだところ、
今度はDynamic SQL Error …
Column unknown EMAIL.EMAILTOが出ました。
ソースを見るとEMailTableには、EmailToから
EmailPriorityまでのフィールドが、後から追加になった
様です。

ということはDEKO様に教えていただいたように、
オブジェクトにはSQLを、データベースのテーブルには
フィールドを追加する必要があるのですね^_^;
中々一筋縄では行きません。

早速、データベースにstring型のフィールドを追加しようと
したところ、
Specified domain or source column string does not exist
と…
String型は使えないみたいですね^_^;


DEKO  2014-05-19 16:47:58  No: 46326

> Cannot attach to password database
リンク先にもあったかと思いますが、Firebird DB を管理するには、
Embedded Server ではなく、通常の Firebird をインストールする必要があります。

[何度も出てくるので Firebird の接続方法]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1255

また、Firebird の初期ユーザ名&パスワードは Linux でない限り、
"SYSDBA" & "masterkey" です (大文字/小文字が区別されます)。

> String型
SQL 型 DB には "String 型" というものはなく、
文字列型は CHAR() または VARCHAR() 型となります。
Firebird も同様なので VARCHAR() でフィールドを定義してください。


DEKO  2014-05-19 16:50:44  No: 46327

通常の Firebird をインストールしていても接続できない場合、
GDS32.DLL がその Firebird 付属のものではない可能性があります。
GDS32.DLL を検索して調べてみてください。


ぽんつく  2014-05-20 09:31:13  No: 46328

動きました!!(T▽T)

いや、正確にはまだ動いていないのですが、今までは起動時に正常にデータベースが読み込めず、
エラーを生じることなくOnShowまで辿り着けなかったのが、取りあえず普通に起動するようになりました!!

今はまだメールの受信も送信も正常に動きませんが、最大の難関だったFirebirdの制御が
DEKO様に色々ご教授いただいたおかげで、普通に動き始めたです!!!

内容的には、まず通常のFirebirdをインストール。その後EmailTableにVARCHAR() 型で各フィールドを追加、
コンポーネント内のSQLも追加し、更に AttachmentTableにも追加アイテムがあったので、矢張りフィールドと
SQLを追加しました。

ここまでこれたのは、DEKO様にFirebirdについて色々ご教授いただいたおかげです!!
お礼の申し上げようもありませんが、本当にありがとうございました。

きっと正常に動くまでに、またここに質問に来ると思いますが(^^;、どうかまたお助け下さいませ。
本当にありがとうございました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加