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をアンロード