LoginSignup
2
1

More than 1 year has passed since last update.

SESでGmailを受信してS3経由でkintoneに追加する方法

Posted at

ここではAWSのSESでメールを取得してS3に保存し、保存と同時にlambdaを動かしてkintoneに追加する方法をお伝えします。
※SESから直接lambdaを動かすことも可能でしたが、メールの本文のみ取得ができませんでした。

1.SESでルールを設定する

・ドメインの追加
SESのホーム>SESのdomains>Verify a New Domainでドメインの追加
・ルールの追加
ルールの名前をつけてください
スクリーンショット 2021-04-26 19.00.18.png

作成されたルールを押して、項目を進めます。
スクリーンショット 2021-04-26 19.02.27.png
次もcreateRuleで進みます。
Step1:Recipient
スクリーンショット 2021-04-26 19.04.32.png
Step2:Action
スクリーンショット 2021-04-26 19.05.03.png
Step3:Rule Details
スクリーンショット 2021-04-26 19.05.55.png
Step4:Review
スクリーンショット 2021-04-26 19.06.22.png
ここまで出来ましたでしょうか?
S3の設定もできましたのでS3に入っているか確認してください、入っていればルール設定ができています。

2.メールがS3に保存された時にlambdaを動かしてKintoneに保存させる。

まず、lambdaで関数を作成してトリガーでS3を選択し、設定してください。

スクリーンショット 2021-05-06 16.04.16.png
+トリガーを追加を押します。
スクリーンショット 2021-05-06 16.05.02.png
バケットはメールが受信されるバケットを選んでください。

3.lambdaでS3の中身を取得する。

まず、フォルダとその中にindex.jsを作ります。
今回は「KintoneRestAPIClient」を利用して追加したいと思います。

var aws = require('aws-sdk');
aws.config.region = 'us-east-1';
const s3 = new aws.S3();
//KintoneRestAPIClientを読み取る
const { KintoneRestAPIClient } = require('@kintone/rest-api-client');

exports.handler = async (event) => {
//ここからkintoneに追加する
    const params = await getS3FileKey(event);
    const eml = await getEmlFromS3(params);
    const json = await convertEMLtoJSON(eml);
}

ファイルキーを取得します。

function getS3FileKey (event) {

  console.log("START getS3FileKey");

  try {

      //S3より受け取ったeventオブジェクトよりバケット名とファイル名を取得する
      const bucket = event.Records[0].s3.bucket.name;
      const objKey = event.Records[0].s3.object.key.replace(/\+/g," ");

      //S3getリクエスト用のパラメータを作成する
      const params = {
          Bucket: bucket,
          Key: objKey
      };

      return params;

  } catch (e) {
      console.error("[ABEND] ファイルキーの取得に失敗: " + e);
      process.exit(1);
  }
}

S3からデータを取得します。

async function getEmlFromS3(params){
  try {
      const res = await s3.getObject(params).promise();
      const s3data = res.Body.toString("utf-8");
      return s3data;
  } catch (e) {
      console.log("[ABEND] S3からデータの取得に失敗: " + e);
      process.exit(1);
  }
}

async function convertEMLtoJSON(eml) {
  try {
      console.log("START convertEMLtoJSON");
      const json = await simpleParser(eml);
      return json;
  } catch(e){
      console.error("[ABEND] EML→JSON変換に失敗: " + e);
      process.exit(1);
  }
}

4.取得したS3の内容をkintoneに追加(ここでは日付を追加)

exports.handler = async (event) => {
  const params = await getS3FileKey(event);
      const eml = await getEmlFromS3(params);
      const json = await convertEMLtoJSON(eml);
      //日付を取得
      let date = json.date

  // クライアントの作成
  const client = new KintoneRestAPIClient({
    baseUrl: 'https://〇〇.cybozu.com',
    auth: {
      apiToken:"〇〇〇〇" 
//アクセストークンを発行して追加してください https://developer.cybozu.io/hc/ja/articles/202463840
    },
  });
  // リクエストパラメータの設定
  const APP_ID = アプリID;
  // レコードの追加
  await client.record.addRecord({
    app: APP_ID,
    record: {
      日付: {
        value: date
      },
    }
  }).then(resp => console.log(resp)).catch(err => console.log(err));
}

最後に

できましたでしょうか、今回は日付のみを取得しましたが件名や文章も取得できるので試してみてください。閲覧ありがとうございました。

2
1
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
2
1