メールのデータベース化No.44538
KRT さん 13/06/05 08:58
 
いつもお世話になっています。
送受信メールを、MySQLに登録して、簡単に参照出来る様にしたいのですが、何か参
考になるURLがもしあれば、教えて下さい。

1 PHPで、C:\TurukameDataにある、送受信ファイルを開く
2 メルアド・本文等のデータを、MySQLに登録
3 メルアドを入力 -> 履歴を表示
という様なツールです。

ネットで探しましたが、見つかりませんでした。
宜しくお願い致します。



[ ]
RE:44538 メールのデータベース化No.44539
秀まるお2 さん 13/06/05 13:36
 
 メールデータをMySQLに登録させるってことは、僕自身はやったことが無くて、
さらにはそういうことをしてる人がいる、みたいな話も聞いたことが無いです。

 なので出来るかどうか分かりませんけども、"ADO.Connection"か、または
"ADODB.Connection"っていうCOMオブジェクトをマクロから呼び出して使えば出
来そうな気がします。

 参考情報:
    http://wsh.style-mods.net/tips/wshtips_9-05.htm
    http://db.just4fun.biz/WSH/VBScript%E3%81%A7MySQL%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B.html

 VBやwshでやってることは、秀丸マクロでも、createobject /
callmethod_returnstr等の文を使えば出来そうな気がします。

 実際にやるとなると、MySQLその他の知識と、さらには秀丸マクロの知識が無
いと難しくて、僕自身はMySQLの方のことがよく分からないので無理そうな気が
します。

 誰かこの辺に詳しい人で、簡単な例を作ってくれたりする人いないでしょうか。

[ ]
RE:44539 メールのデータベース化No.44540
KRT さん 13/06/05 15:26
 
早速、有り難う御座います。

参考情報を拝見しました。
uwscという自動化ツールを、多少使った事はありますが、
COMオブジェクト/マクロ/VBは、よく解ってません。

PHP/MySQLもエキスパートではありませんが、
XAMPPのローカル環境で、PHPでコリコリ書けば、何とか出来そうな気がします。

動作する様になったら、ご連絡します。

[ ]
RE:44539 メールのデータベース化No.44541
Tetchiro さん 13/06/05 17:50
 
1ユーザー Tetchiroです。

 自分にも役立ちそうなので、MySQLを呼び出すマクロに挑戦してみました。
 詰めが甘いですが、皆さんにお力添えを願えればと投稿してみます。

 問題は、肝心のデータを引用するところが動きません。
 memberやgetpropstr、getpropnum、getpropobjの使い方が分かってません。
 データの数だけループが回っているので、フローそのものは問題ないと思いますが、
どなたか添削願います。


++ 条件 +++++++++++++++++++++++++++++++++++++++++++++++++++
 ODBCでMySQLに接続。
 システムDSNに「ODBC123」を用意。
 MySQLには、TABLE_1を用意。

++ マクロ本文 +++++++++++++++++++++++++++++++++++++++++++++
// オブジェクト作成とODBCデータベース接続
  #objADO = createobject("ADODB.Connection");
  callmethod #objADO, "Open", "DSN=ODBC123;";

// SQL文の実行 (サンプルはselect)
//   insertとupdateの場合は、callmethodでいけるか。
//   callmethod(#objADO, "Execute", "update TABLE_1 set ITEM_A  = 'ABC';");
  #rcdSet = callmethod_returnobj(#objADO, "Execute",
       "select ITEM_A from TABLE_1;");

