fc2ブログ

10 « 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.» 12

不労所得で生活できるのか?

主にMT4関連のツールやEAを作ってます。 夢の自動集金マシン(?)は存在するのか・・・。

【RcvPop3Mail】EAからPOP3メールを受信するDLL! 

メール配信系のFXシグナルをEAで受信しMT4で自動化しようと言う魂胆です(*´ω`)

POPメール受信処理自体は「ぽちっとVT」でもお世話になっている、

Bsmtp.dllを使わせて頂いていますm(__)m

ただ、EAから直接コールするのは面倒で困難なので軽くラップしてみました。

また、漢字コードの変換には【GetHtmlSrc】でも使用させて頂いているnkfwinを使用しています。

受信動作を行うとMT4フォルダ下にメールボックス用フォルダを作成し、

1メール1ファイルとして保存されます。

保存されたメールは、メール番号・行番号を指定してEAから1行ずつ読み出すことができます。

複数のEAからの使用はメールアカウント、メールボックスフォルダ名を変えることで対応できます。

※このdllで使用するメールアカウント宛のメールは、受信後にメールサーバーから全て削除されるので
 普段使用しているメールアカウントで受信を行わないでください(新たにyahooメール等を取得してください)。
 またIMAP4(Gmail等)には対応していません。

【ファイル構成】
RcvPop3Mail100.zip
  │ nkfwin.zip・・・ネットワーク用漢字コード変換フィルタのアーカイブ
  │ お読みください.txt・・・使用法説明テキストファイル
  └─MetaTrader4
     │ nkf32.dll・・・nkfwin.zip内の(NT,2000,XP,Vista,7)用dllを抜き出した物
     │ Bsmtp.dll・・・POP3プロトコルでメールを受信するdll
     └─experts
        │ sample.mq4・・・使い方のサンプルEA
        ├─include
        │ RcvPop3Mail.mqh・・・RcvPop3Mail.dll使用時のインクルードファイル
        └─libraries
          RcvPop3Mail.dll・・・dll本体

【EAコーディング及び実行時のファイル配置】
・nkf32.dll、Bsmtp.dll
 MT4フォルダ(Terminal.exeと同じフォルダ)またはWindowsのSystem32フォルダへ配置してください。
 MT4フォルダ\experts\librariesフォルダでありません。

・RcvPop3Mail.mqh
 MT4フォルダ\experts\includeへ配置してください。

・RcvPop3Mail.dll
 MT4フォルダ\experts\librariesへ配置してください。

【関数一覧】
int ReceiveMail(string Pop3Host, string MailUserID, string MailPassword, string SubFolder, string ErrMess);
 メールサーバーからメールを受信しサーバーメールを削除する関数です。
 引数はPOP3ホスト、ユーザID、パスワード、メールを保存するサブフォルダ名、エラーメッセージ用バッファです。
 受信したメールはMT4フォルダ\(SubFolder)に1メール1ファイルとして保存されます。
 返値は受信したメール数です。
 エラーの場合は-1が返り、ErrMessにエラーメッセージが返ります。
 ErrMess文字列バッファはあらかじめ静的に宣言し256バイト以上の文字列で初期化しておいてください。
 メールファイルの形式は1行目が簡易ヘッダ(Subject:、From:、Date:)で
 2行目からが詳細ヘッダ、メール本文と続きます。
 本文の開始位置は行頭がBody:で始まっています。

int GetMailCount(string SubFolder, string ErrMess);
 受信済みのメール数を取得する関数です(サーバー上のメールは含みません)。
 引数はメールが保存されているサブフォルダ名、エラーメッセージ用バッファです。
 返値は受信済みのメール数です。
 エラーの場合は-1が返り、ErrMessにエラーメッセージが返ります。

bool ReadMailRow(int Index, int RowNo, string Row, int RowSize, string SubFolder, string ErrMess);
 ローカルディスクに保存されている受信済みメールを行単位で読む関数です。
 引数Indexはどのメールを読むかの指定で0が最新メール、1,2,3と数が多きいほど
 古いメールとなります。
 引数RowNoは読み出す行番号で0なら簡易ヘッダ、1以上なら本文の1行目からとなります。
 負の行番号を指定すると詳細ヘッダの1行目から本文の文末まで読むことができます。
 -1は詳細ヘッダの1行目、-2は2行目という感じです。
 引数Rowは読み込む行バッファです。
 あらかじめ静的に宣言し十分長い文字列で初期化しておいてください。
 引数RowSizeにはバッファRowの最大長をバイト単位で指定します。
 引数SubFolderにはメールが保存されているサブフォルダ名を指定します。
 エラーの場合はfalseが返り、ErrMessにエラーメッセージが返ります。
 本文の行数を超えるRowNoを指定した場合、falseが返り、ErrMessに"eof"が返ります。

int Purge(int Days, string SubFolder, string ErrMess);
 古いメールファイルを削除する関数です。
 引数Daysに保存日数を指定します。システム日付からこの日数を減算し、
 ファイルの作成日時がこれより小さい場合に削除します。
 引数SubFolderにはメールが保存されているサブフォルダ名を指定します。
 返値は削除したメール数です。
 エラーの場合は-1が返り、ErrMessにエラーメッセージが返ります。

int ToNarrow(string In, string Out, int OutSize);
 引数In文字列の全角英数字を半角英数字に置換した文字列をOut文字列に返す関数です。
 引数OutSizeにはバッファOutの最大長をバイト単位で指定します。
 返値は置換後のバイト数です。

【使用法】

#define MY_MAIL_BOX "MyMailBox"

//エラーメッセージバッファ・・・256バイトで初期化する
static string ErrMess = "xxxxxxxxxxxxxxx... "; //実際には256文字埋める

//行読み取りバッファ・・・できるだけ長い文字列で初期化する
static string ReadBuff = "****************... "; //実際には256文字埋める
#define READ_BUFF_SIZE 256

//受信
int count = ReceiveMail("pop.mail.yahoo.co.jp",
"hoge", "hogepass", MY_MAIL_BOX, ErrMess);
if(count >= 0){
Print(count, "通のメールを受信しました。");
}else{
Print(ErrMess);
return(0);
}

//今回受信したメールについて、簡易ヘッダ、本文を最後に受信した物から列挙する
for(int j = 0; j < count; j++){
//簡易ヘッダ
if(ReadMailRow(j, 0, ReadBuff, READ_BUFF_SIZE, MY_MAIL_BOX, ErrMess))
Print("Mail", j, " Header:", ReadBuff);
else
Print(ErrMess);

//本文
for(int k = 1; k <= 5 /* テストなので本文先頭の5行だけ */; k++){
if(ReadMailRow(j, k, ReadBuff, READ_BUFF_SIZE, MY_MAIL_BOX, ErrMess)){
Print(ReadBuff);
}else{
if(ErrMess != "eof")
Print(ErrMess);
break;
}
}
}


より詳細で具体的な使用法についてはsample.mq4をご覧ください。
日本語でコメントを記述しているのでMeta Editorのフォントを
MSゴシック等の日本語にしてご覧ください。

【その他】
nkfwin.zipの問合せ、取扱いについてはnkfwin.zip内のドキュメントを参照してください。

有料メルマガ「外国為替で稼ぐ高勝率のFX投資情報」の自動売買EAを現在テスト中です★

※制作したEAはアフィリエイトご購入特典として配布予定です☆

「RcvPop3Mail1.00」のダウンロードは→こちら←をクリック。

いつも応援ありがとうございます。m(__)m
2012/11/26 Mon. 12:55 | trackback: -- | comment: -- | edit