質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

2593閲覧

AWS LamdaとSESを利用したメール送信での複数宛先をセットする方法

shunn

総合スコア2

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2022/09/16 08:43

lambdaを利用してdynamodbから宛先リストを取得し、対象者にメールを送信したいと考えております。※複数のメールではなく、1つのメールで対象者に

宛先を変数にして複数にしたときにエラーが発生しました。

実現したいこと

宛先、ccにそれぞれ複数のアドレスをセットできるようにしたい

発生している問題・エラーメッセージ

Response { "errorType": "InvalidParameterValue", "errorMessage": "Illegal address", "trace": [ "InvalidParameterValue: Illegal address", " at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/query.js:50:29)", " at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)", " at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)", " at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:686:14)", " at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)", " at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)", " at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10", " at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)", " at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:688:12)", " at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)" ] }

該当のソースコード

node.js

1var aws = require('aws-sdk'); 2var dynamo = new aws.DynamoDB(); 3var ses = new aws.SES({ region: "ap-northeast-1" }); //SESの認証が取れているリージョンの選択 4 5exports.handler = async (event) => { 6 let prm={ 7 tablename:"sampledb",//テーブル名 8 pk_name:"SendLayer",//パーテーションキーの名称 9 pk_prm:{S:"To"},//検索パーテーションキーの指定 10 sk_name:"UserId",//ソートキーの名称 11 sk_prm:{N:"99999"},//検索ソートキーの指定 12 }; 13 let res= await dynamoquery_pksk(prm); 14 15 const to_list_num = Object.keys(res).length 16 var to_list =""; 17 var to_all =""; 18 19 for(var i = 0; i < to_list_num; i++) { 20 to_list = '"' +res[i]["UserAddress"]["S"] + '"' + ',' 21 //to_list = res[i]["UserAddress"]["S"] + "," 22 to_all = to_all + to_list 23 } 24 var email_params = { 25 Destination: { 26 ToAddresses: [ 27 to_all 28 ], 29 CcAddresses: [ 30 ] 31 }, 32 Message: { 33 Body: { //メール本文 \n\で改行コード 34 Text: { Data: "株式会社" 35 }, 36 }, 37 38 Subject: { Data: "発注願い" }, //メール題名 39 }, 40 Source: "sample@example", //メール送信元アドレス ※ssesの認証が取れているメールアドレスを選択すること. 41 }; 42 console.log(to_all) 43 return ses.sendEmail(email_params).promise() 44 //return(to_all) 45}; 46 47 48 49function dynamoquery_pksk(obj){ 50 return new Promise((resolve, reject) => { 51 let params = { 52 "TableName": obj.tablename, 53 "KeyConditionExpression": "#pk_name = :pk_prm and #sk_name < :sk_prm" ,//検索条件 パーテーションキーでのは=のみ 54 "ExpressionAttributeNames":{ 55 "#pk_name": obj.pk_name, 56 "#sk_name": obj.sk_name 57 }, 58 "ExpressionAttributeValues": { 59 ":pk_prm": obj.pk_prm, 60 ":sk_prm": obj.sk_prm, 61 } 62 }; 63 dynamo.query(params,function(err, data) { 64 if (err) { 65 reject(err, err); 66 } else { 67 resolve(data.Items); 68 } 69 }); 70 }); 71}

試したこと

console.logで出力された値をそのまま、toaddresにセットすると普通に送信できました。
また、to_allではなくto_list(*要は宛先が1つ)の場合は送信できました。

ログの内容

fuctionlogs

1START RequestId: 46b56a5e-125f-4156-ba6b-03b1588f2d0b Version: $LATEST 22022-09-16T08:36:35.975Z 46b56a5e-125f-4156-ba6b-03b1588f2d0b INFO to_all 32022-09-16T08:36:35.975Z 46b56a5e-125f-4156-ba6b-03b1588f2d0b INFO "sample1@example.com","sample@example.com", 42022-09-16T08:36:36.195Z 46b56a5e-125f-4156-ba6b-03b1588f2d0b ERROR Invoke Error {"errorType":"InvalidParameterValue","errorMessage":"Illegal address","code":"InvalidParameterValue","message":"Illegal address","time":"2022-09-16T08:36:36.137Z","requestId":"dee2cdc7-173a-4308-bd81-d85e8bf5fbc8","statusCode":400,"retryable":false,"retryDelay":54.19076785133659,"stack":["InvalidParameterValue: Illegal address"," at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/query.js:50:29)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:686:14)"," at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)"," at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)"," at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:688:12)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"]} 5END RequestId: 46b56a5e-125f-4156-ba6b-03b1588f2d0b 6REPORT RequestId: 46b56a5e-125f-4156-ba6b-03b1588f2d0b Duration: 953.65 ms Billed Duration: 954 ms Memory Size: 128 MB Max Memory Used: 82 MB Init Duration: 427.38 ms

ここにより詳細な情報を記載してください。
エラーの内容をみる限りは、アドレスのセットし方がまちがっているようなのですが、どうすればよいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

