Eメールの処理
Email-Processing
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をアンロード
|