Pepperで外部との連携をするのに、いろいろな手段がありますが、一番簡単な手段としてメール連携があります。
例えばMeshと連携させたい場合とか。
Meshは秀逸なガジェットですが、外部との口がGmailしかありません。
SDKも出ているのでいろいろできるようなんですが、まずは最短の工数でプロトタイプすることを考え、Mesh-Gmail-Pepperという形を考えてみましょう。
そうするとあなたは気づくでしょう。「あれ?PepperのFetch E Mailボックスって動かなくね?」と。
そう。なんか色々とトラップがあるみたいなんですね。
しかも、中身を読んでみても、結構独特でどう直せばいいのかよくわからない。。
というわけで、今回の内容は、ボックスの中身、python codeを全然見ずに、完全な対症療法でメールによる条件分岐を実現する方法を紹介します。
技術のある方、ぜひ、いい感じで動くボックスを作ってくれると嬉しいです。
環境:choregraphe 2.4.3.28
#Fetch E Mailボックスの使い方
PepperからのGmailアカウントへのアクセスはセキュアでない方法で行われるため、
必ず新規のGmailアカウントを作ってください。
オプションの設定項目はこんな感じです。
E-mail address : xxxx@gmail.com(以下の設定にも関係するのでgmailアカウントを取得してください)
POP address : pop.gmail.com
Portnumber : デフォルトの995
Enable SSL : デフォルトのとおり、チェック済みに
Last mail only : デフォルトのとおりチェック済みに
Last mail onlyにチェックを入れていれば、最新の「Pepperで取得していないメール」の内容がリスト形式でonEmail端子から出力されます
#Send E Mailボックスの使い方
Fetch E Mailボックスと同じく、セキュアでない方法でアカウントにアクセスするので必ず新規のGmailアカウントを作ります。
From : xxxx@gmail.com(まずはテスト用にFetch E Mailボックスに使用したアドレスを記入してください。
Password :
To : 宛先を書いてください。
Subject : メール表題を記入してください。
Contents : メール本文を記入してください。
Attachment : パスを書けば、内部の画像などを送信できるようです。
SMTP address : smtp.gmail.com
Port number : 587(デフォルト)
後述しますが、今回の方法では、Fetch E Mailボックスを使うときにはかならずSend E Mailボックスを使うので、
FromとToはFetch E Mailボックスに記入したものを入力してください。
とりあえず発生する問題点とそれに対応する方法を書いていきます。
#発生する問題
①Pepperからログインできない
Authentication error, server answered : [534]~~~~Please log in via your web browser and then try again. Learn more at https://support.google.com/mail/answer/78754 d1sm55002865pfb.76 - gsmtp
というようなエラーが出ます。
これは、セキュリティ設定を「セキュリティが低い危機からの接続」を許可していないために発生しています。
https://www.google.com/settings/security/lesssecureapps?rfn=27&rfnc=1&et=0&asae=2
のリンクからセキュリティ設定を変更してください。
複数のアカウントをchromeに紐づけしてる人は、意図しないアカウントのセキュリティが
変更されてしまう可能性もあるので気を付けてください。
「安全性の低いアプリへのアクセスが有効になりました」というメールが来た後、しばらくしても、
うまくログインできない状態が続く場合もあるので、少し時間をおいてもよいかもしれません。
②昔に受信したメールが読みだされる
もし、「捨てアドでいいだろう」と思って今回の設定をされた方は、未読メールが多いとうまく動かない場合があるようです。
かなり昔の未読メールが読みだされてしまう場合もあるようなので、あたらしくアカウントを作ったほうが早いですね。
③未読メールがないと動かなくなる
-ERR Message number out of range.
というメッセージがFetch E MailボックスのonError端子から出てしまうと、そのボックスからのメールの取得はできなくなります。
対策としては
この図のような形で、かならずFetch E Mailボックスを作動させた後にはSend E Mailボックスを動かすようにすること。
メールボックスに大量のごみメールがたまりますが、我慢しましょう。
#外部(Mesh)からの制御を反映させてみる。
メールによってSwitch Caseをしたい場合は
「Fetch E Mailからエラーを出さないようにするために送付したメール」
と
「Meshから送付したメール」のSubjectや本文を変えることによって、条件分岐ができます。
Fetch E Mailボックスの出力はリスト形式で結構ややこしいのですが、上のフローでprocessと書いてあるボックスの
onStart端子をdynamicに、onStopped出力をstringに変更し、中のスクリプトを
def onInput_onStart(self, p):
#self.onStopped() #activate the output of the box
self.string1=p[0][1]
self.onStopped(self.string1)
pass
と書けばsubjectを
def onInput_onStart(self, p):
#self.onStopped() #activate the output of the box
self.string1=p[0][2][0]
self.onStopped(self.string1)
pass
と書けば本文を抽出できるようになります。
この出力をSwitch Caseにつなげば、一番簡単な外部連携の出来上がりです。
是非試してみてください。