// データの取得
  while( getpropnum(#rcdSet, "EOF") == 0 ) {
    // この部分にレコード単位の処理を入れる

    // ↓↓↓ これでは値が表示されない!
       message "ITEM_A = " + str(member(#rcdSet, "ITEM_A"));
    // ↑↑↑ これでは値が表示されない!

    callmethod #rcdSet, "MoveNext"; // 次のレコードに進む
  }

// オブジェクト解放
  releaseobject #objADO;
++++++++++++++++++++++++++++++++++++++++++++++++++++++

[ ]
RE:44541 メールのデータベース化No.44542
Tetchiro さん 13/06/05 18:00
 
ちなみに、VBSのサンプルも挙げときます。こっちは動きました。
このサンプルをベースに翻訳してみましたが、そう都合よくは無かったです。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dim objADO
Dim rcdSet
Set objADO = CreateObject("ADODB.Connection")
objADO.Open "DSN=ODBC123;"
Set rcdSet = objADO.Execute("select ITEM_A from TABLE_1;")
Do Until rcdSet.EOF
  WScript.Echo "ITEM_A=" & rcdSet("ITEM_A")
  rcdSet.MoveNext
Loop
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[ ]
RE:44541 メールのデータベース化No.44544
Tetchiro さん 13/06/06 11:45
 

自己レスです。

 member(member(#rcdSet,"","ITEM_A"),"")

とmemberの2段重ねで取り出せました。

[ ]
RE:44539 メールのデータベース化No.44545
Tetchiro さん 13/06/06 11:59
 
1ユーザー Tetchiroです。

 一通りのMySQLの操作ができましたので報告します。

 エラーがでたら止まる簡単な処理をいれてます。

 全角文字を使用する場合には、MySQLの文字コードにそろえる処理が必要です。
 従って、実際の運用を考えると、日本語だけでなく、中国語や韓国語などの多言語
メールも考慮しないといけないと思います。
 そのためにはMySQLはUTF-8などで多言語対応にし、マクロ内でS-JISや中国語コー
ドのメールから読み込んだ文字列は、適宜、UTF-8にエンコードする処理が必要にな
ります。

 とりあえず、下記マクロはMySQLなどをODBC経由で操作するためのサンプルとして
は役立つかなと思います。

++ 条件 +++++++++++++++++++++++++++++++++++++++++++++++++++
 ODBCでMySQLに接続できる(ODBC経由なら他のDBでもOK)
 システムDSNに「ODBC123」を用意しておく。
 MySQLやODBCの設定方法はネットに溢れているので省略します。
 SQLの文法はMySQLに合わせています。

++ マクロ本文 +++++++++++++++++++++++++++++++++++++++++++++
// オブジェクトの作成とODBCとの接続
#objADO = createobject("ADODB.Connection");
callmethod #objADO, "Open", "DSN=ODBC123;";
if( !getresultex(0) ) { message "Open Error!"; endmacro; }

// tableの削除
#rcdSet = callmethod_returnobj(#objADO, "Execute",
      "drop table if exists TABLE_1;");
if( #rcdSet == 0 ) { message "Drop Error!"; endmacro; }

// tableの作成
#rcdSet = callmethod_returnobj(#objADO, "Execute",
      "create  table if not exists TABLE_1 ("
    + "      ID          integer     primary key auto_increment"
    + "    , ITEM_A      varchar(20)"
    + "    , ITEM_B      varchar(20)"
    + "    , MODIFY_DATE timestamp"
    + ");"
);
if( #rcdSet == 0 ) { message "Create Error!"; endmacro; }

// insert処理
$a = "sampleA"; // エンコード処理すれば日本語もok
$b = "sampleB";
#rcdSet = callmethod_returnobj(#objADO, "Execute",
      "insert into TABLE_1 ("
    + "      ITEM_A"
    + "    , ITEM_B"
    + ") value ("
    + "      '" + $a + "'"
    + "    , '" + $b + "'"
    + ");
"); // 「'」は文字列を示す括り文字
if( #rcdSet == 0 ) { message "Insert Error!"; endmacro; }

// update処理
$a = "sampleA2";
$b = "sampleB2";
$c = "3";
#rcdSet = callmethod_returnobj(#objADO, "Execute",
      "update TABLE_1 set"
    + "      ITEM_A = '" + $a + "'"
    + "    , ITEM_B = '" + $b + "'"
    + " where"
    + "      ID     < " + $c
    + ";"
);
if( #rcdSet == 0 ) { message "Update Error!"; endmacro; }

// データのselectと表示
#rcdSet = callmethod_returnobj(#objADO, "Execute",
      "select ID, ITEM_A, ITEM_B from TABLE_1;");
if( #rcdSet == 0 ) { message "Select Error!"; endmacro; }
while( getpropnum(#rcdSet, "EOF") == 0 ) {
    message "ID    :"+member(member(#rcdSet,"","ID"),"")
       + "\nITEM_A:"+member(member(#rcdSet,"","ITEM_A"),"")
       + "\nITEM_B:"+member(member(#rcdSet,"","ITEM_B"),"");
    callmethod #rcdSet, "MoveNext"; // 次に進めるために必須
}

// オブジェクトの解放
releaseobject #objADO;

[ ]
RE:44545 メールのデータベース化No.44546
秀まるお2 さん 13/06/06 15:29
 
 僕の方でもMySQLをインストールしてテストしてました。

 で、なかなかうまくいかなかったんですが、Tetchiroさんのマクロのおかげで
うまくいったような気がします。

 (テーブルの作成とかがよく分からなくて…)

 で、Tetchiroさんのマクロを元にさらに発展させて、選択したメール(複数も
可)のMessage-Id, Subject, From, Dateをデータベースに登録するサンプルマ
クロを作ってみました。メール本文は改行コードが混じってるので、果たしてど
うやったらいいのかよく分かりませんでした。

 外国語メールでもうまく動作しました。



// オブジェクトの作成とODBCとの接続
#objADO = createobject("ADODB.Connection");
callmethod #objADO, "Open", "dsn=odbc123;";
if( !getresultex(0) ) { message "Open Error!"; endmacro; }

// tableの削除
#rcdSet = callmethod_returnobj(#objADO, "Execute",
      "drop table if exists TABLE_1;");
if( #rcdSet == 0 ) { message "Drop Error!"; endmacro; }

// tableの作成
#rcdSet = callmethod_returnobj(#objADO, "Execute",
      "create  table if not exists TABLE_1 ("
    + "      MessageId   varchar(300)"              // 300文字まで
    + "    , FromName    varchar(300)"
    + "    , FromEmail   varchar(300)"
    + "    , Subject     varchar(300)"
    + "    , Date        varchar(300)"
    + ");"
);
if( #rcdSet == 0 ) { message "Create Error!"; endmacro; }

// insert処理
    loaddll "tkinfo.dll";
    #n = dllfunc("SetJapaneseCodePageMode");
    #n = dllfunc("LockSelection");
    while(1) {
        #n = dllfunc("EnumSelection", 1);
        if( #n == 0 ) {
            break;
        }
        $messageid = dllfuncstr("CurrentHeader", "Message-id");
        $from = dllfuncstr("CurrentHeader", "From");
        $fromname = dllfuncstr("SetNameOnly", $from);
        $fromemail = dllfuncstr("SetEmailOnly", $from);
        $subject = dllfuncstr("CurrentHeader", "Subject");
        $date = dllfuncstr("FormatDate"
               , dllfuncstr("CurrentHeader", "Date"), "YYYY/MM/DD");

        call SqlEscape $messageid; $messageid = $$return;
        call SqlEscape $fromname; $fromname = $$return;
        call SqlEscape $fromemail; $fromemail = $$return;
        call SqlEscape $subject; $subject = $$return;
        call SqlEscape $date; $date = $$return;

        $command =
           "insert into TABLE_1 ("
            + "      MessageId"
            + "    , FromName"
            + "    , FromEmail"
            + "    , Subject"
            + "    , Date"
            + ") value ("
            + "      '" + $messageid + "'"
            + "    , '" + $fromname + "'"
            + "    , '" + $fromemail + "'"
            + "    , '" + $subject + "'"
            + "    , '" + $date + "'"
            + ");";

        #rcdSet = callmethod_returnobj(#objADO, "Execute",
          $command );
        if( #rcdSet == 0 ) {
            message "Insert Error!";
            message $command;
            endmacro;
        }

    }
    #n = dllfunc("UnlockSelection");

    releaseobject #objADO;
endmacro;

SqlEscape:
    // ' --> \'
    // \ --> \\
    // ユニコードで処理する
    ##len = wcslen($$1);
    if( ##len > 300 ) {
        ##len = 300;                //300文字までってことにする。
    }
    ##i = 0;
    $$ret = "";
    while( ##i < ##len ) {
        $$one = wcsmidstr($$1, ##i, 1);
        if( $$one == "'"
         || $$one == "\\"
          ) {
            $$one = "\\" + $$one;
        }
        $$ret = $$ret + $$one;
        ##i = ##i + 1;
    }
    return $$ret;

[ ]
RE:44546 メールのデータベース化No.44547
Tetchiro さん 13/06/06 16:15
 

さすがです。(^o^)
エスケープ処理とか自分ではできなかったことがきっちりと入れてあります。


テーブル削除の部分は参考例として入れているので、念のため、コメントアウトをし
ておいてください。
// // tableの削除
// #rcdSet = callmethod_returnobj(#objADO, "Execute",
//     "drop table if exists TABLE_1;");
// if( #rcdSet == 0 ) { message "Drop Error!"; endmacro; }

でないと、せっかく入れてあるテーブルが消えてしまったと文句言われそうで (^^;

テーブルの作成の方には「if not exist」を入れて、重複作成しようとして発生する
エラーが出ないようにしていますが、これはMySQL独自で、Oracleにはない文法です。
この範囲もコメントアウトしておいた方が無難かなと思います。

もっとも、MySQLを知っている方には余計なアドバイスかもしれませんが。

[ ]
RE:44547 メールのデータベース化No.44549
秀まるお2 さん 13/06/06 18:06
 
 エスケープ処理と多国語対応は僕の得意技ですが、SQLサーバーのことやCOM呼
び出し関係はほぼ素人でして、Tetchiroさんがマクロを作ってくれなかったらま
ったく何も出来ませんでした。

 ODBC関係の設定(コントロールパネル・管理ツール・データソース)もググり
まくってなんとか出来た所でした。

 本当だったら、例えば同じメールが重複して登録されないように、Message-Id
が同じものが既に登録されてたらスキップするとか、そういう処理が必要になる
ような気がします。その辺はやり方がよく分かりません。あとメール本文みたい
に改行コードが入ったデータの登録方法も分からないし、添付ファイルみたいに
可変個数の物とかもどう登録したらいいか分からずです。

 とりあえず、秀丸メールでデータベースがコントロール出来るのが分かったの
は、大変ありがたい情報です。

[ ]
RE:44549 メールのデータベース化No.44551
Tetchiro さん 13/06/07 12:03
 
こちらこそ、助かります。

 データベースとのI/Fは、現在、イントラWEBを使っています。
 これは社内だけなら問題ないのですが、社外もとなると全く使えなくて、だからと
いって管理負担だけが増す公開WEBにするわけにもいかず悩んでました。

 メールだと社内外の垣根が無いので何とか使えないかと考えていましたが、どうし
ても最後は人がWEBをたたかないとダメだという状況に変わりがありませんでした。
 しかし、秀丸がデータベースとここまで親和性が高いことが分かって、自動化のめ
どが立ち、今後の業務の効率化に期待が高まっています。

 今まで秀丸メールを、業務連絡のメールを案件別に振り分けるためだけに使用して
いましたが、近いうちに、社外から来た問い合わせに対して、
  ・依頼の受付
  ・回答作成(データ検索/添付データの収集)
  ・回答送信/完了
という部分まで自動で任せられそうな雰囲気が出てきました。

 なお、この仕組みを用意するのは自分ですが、自分自身が使う立場でもあるからで
す。
 自分が楽になるためだからこそ、熱心にサンプルを作りました。

[ ]