[Pepper] Pepperアプリケーション開発 ~メールを送ってみよう!~

前回は、ソケット通信を用いて、双方向での通信を行うアプリケーションを作成しました。
今回は、話した内容をPepperにメールを送ってもらうアプリケーションを作成してみましょう。

Pepperに向かって話した内容をそのままメールで送ってもらいたいと思います。
では、早速アプリケーションを作成してみましょう。

<Pepperにメールを送ってもらうアプリケーション>
【事前準備】
 ・メールアカウントを用意しておくこと

【手順1】
 SDKを起動します。
 

【手順2】
 下記のボックスを中央の作業スペースに配置しておきます。
 ・Set Language(Audio->Voice内)
 ・Speech Reco(Audio->Voice内)
 ・Say(Audio->Voice内)

【手順3】
 メールを送信するためのボックスを中央の作業スペースに配置します。

 ・Send E-mail(Communication内)
  メールの送信を行います

【手順4】
 パラメータボタンをクリックして、下記のメール設定を行い「OK」ボタンをクリックします。

 ・From
  自分のメールアドレスを入力します

 ・Password
  パスワードを入力します

 ・To
  相手のメールアドレスを入力します

 ・Subject
  タイトルを入力します。

 ・SMTP address
  SMTPサーバー名を入力します

 ・Port number
  ポート番号を入力します

【手順5】
 話した内容をメールで送りたいため、「Send E-mail」の入力イベントを編集します。

【手順6】
 下記の設定値を編集し、「OK」ボタンをクリックします。

 ・Type
  「文字列」に変更

 ・Nature
  「onStart」に変更


 
