Eメールの処理
Origin8.5以降、LabTalkスクリプトを使用して電子メールを処理するためのmailオブジェクトを提供します。次のスクリプトサンプルでは、定期的にメールサーバーから新しいメールを取得し、メールの添付ファイルからデータを分析する方法を示しています。
ほかにも、次のLabTalk機能をご案内しています。
- 関数を使用し、参照によって引数を渡して、関数から複数の値を取得します。ProcessEmail関数を参照してください。
- LabTalkタイマー
- 分析テンプレートを使用して複雑な処理をカプセル化し、スクリプトを簡素化
- ASCIIインポート、文字列処理、グラフエクスポート
スクリプトファイル
以下をユーザファイルフォルダにemailserver.ogs という名前のファイルとして保存して使用できます。
[Main] //////////////////////////////////////////////////////////////////////// // 関数を定義 //////////////////////////////////////////////////////////////////////// @global=1; // このセクションで定義されたすべての関数が確実にグローバルになるようにする Function Init_Server(string strPOPServer, string strName, string strPassword, string strSMTPServer) { // omail dllをセットアップ // ********** SSL はサポートされていないため、GMAIL などのサーバーは使用できません********** dll -a mail omail; //'''mail''' オブジェクトのメールを作成します。 mail.POP.Server$ = strPOPServer$; // 受信メールサーバー mail.POP.UserName$ = strName$; // メールサーバーのユーザー名/アカウント mail.POP.Password$ = strPassword$; // メールサーバーのパスワード mail.POP.Path$ = "C:\OriginMails"; // 電子メールをローカルコンピュータに保存するためのパス mail.POP.Port = 110; // 受信サーバーポート mail.POP.Timeout = 20; //受信サーバーのタイムアウト mail.SMTP.Server$ = strSMTPServer$; // 送信メールサーバー mail.SMTP.From$ = strName$; // 送信者のメールアドレス mail.SMTP.Timeout= 10; // 秒単位の接続タイムアウト } //次の関数は、電子メールの添付ファイルからのデータを分析 //分析テンプレートを使用して線形フィットを実行 //読み取られて処理されているものを含む、サーバー上のメールの数を返す // 1通のメールが正常に処理された場合、サーバーにメールがないか件名が適切でない場合は0、エラーが発生した場合は<0 //サーバー上の電子メールの数を示すために、各呼び出しの後にステータスバーが更新 //Function int ProcessEmail(ref int nSuccess, string strSubject$ = "Origin LRFit Test" ) Function int ProcessEmail(ref int nSuccess, string strSubject) { nSuccess = 0; mail.POP.LeaveMessage = 0; // サーバーに電子メールを残さない。テスト中0に変更できる int nMailsLeft = mail.POP.Retrieve(); if( nMailsLeft < 0 ) { return -1; } if(nMailsLeft == 0) return 0; string strTrim = mail.POP.Subject$; strTrim.TrimLeft(); //左側のSPACEをトリム //if( mail.POP.Subject$ != strSubject$ ) if( strTrim$ != strSubject$ ) return nMailsLeft; // Origin の分析テンプレートを読み込む string fname$ = SYSTEM.PATH.PROGRAM$ + "Samples\Curve Fitting\Linear Regression.OGW"; doc -a %(fname$); //ogw テンプレートをアクティブなウィンドウとして読み込む // メール本文からテキストを読み込んで、ページのロングネームとして使用 page.LongName$ = mail.POP.Text1$; //プレーンテキストのメール用 page.title = 1; // 添付のデータファイルを分析テンプレートのデータシートにインポート page.active$ = Data; //添付のASCII ファイルをインポートし、ブックの名前をファイルの名前に変更 //impasc fname:=mail.POP.Attachment1$ Options.Names.FNameToBk:=0; impasc fname:=mail.POP.Attachment1$; //自動更新が完了するまで待つ run -p au; // Originのカスタムレポートシートをアクティブワークにする page.active$ = "Fit Summary"; // 添付ファイルの処理が完了したので、削除できる mail.POP.DeleteAttachments(1); nSuccess = 1; return nMailsLeft; } //電子メールの件名が文字列と一致する場合は、電子メールに返信 //電子メールには、フィットの情報とフィット曲線を添付 Function int Reply_Email() { string strTo = mail.POP.Sender$; //strTo.TrimLeft(); //トリミングしない mail.SMTP.To$ = strTo$; mail.SMTP.Subject$ = "Re:" + mail.POP.Subject$; mail.SMTP.Text$ #= empty$; mail.SMTP.Text1$ = "LR Fitted Results in Origin:"; mail.SMTP.Text2$ = "--------------------"; //データのワークシートから行数を取得 page.active = 2; mail.SMTP.Text3$ = "Number of Points = $(wks.col1.nrows)"; mail.SMTP.Text4$ = ""; //線形フィットレポートからフィット結果を取得 page.active$="FitLinear1"; getresults tr:=tree; mail.SMTP.Text5$ = "Intercept of Fitted Line:"; mail.SMTP.Text6$ = "Value = $(tree.Parameters.Intercept.Value,*), Standard Error = $(tree.Parameters.Intercept.Error,*)"; mail.SMTP.Text7$ = ""; mail.SMTP.Text8$ = "Slope of Fitted Line:"; mail.SMTP.Text9$ = "Value = $(tree.Parameters.Slope.Value,*), Standard Error = $(tree.Parameters.Slope.Error,*)"; mail.SMTP.Text10$ = ""; mail.SMTP.Text11$ = "R Value of Linear Fit: $(sqrt(tree.RegStats.C1.RsqCOD), *)"; mail.SMTP.Text12$ = "----------------------"; //フィット曲線をエクスポート expGraph type:=jpg path:=mail.POP.Path$ export:=specified pages:="FitLine" filename:=page.longname$; mail.SMTP.Attachment$ #= empty$; // ベクトルを空にする //フィット曲線画像を添付 mail.SMTP.Attachment1$ = mail.POP.Path$ + "\" + page.longname$+".jpg"; page.active$="Fit Summary"; if ( mail.SMTP.Send( ) ) return 0; //メールの送信失敗 else return 1; //メール送信成功 } // これはタイマーproc中に呼び出す関数で、エラー時にタイマーを強制終了する Function doTimerProc() { int nOK; //int nn = ProcessEmail(nOK); //件名の文字列には、先頭にスペースが付く int nn = ProcessEmail(nOK, "Origin LRFit Test"); if(nn < 0) { ty -A "Mail Error return $(nn).Please resolve."; timer -k; } // ステータスバー更新 else if(nn==0) type -q "$(@D,D10):No mail on server"; else { if(nOK == 1) { type -q "$(@D,D10):Successfully process one mail, $(nn-1) emails left"; int nSend = Reply_Email(); if( nSend == 0 ) ty -A "Replying the email(%(mail.SMTP.To$)) failed."; } else type -q "$(@D,D10):Ignore one mail due to wrong subject, $(nn-1) emails left"; } } //////////////////////////////////////////////////////////////////////// // 処理開始 //////////////////////////////////////////////////////////////////////// def timerproc { doTimerProc(); } // 自身のPOPサーバーとSMTPサーバーに置き換え。デモ用にのみorigin@originlab.com を提供。 Init_Server("igor.originlab.com", "origin", "labtalk", "igor.originlab.com"); //Init_Server("igor", "origin", "labtalk", "igor");for inside Olab timer 20; // 20秒ごとにチェック(20秒) timerproc;// すぐに実行して、エラーが発生した場合にタイマーを待機しないようにし、すぐに強制終了できるようにします
サンプルを実行する
このサンプルを実行する前に、「Origin LRFit Test」という件名の電子メールをアカウントに送信し、TABで区切られた2列の数値を含むASCIIファイルデータを添付してください。また、受信メールのパス用に「C:\OriginMails」フォルダの作成が必要です。
この例では、サーバーに電子メールを残しません。
コードを ogs ファイルに保存した場合は、次のようにして実行します。
run.section(%Yemailserver, main);
タイマーを停止する
タイマーを停止し、これ以上timerprocマクロが実行されないようにするには、次のスクリプトを実行します。
timer -k; //タイマーを停止
次のようにメールオブジェクト定義を解除できます。同じOriginセッションでLabTalkのmailコマンドを別の目的で使用する必要がない限り、これが必要であることに注意してください。
dll -r mail; //omail オブジェクトを削除してdllをアンロード