0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】Alexa × Lambda × SES で、話した内容をメールで送る

Last updated at Posted at 2025-11-27

はじめに

 私はIoT機器が好きで、自宅でもAlexaを活用しています。
 Alexaに話しかけた内容を自動でメールに送る仕組みができないかとふと思いつき、色々調べてやってみました。
 その結果、「Alexa、マイメモで明日買い物に行きますよを送って」と話しかけるだけで、自分のメールに「明日買い物に行きますよ」というメモが届くようになりました。
 この仕組みを応用すれば、他にも色々なことができるのではないかと考えています。例えば、Alexaに話しかけて、親友や家族に簡単な定型文やメッセージを送ることなども可能になります。
 今回は、Geminiさんに聞きながら、こういう仕組みを作ってみました。自分へのメモとして構築手順を残したいと思います。

構築手順

前提

  • AWSアカウントの作成が完了したこと
  • Alexaアカウントの作成が完了したこと

手順

1. Amazon SES(メール送信サービス)の準備

概要:
メールを送るための「送信元」と「送信先」をAWS上で許可する。今回は練習のため、送信元と送信先を同じメールアドレスにする。

操作手順:

  1. AWSコンソールで「Amazon SES」を開き、「使用を開始」をクリックする
  2. 左上、三本線メニューの「設定」→「ID」をクリックし、「IDの作成」をクリックする
  3. 「Eメールアドレス」を選択し、自分のメールアドレスを入力する(※他の設定はデフォルトで問題なし)
  4. 「IDを作成」をクリックし、入力したアドレスに確認メールが届くので、リンクをクリックして承認する
  5. Amazon SESのIDステータスが「検証済み」になったことを確認

2. Alexa Developer Consoleでスキルを作成する

概要:
 Alexa Developer Consoleは、Alexaスキル(Alexa向けのアプリケーション)を作成し、管理するためのAmazon提供のWebベースの統合開発環境である。
 これは、Alexaに話しかけた内容をメールとして受け取る「マイメモ」スキルのような、音声入力を処理する仕組みを設計・設定するために利用される。

操作手順:

  1. Alexa Developer Consoleにログイン

  2. 「スキルの作成」をクリック

    1. スキル名: マイメモ
      (今後利用の際に「Alexa、 マイメモで ◯◯を送って」の呼び出し名になる)

    2. デフォルトの言語: 日本語

    3. 「次へ」をクリック

    4. エクスペリエンスのタイプ: その他

    5. モデル: カスタム

    6. ホスティングサービス: 独自のプロビジョンニング

    7. 「次へ」をクリック

    8. Templates: スクラッチで作成

    9. 「スキルを作成する」をクリック
      設定画面

  3. スキルの設定画面に遷移されて、詳細を設定する

    1. 左メニューから「対話モデル」(Interraction model)→「インテント」(Intents)→「インテントを追加」(+ Add Intent)をクリック
    2. カスタムインテント名(Create custom intent): MemoIntent と入力して作成
    3. 画面下の「インテントスロット」セクションで、新しいスロット MemoContent を追加+
    4. スロットタイプ: AMAZON.SearchQuery を選択
    5. サンプル発話(Sample Utterances)を登録
      • {MemoContent}を送って
      • メモ{MemoContent}
    6. 「モデルを保存(Save)」し、画面を閉じずに一旦放置する
      skill build

3. AWS Lambda(処理実行)の作成

概要:
サーバーレスでコードを実行する部分になる。関数の作成、コードの実装と権限付与の必要がある。話した内容を抽出とメール送信の役割を担う。

操作手順:

  1. AWSコンソールで「Lambda」を開き、「関数の作成」をクリック

  2. Lambda設定:

    • 関数名: AlexaToEmailFunction (任意)
    • ランタイム: Python 3.9 (または最新)
    • アーキテクチャ: x86_64
    • 「関数の作成」ボタンを押して作成完了まで待つ
  3. 権限設定(IAMロール)
    ※ LambdaがSESを使ってメールを送れるように権限を付与する。

    • 作成したLambda関数の「設定」タブ -> 「アクセス権限」 -> 実行ロール名をクリック(IAMコンソールが開く)
    • 「許可を追加」 -> 「ポリシーをアタッチ」を選択
    • 検索窓に AmazonSESFullAccess と入力し、チェックを入れて「許可を追加」をクリック
      ※ 本番運用時はFullAccessではなく、特定の送信権限のみに絞るのがベストプラクティスだが、今回は練習のためFullAccessで進む
  4. コードの実装
    Lambdaの「コード」タブに戻り、lambda_function.py に以下のコードを貼り付けて「Deploy」する

lambda_function.py
import json
import boto3
import datetime
from botocore.exceptions import ClientError