【手順7】
 話した内容を「Send E-mail」ボックスで受け取る必要があるため、プログラムを修正します。
 「Send E-mail」ボックスをダブルクリックし、下記のように修正します。

  #メッセージを取得するために引数を追加する
  def onInput_onSend(self, p):
  #def onInput_onSend(self):
    sEmailUser = self.getParameter("From")
    aTo = self.getParameter("To").split(";")
    sSubject = self.getParameter("Subject")
    #取得したメッセージを内容に追加する
    sText = str(p)
    #sText = self.getParameter(“Contents”)
    sAttachedFilePath = self.getParameter("Attachment")
    sPwd = self.getParameter("Password")
    sSmtp = self.getParameter("SMTP address")
    sPort = int( self.getParameter("Port number") )
    try:
        sPort = int( sPort )
        bValidPort = ( sPort >= 0 and sPort <= 65535 )
    except:
        bValidPort = False
    if( not bValidPort ):
        raise Exception( str(sPort) + " is not a valid port number to use to send e-mail. 
        It must be an integer between 0 and 65535. Please check that the port parameter of the box is correct." )
    for address in aTo:
      try:
        mail(
          sEmailUser,
          address,
          sSubject,
          sText,
          sAttachedFilePath,
          sPwd,
          sSmtp,
          sPort)
      except smtplib.SMTPAuthenticationError as e:
        raise(Exception("Authentication error, server answered : [%s] %s" % (e.smtp_code, e.smtp_error)))


    self.onSent() # activate output of the box

【手順8】
 下記のボックスを中央の作業スペースに配置して、ボックス同士を接続します。
 ・Speech Reco(Audio->Voice内)

【手順9】
 これで、アプリケーションが完成しました。
 それでは、「再生」ボタンをクリックして、実際に動かしてみましょう。

【手順10】
 ダイアログコンソールにて任意のメッセージを入力し、Enterキーを押します。

【手順11】
 Pepperから「メールをおくったよ!!!」とメッセージが表示されるのを確認します。

【手順12】
 実際にメーラを立ち上げてメールが受信されていることを確認します。

お疲れ様でした。
以上で、「メールを送ってみよう!」は終了となります。

今回は、話した内容をメールで送信するアプリケーションを作成しましたが、
Pepperで撮った写真をメールに添付して送信することもできます。

最後までご覧いただき有難うございました。
次回も引き続きPepperアプリケーション開発に触れていく予定です。


弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。


12 comments for “[Pepper] Pepperアプリケーション開発 ~メールを送ってみよう!~

  1. ぬん
    2015年10月22日 at 2:26 PM

    pepperで撮った画像をメールで送信したいのですが、送信できません。エラーは出ていないのですが。原因はなんだと思われますか

  2. ぬん
    2015年10月22日 at 3:39 PM

    メールの送信ができません。パスワードはpepperのものでしょうか。PCのものでしょうか。教えて頂きたいです。

    • arit.dev.wp.staff
      2015年10月22日 at 9:28 PM

      pepperにて、画像添付付きメールを送信できないというお問い合わせを複数頂いておりますが、以下の点ご確認お願いします。

      1)メール自体は送信できますか?
      pepper には、「Send E-mail」という部品がありますので、こちらを利用することでメールは送信できます。
      もし、画像添付の有無にかかわらず、メールが送信できないということでしたら、
      ・設定値が正しいかどうか、pepper のリファレンスをご確認ください
      ・pepper から、メールサーバまで通信が到達できる環境下にあるか、ご確認ください

      2)メールは送信できるが、画像添付ができない
      メールを送信でき、かつ画像添付ができないということでしたら、画像の保存先が正しいかどうか、ご確認ください

      以下、補足です。

      >メールの送信ができません。パスワードはpepperのものでしょうか。PCのものでしょうか。
      メールサーバのものです。

      • ぬん
        2015年10月23日 at 1:43 PM

        返信ありがとうございます。
        また、しつこく質問をしてしまったことをお詫びいたします。すいませんでした。

        メール自体の送信できませんでした。

        上記のことを確認してやっていきたいと思います。
        返信ありがとうございました。

  3. まさこ
    2016年4月19日 at 12:41 PM

    手順7で、ダブルクリックすると、すでに色々と書き込まれてありますが、どの部分を、修正したらよいのかがわかりません。
    掲載されているものを、そのまま、ペタッと
    上書きすればよいのでしょうか。
    javaとかまったくわからなくて、ど素人ですみませんが、よろしくお願いいたします。

    • arit.dev.wp.staff
      2016年4月19日 at 6:23 PM

      手順7のプログラムの先頭に、
      def onInput_onSend(self, p):
      という記述があると思いますが、これは python 言語の関数定義になり、その配下に記載されている内容が、関数内の処理になります。
      このため、上記関数の中身を、手順7のものに差し替えてください。

      • まさこ
        2016年4月20日 at 7:08 AM

        ご返答ありがとうございます。
        def onInput_onSend(self):というのはみちうかりましたが、def onInput_onSend(self, p):はありませんでした。
        ちなみに
        def onInput_onSend(self):は、2つありました。

        コードを記します。
        何卒宜しくお願い致します。

        ——————
        import sys, os
        import smtplib, email

        def mail(email_user, to, subject, text, attach, email_pwd, smtp, port):
        msg = email.MIMEMultipart.MIMEMultipart()
        msg[‘From’] = email_user
        msg[‘To’] = to
        msg[‘Subject’] = subject

        msg.attach(email.MIMEText.MIMEText(text))

        if attach:
        part = email.MIMEBase.MIMEBase(‘application’, ‘octet-stream’)
        part.set_payload(open(attach, ‘rb’).read())
        email.Encoders.encode_base64(part)
        part.add_header(‘Content-Disposition’,
        ‘attachment; filename=”%s”‘ % os.path.basename(attach))
        msg.attach(part)

        if( port != “” ):
        mailServer = smtplib.SMTP(smtp, port)
        else:
        mailServer = smtplib.SMTP(smtp)
        mailServer.ehlo()
        mailServer.starttls()
        mailServer.ehlo()
        mailServer.login(email_user, email_pwd)
        mailServer.sendmail(email_user, to, msg.as_string())

        mailServer.close()

        class MyClass(GeneratedClass):
        def __init__(self):
        GeneratedClass.__init__(self, False)

        def onLoad(self):
        pass

        def onUnload(self):
        #puts code for box cleanup here
        pass

        def onInput_onSend(self):
        sEmailUser = self.getParameter(“From”)
        aTo = self.getParameter(“To”).split(“;”)
        sSubject = self.getParameter(“Subject”)
        sText = self.getParameter(“Contents”)
        sAttachedFilePath = self.getParameter(“Attachment”)
        sPwd = self.getParameter(“Password”)
        sSmtp = self.getParameter(“SMTP address”)
        sPort = int( self.getParameter(“Port number”) )
        try:
        sPort = int( sPort )
        bValidPort = ( sPort >= 0 and sPort <= 65535 )
        except:
        bValidPort = False
        if( not bValidPort ):
        raise Exception( str(sPort) + " is not a valid port number to use to send e-mail. It must be an integer between 0 and 65535. Please check that the port parameter of the box is correct." )
        for address in aTo:
        try:
        mail(
        sEmailUser,
        address,
        sSubject,
        sText,
        sAttachedFilePath,
        sPwd,
        sSmtp,
        sPort)
        except smtplib.SMTPAuthenticationError as e:
        raise(Exception("Authentication error, server answered : [%s] %s" % (e.smtp_code, e.smtp_error)))

        self.onSent() # activate output of the box

        • arit.dev.wp.staff
          2016年4月22日 at 11:23 AM

          まさこ さま

          ご指摘ありがとうございます。
          失礼致しました。 こちらの記載不備となります。

          手順7の先頭で行っている、以下の変更は、コメント行の引数記載がすでに
          修正後の引数と同じになっているので、混乱させてしまったかと存じます。

          ーーー
          #メッセージを取得するために引数を追加する
          def onInput_onSend(self, p):
          #def onInput_onSend(self, p):
          ーーー

          初期状態では、引数がselfのみと存知ますので、こちらを2つ引数が受け取れるよう
          変更すると解釈頂ければと存じます。

          なお、本記事の方も修正させて頂きます。

  4. kokona
    2016年4月22日 at 12:54 AM

    [ERROR] behavior.box :__init__:10 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1140479311919408:/Speech Reco._3: ALProxy::ALProxy
    Can’t find service: ALSpeechRecognition
    というエラーが出てしまいました。
    また、
    Warning!!The Password has to be hardcoded inside the behavior, and will not
    be encrypted or hidden. You should create an e-mail account for your robot, that
    uses a password that you are comfortable to leave un-encrypte.
    と言われたのですが、どう対処すればよいでしょうか。

    • arit.dev.wp.staff
      2016年4月22日 at 11:03 AM

      kokonaさん

      お問い合わせありがとうございます。
      先ず、エラーについてですが、こちら動作環境がバーチャルロボットである場合、
      エラーが発生していても、一部機能が動作しないだけで、基本の機能は確認することができます。
      バーチャルロボットでは、実際のロボットと若干差がありますので、機能の制限がある為です。

      使用されているChoregraphe自体のバージョンによっても差があり、Choregraphe2.3ですと、
      一部の機能が利用できなくなっているそうです。

      プログラム自体が動かない場合は、フローダイアグラムのボックス間接続に指定している端子が
      誤っている可能性もありますので、こちらも併せてご確認頂ければと存じます。

      次に、ワーニングについてですが、メッセージの内容通り、メール認証用のパスワードが
      内包されていてかつ、暗号化されていないので危険ですよと、知らせてくれています。
      また、メールアドレスをロボット専用に作成して、パスワードは暗号化するべきですよと
      教えてくれているいますので、ご参考ください。

  5. 本多
    2017年2月20日 at 4:49 PM

    メールは無事に送られるのですが、
    ペッパーに対して、自分の名前をはなしても、
    メールには、yesとしか記載されません。
    SpeechRecoの設定が必要でしょうか?
    よろしくおねがいします。

    • arit.dev.wp.staff
      2017年3月9日 at 3:23 PM

      はい。メールの本文には、

      #取得したメッセージを内容に追加する
      sText = str(p)

      の内容が設定されることになりますので、「p」に話した内容を含めるために、SpeechRecoの設定が必要となります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*