この記事で扱っていること
- メーリングリストの作成と一斉送信を行う方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWには、SMTPを利用してメールを送信するプログラムを書く用の関数が用意されています。
送信先を複数設定したり、添付ファイルを付けることもできたり、メール送信で必要そうな基本的なことは大体できると思います。
本記事では、メール送信相手を複数登録するための、メーリングリストの作成機能も含めた一斉送信のプログラムを紹介しています。
なお、本記事で紹介しているメールはgmailを使用しています。この場合、gmail側で設定やパスワードの取得が必要になります。Googleアカウントのパスワードではないものになるので「何のパスワードを使うの?」という方は以下の記事を参考にしてみてください。
どんな結果になるか
フロントパネルにはメーリングリストの管理画面と、メールの件名や添付物、本文を書く部分があります。
プログラム実行後、メーリングリストの情報が入ったファイルのパスを選んで開くか、あるいは新規で作成します。
ここでは新規でメーリングリストを新規で作成するとします。すると、メーリングリスト作成用の画面が別で開きます。
専用の画面では、既にメーリングリストが登録されたファイルがあってそこに追加したいのであればそのファイルを選べますし、なければないで「メールアドレス」と「名前」、そして「所属」を入力して登録すればメーリングリストに登録できるようにしています。
なお、この「所属」とは今回紹介するサンプルとしては会社名を表しています。
○○株式会社
××様
という内容の「○○株式会社」にあたる部分です。
編集を終えてメインのプログラムに戻った後、件名や本文を入力して送信することができます。
プログラムの構造
メインのVIもそしてメーリングリストを作成するサブVIも、どちらもイベント駆動型のステートマシンとしています。
サブVIが実行されている間にはメインVIは止まっている状態としており、かつ二つのVIのプログラムは独立(サブVIの結果の一部をメインVIで使用する部分はありますが)しているので、それぞれでイベントストラクチャを持っていてもイベントの競合は発生しません。
まずはそのサブVIについて紹介します。
フロントパネルではメーリングリストに登録した情報や登録時の入力欄、既にファイルとしてメーリングリストを持っている場合にはそれを読み込む欄、そして用意し終えたメーリングリストを保存するファイルの指定を行うファイルパス制御器などがあります。
画面外にはメーリングリスト保存先パスの表示器や、完了を押してこのVIが終了したかどうかを判定する完了フラグ、そしてエラーの入出力があり、メインVIに情報を渡しています。
メーリングリストの作成は、大元は以下の別記事で紹介したプログラムの構造を持っています。
今回のサブVIのブロックダイアグラムは別記事で紹介したのとほぼ同じです。
それぞれのステートを簡単に見ていきます。
まずはinitializeステートです。
表示の状態を初期化したり、複数のステートで使用する「個人情報」のクラスタの配列の初期化を行っています。
また、完了フラグの初期化も行っています。
wait for eventステートでは、イベント駆動型ステートマシンとして各種ステートに飛ぶためのイベントストラクチャを用意しています。
それぞれの中身はこんな感じです。
次はread fileステートです。
別に効率を重視するわけではないので、「区切られたスプレッドシートを読み取る」関数を使用してファイルの中身を読み込みます。
ファイル(csv)には決まった形式でデータを保存しているので、その形式から順にデータを取り出せるように指標配列の関数を使用してデータを抜き出し、名前でバンドルしてこれをForループで回すことで、csvの各行ごとのデータをクラスタ配列にしシフトレジスタで回しています。
このステートのあとは、フロントパネル上の表示を更新するためのupdateステートに移ります。
次にdelete itemステートです。個人情報配列から、リストボックスで指定した行の情報を削除します。
このステートの後もupdateステートに移ります。
add itemステートでは、個人情報配列の要素を追加しています。
これまた、次にはupdateステートに移ります。
様々なステートから移ってくるupdateステートでは、個人情報配列の中身をバンドル解除し、それぞれの項目の配列に分解してこれを複数列リストボックスに表示するように整形しています。
このステートの後にはwait for eventに進み、次のイベントを待ちます。
メーリングリスト作成完了ボタンが押されるとfinishステートに移り、ここでファイルにデータを保存します。
メーリングリスト保存先のパスが指定されていないことは前提としていないため以下の図のような作りにしていますが、もし指定されていない(あるいはパスとして間違っている)状態で関数からエラーが出たらこのサブVIを終了しない、といった書き方もできます。
cancelステートではただ単にこのサブVIを終了しますが、完了フラグがTrueになりません。
これで、メーリングリスト作成のためのサブVIは完成です。
なお、メインVIの方でこのサブVIのフロントパネルを呼び出す必要があるので、サブVIのVIプロパティの設定で、フロントパネルを表示させるようにしておくのを忘れないようにします。
メーリングリストの用意ができたら、メインのVIでも基本的に同じようにcsvファイルを読み取ってそのデータをクラスタ配列として持っておき、ステートマシンの各ステートで使用するということになります。
基本的なつくりはサブVIと似ています。
initializeステートでは、各表示の内容を初期化しています。
wait for eventステートにて、各イベントを検出します。
イベントケースの中身は以下のようです。
create new listステートにて、先ほど用意したサブVIを使用しています。サブVIのVIプロパティを設定していないとサブVIのフロントパネルが開かないので注意します。
サブVIの完了フラグの情報をブールで受け取り、フラグがTRUEならサブVIで用意したメーリングリストファイルをメーリングリスト情報ファイルパスの表示器に渡して次にopen listのステートに進みますが、サブVIをキャンセルで終了した場合にはwait for eventステートに戻ります。
open listステートでは、指定したメーリングリストファイルを開いて中身を取り出し、個人情報配列に入れていきます。
流れはサブVIと全く同じで、次にupdateステートに進みます。
updateステートもサブVIと全く同じことをしています。
sendmessageステートではSMTPの関数を用いてメール送信を行っています。
実は、「受信者を設定」関数は、メールアドレスの配列を受け付けるため、本来Forループは必要ありません。
が、ここでは敢えてForループを付けています。
Forループを付けている理由は、メールの冒頭、「○○株式会社 ××様」の部分の入力を自動にさせるためです。
メーリングリストに名前と所属の情報も加えていたのはこのためで、これらと「文字列にフォーマット」関数を使用することで、各メールの冒頭の文章も自動的に作成させることができます。
イメージとしては以下の内容を見てみてください。
あとはfinishステートがあって終わりです。単にWhileループを終了させているだけですね。
ステートマシンの特性を活かす
上で紹介したプログラムでは、あくまでLabVIEWのSMTP関数を使用したメール送信を実装していました。
いやいや、SMTP関数ではなく例えばPythonでメール送信を行うスクリプトを持っているよという場合でも、やはりメール送信のためのステートのみを変更するだけで済みます。
ステートマシンで組むことで、プログラムの大枠はそのままにしつつ必要な機能をステートに落とし込んだ部分のみ修正するだけで別の機能を持たせることができるのが便利ですね。
プログラムによるメーリングリストの作成までは必要ない場合
LabVIEWプログラムでわざわざメーリングリストの作成までしなくても、リストはLabVIEW外で用意しますよ、というのももちろんOKです。
まぁリスト形式とするのでcsvが便利だとは思いますが、別のファイル形式(カンマで区切られていないものなど)の読み込みの場合には、デリミタを正しく設定するようにし、かつ、データの並びにも気を付ける必要があります。
本記事で紹介したVIで読み込ませるためには、メーリングリストファイルの中身はカンマ区切りでかつそれぞれの列にメールアドレス、名前、会社(所属)がこの順番で入っている必要があります。
本記事ではメーリングリストの作成およびメールの一括送信までを行うためのプログラム例を紹介しました。
イベント駆動型のステートマシンの例としても参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント