前回は、ソケット通信を用いて、双方向での通信を行うアプリケーションを作成しました。
今回は、話した内容を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アプリケーション開発に触れていく予定です。
弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。
pepperで撮った画像をメールで送信したいのですが、送信できません。エラーは出ていないのですが。原因はなんだと思われますか
メールの送信ができません。パスワードはpepperのものでしょうか。PCのものでしょうか。教えて頂きたいです。
pepperにて、画像添付付きメールを送信できないというお問い合わせを複数頂いておりますが、以下の点ご確認お願いします。
1)メール自体は送信できますか?
pepper には、「Send E-mail」という部品がありますので、こちらを利用することでメールは送信できます。
もし、画像添付の有無にかかわらず、メールが送信できないということでしたら、
・設定値が正しいかどうか、pepper のリファレンスをご確認ください
・pepper から、メールサーバまで通信が到達できる環境下にあるか、ご確認ください
2)メールは送信できるが、画像添付ができない
メールを送信でき、かつ画像添付ができないということでしたら、画像の保存先が正しいかどうか、ご確認ください
以下、補足です。
>メールの送信ができません。パスワードはpepperのものでしょうか。PCのものでしょうか。
メールサーバのものです。
返信ありがとうございます。
また、しつこく質問をしてしまったことをお詫びいたします。すいませんでした。
メール自体の送信できませんでした。
上記のことを確認してやっていきたいと思います。
返信ありがとうございました。
手順7で、ダブルクリックすると、すでに色々と書き込まれてありますが、どの部分を、修正したらよいのかがわかりません。
掲載されているものを、そのまま、ペタッと
上書きすればよいのでしょうか。
javaとかまったくわからなくて、ど素人ですみませんが、よろしくお願いいたします。
手順7のプログラムの先頭に、
def onInput_onSend(self, p):
という記述があると思いますが、これは python 言語の関数定義になり、その配下に記載されている内容が、関数内の処理になります。
このため、上記関数の中身を、手順7のものに差し替えてください。
ご返答ありがとうございます。
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
まさこ さま
ご指摘ありがとうございます。
失礼致しました。 こちらの記載不備となります。
手順7の先頭で行っている、以下の変更は、コメント行の引数記載がすでに
修正後の引数と同じになっているので、混乱させてしまったかと存じます。
ーーー
#メッセージを取得するために引数を追加する
def onInput_onSend(self, p):
#def onInput_onSend(self, p):
ーーー
初期状態では、引数がselfのみと存知ますので、こちらを2つ引数が受け取れるよう
変更すると解釈頂ければと存じます。
なお、本記事の方も修正させて頂きます。
[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.
と言われたのですが、どう対処すればよいでしょうか。
kokonaさん
お問い合わせありがとうございます。
先ず、エラーについてですが、こちら動作環境がバーチャルロボットである場合、
エラーが発生していても、一部機能が動作しないだけで、基本の機能は確認することができます。
バーチャルロボットでは、実際のロボットと若干差がありますので、機能の制限がある為です。
使用されているChoregraphe自体のバージョンによっても差があり、Choregraphe2.3ですと、
一部の機能が利用できなくなっているそうです。
プログラム自体が動かない場合は、フローダイアグラムのボックス間接続に指定している端子が
誤っている可能性もありますので、こちらも併せてご確認頂ければと存じます。
次に、ワーニングについてですが、メッセージの内容通り、メール認証用のパスワードが
内包されていてかつ、暗号化されていないので危険ですよと、知らせてくれています。
また、メールアドレスをロボット専用に作成して、パスワードは暗号化するべきですよと
教えてくれているいますので、ご参考ください。
メールは無事に送られるのですが、
ペッパーに対して、自分の名前をはなしても、
メールには、yesとしか記載されません。
SpeechRecoの設定が必要でしょうか?
よろしくおねがいします。
はい。メールの本文には、
#取得したメッセージを内容に追加する
sText = str(p)
の内容が設定されることになりますので、「p」に話した内容を含めるために、SpeechRecoの設定が必要となります。