# ▼▼▼ 設定エリア ▼▼▼
SENDER = "あなたのメールアドレス@example.com" # Step1で認証したアドレス

# TO: 主な宛先(リスト形式)
TO_LIST = [
    "あなたのメールアドレス@example.com" # Step1で認証したアドレス
]

# CC: 共有したい宛先(リスト形式)
CC_LIST = [
    # "boss@example.com",  # ← 必要ならコメントを外してアドレスを書く
]

# BCC: こっそり送りたい宛先(リスト形式)
BCC_LIST = [
    # "secret@example.com",
]
# ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

AWS_REGION = "ap-northeast-1" # リージョンを一致する必要がある

def lambda_handler(event, context):
    print("Event:", json.dumps(event))
    request_type = event['request']['type']
    
    if request_type == "LaunchRequest":
        return build_response("メモをどうぞ。", should_end_session=False)
        
    elif request_type == "IntentRequest":
        intent_name = event['request']['intent']['name']
        if intent_name == "MemoIntent":
            slots = event['request']['intent']['slots']
            if 'MemoContent' in slots and 'value' in slots['MemoContent']:
                memo_text = slots['MemoContent']['value']
                
                is_success, message = send_email(memo_text)
                
                if is_success:
                    return build_response(f"メール送信しました。 {memo_text}", should_end_session=True)
                else:
                    return build_response(f"エラーが発生しました: {message}", should_end_session=True)

    return build_response("終了します。", should_end_session=True)

def send_email(text):
    client = boto3.client('ses', region_name=AWS_REGION)
    
    now = datetime.datetime.now() + datetime.timedelta(hours=9)
    date_str = now.strftime("%Y/%m/%d")
    time_str = now.strftime("%H:%M")
    
    # ★修正:日付を下に配置するフォーマット
    body_text = f"""
{text}
----------
{date_str} {time_str}
"""

    try:
        client.send_email(
            Destination={
                'ToAddresses': TO_LIST,
                'CcAddresses': CC_LIST,
                'BccAddresses': BCC_LIST
            },
            Message={
                'Body': {'Text': {'Charset': "UTF-8", 'Data': body_text}},
                'Subject': {'Charset': "UTF-8", 'Data': "【メモ】Alexaからのリマインド"},
            },
            Source=SENDER,
        )
        return True, "送信完了"
    except ClientError as e:
        error_message = e.response['Error']['Message']
        print(f"Error: {error_message}")
        return False, error_message

def build_response(text, should_end_session):
    return {
        'version': '1.0',
        'response': {
            'outputSpeech': {'type': 'PlainText', 'text': text},
            'shouldEndSession': should_end_session
        }
    }

完了後、画面上部の「関数のARN」を確認し、後ほど使う

4. Alexa x Lambdaとの接続

概要:
AlexaとLambdaを連携させて、動作できるようにする。

操作手順:

  1. Alexa Developer ConsoleからスキルIDを取得する
    1. ステップ2で一旦放置したAlexa Developer Console画面に戻る
    2. 左メニューから「Endpoint」をクリック
    3. 「AWS Lambda ARN」を選択、「Your Skill ID」をコピーする
  2. AWS Lambda画面に戻って、トリガーを追加する
    1. 画面上部(関数の概要エリア)にある 「+ トリガーを追加 (Add trigger)」 ボタンをクリックする
    2. ソースを選択するプルダウンで 「Alexa Skills Kit」 を選択する
      ※ 注意: 「Alexa Smart Home」ではなく「Alexa Skills Kit」を選ぶ
    3. 「スキルID検証 (Skill ID verification)」 という項目が表示される
    4. ここで 「有効化 (Enable)」 を選び、下の入力欄に、さきほどコピーした スキルID を貼り付ける
    5. 右下のオレンジ色の 「追加 (Add)」 ボタンをクリックする
  3. トリガーが追加されたら、Alexa開発コンソールに戻る
    1. 「Default Region」に、Lambdaの「関数のARN」を貼り付ける
    2. 「Save」して、モデルをビルド (Build Model)」ボタンをクリックする

5. テストと実行

操作手順:

  1. Alexa Developer Consoleの「テスト」タブをクリックする
  2. 「スキルテストが有効になっていません」を「開発中」に変更する
  3. シミュレーターのマイクアイコンを長押しするか、文字入力で以下のように話しかける
    • 「マイメモを開いて」
    • (Alexaが応答したら)「明日の会議資料を作るのを忘れないようにを送って」
  4. Lambdaが正しく動けば、指定したメールアドレスに「明日の会議資料を作るのを忘れないように」という本文のメールが届く

最後に

 手を動かして、色々勉強になりました。テストの際にメールが届かなかったことはありました。調べてみたら、迷惑メールボックスに入っちゃいました(笑)。
 自分へのメモとして、今回のハンズオンを記録しました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?