宛先一覧を作るコードが間違えています
複数のアドレスを1つの文字列として作成していますが、
"aaa@aaa.com, bbb@bbb.com"
正しくは
["aaa@aaa.com", "bbb@bbb.com"]
にするのが正しいものとなります

javascript

1const to_list_num = Object.keys(res).length 2var to_list = ""; 3var to_all = ""; 4 5for (var i = 0; i < to_list_num; i++) { 6 to_list = '"' + res[i]["UserAddress"]["S"] + '"' + ',' 7 //to_list = res[i]["UserAddress"]["S"] + "," 8 to_all = to_all + to_list 9} 10var email_params = { 11 Destination: { 12 ToAddresses: [ 13 to_all 14 ], 15 CcAddresses: [ 16 ] 17 }, 18 Message: { 19 Body: { //メール本文 \n\で改行コード 20 Text: { 21 Data: "株式会社" 22 }, 23 }, 24 25 Subject: { Data: "発注願い" }, //メール題名 26 }, 27 Source: "sample@example", 28};

javascript

1const to_list_num = Object.keys(res).length 2var to_list = ""; 3var to_all = []; 4 5for (var i = 0; i < to_list_num; i++) { 6 to_list = res[i]["UserAddress"]["S"] 7 to_all.push(to_list) 8} 9var email_params = { 10 Destination: { 11 ToAddresses: to_all, 12 CcAddresses: [] 13 }, 14 Message: { 15 Body: { //メール本文 \n\で改行コード 16 Text: { 17 Data: "株式会社" 18 }, 19 }, 20 21 Subject: { Data: "発注願い" }, //メール題名 22 }, 23 Source: "sample@example", 24};

また回答とは関係ない個人的なソースコードの指摘ですが、

  • varとconstが混在しているので、基本的にはconstで再代入を行う場合はletで宣言し、varを使わないようにしたほうが良いです
  • dynamo.queryをしているところでコールバック関数の結果をPromiseで返していますが、SESのように.promiseを使うとよいかと思います
    return dynamo.query(params).promise()
  • インデントがズレているので、フォーマットをかけるようにお願いします
  • 単純なFor文を回して配列内のオブジェクトを取り出すループの場合は配列のmap関数を使うとキレイに書けるかと思います
  • DynamoDBを使うときはaws.DynamoDB()ではなくaws.DynamoDB.DocumentClient()を使う方が扱いやすいデータになります

以下例です

javascript

1const aws = require('aws-sdk') 2const dynamo = new aws.DynamoDB.DocumentClient() 3const ses = new aws.SES({ region: "ap-northeast-1" }) 4 5exports.handler = async () => { 6 const prm = { 7 tablename: "sampledb", 8 pk_name: "SendLayer", 9 pk_prm: "To", 10 sk_name: "UserId", 11 sk_prm: "99999", 12 } 13 const res = await dynamoquery_pksk(prm) 14 15 // https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map 16 const to_list = res.Items.map(item => item["UserAddress"]) 17 18 // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SES.html#sendEmail-property 19 const email_params = { 20 Destination: { 21 ToAddresses: to_list, 22 CcAddresses: [] 23 }, 24 Message: { 25 Body: { 26 Text: { 27 Data: "株式会社" 28 }, 29 }, 30 31 Subject: { Data: "発注願い" }, 32 }, 33 Source: "sample@example", 34 } 35 console.log(email_params) 36 return ses.sendEmail(email_params).promise() 37} 38 39function dynamoquery_pksk(obj) { 40 // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#query-property 41 const params = { 42 "TableName": obj.tablename, 43 "KeyConditionExpression": "#pk_name = :pk_prm and #sk_name < :sk_prm", 44 "ExpressionAttributeNames": { 45 "#pk_name": obj.pk_name, 46 "#sk_name": obj.sk_name 47 }, 48 "ExpressionAttributeValues": { 49 ":pk_prm": obj.pk_prm, 50 ":sk_prm": obj.sk_prm, 51 } 52 } 53 return dynamo.query(params).promise() 54}

JavascriptやAWSの学習は大変かと思いますが頑張ってください

投稿2022/09/17 03:51

編集2022/09/17 04:25
tamanegine

総合スコア177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shunn

2022/09/17 22:00

正しい解答だけでなく、さらに良い方法や改善点をご教示頂きありがとうございました。」
shunn

2022/09/19 00:01

度々申し訳ございません。 実行してみたら、"errorMessage": "One or more parameter values were invalid: Condition parameter type does not match schema type", というエラーでdbからよみとりができないです。documentclientなどのリファレンスを確認しましたが、必要なパラメータ自体はセットできているきがするのですが、なにか良い方法がありますでしょうか? 情報すくなく申し訳ございません。
shunn

2022/09/19 00:02

一応、aws.config.updateでリージョンもセットしてみました。
shunn

2022/09/19 02:37

UserIDを""でくくっていたため、文字型で認識され、エラーとなったようです。""なくしたらできました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問