🤖

Amazonの配達完了メールが届いたらSlackにDM送信する

2025/02/12に公開

こんにちは、TRUSTDOCKのよもぎたです。

はじめに

私はよくAmazonで買い物をします。最近は置き配がデフォルトになって、受け取りが楽になったのはいいのですが、荷物が届いたタイミングが分かりにくくなりました。配達完了するとメールは届くのですが、平日はプライベートのメールを確認する頻度は高くありません。そこで、配達完了メールが届いたらSlackにDM送信するようにしてみました。

別の言い方をすると、前回の記事でSlackにDMを送れるようになったので、何か作ってみようというわけです。

アプローチ

配達完了メールの送信元メールアドレスは固定、Subject(件名)は定型です。Gmailからそれらと、未読であることを条件にメールを検索して、1件以上ヒットすればSlackにDM送信してメールを既読にします。

これだけです。

条件、制限

アプローチをご覧頂ければわかるとおり、Gmailのフィルタで配達完了メールを自動で既読にしないことが必要です。

スクリプトはGoogle Apps Scriptの時間ベースのトリガーで起動します。メール着信をトリガーにしたDM送信ではありません。

分ベースのタイマーで1分おきと指定すればほぼ即時通知に出来ますが、そこまでの必要性は感じなかったので、私は15分おきのタイマーにしました。

実践

Google Apps Script

スクリプトのサマリ

Class GmailAppのリファレンスを見ると、searchメソッドでWebアプリのGmailと同じ条件でスレッドを検索できます。戻り値はスレッドの配列です。検索して戻り値のスレッド配列のlengthが0より大きければSlackにDM送信することにしました。

メールのクエリ

メール検索の条件は次の3つです。

  1. 送信元メールアドレスがorder-update@amazon.co.jpであること
  2. Subject(件名)が配達完了:ご注文商品の配達が完了しましたであること
  3. 未読であること

この条件でメールを検索するGoogle Apps Scriptコードは次のようになります。

  const query_string = 'from:order-update@amazon.co.jp subject:"配達完了:ご注文商品の配達が完了しました" is:unread';
  const threads = GmailApp.search(query_string);

SlackでDM送信

threads.lengthが0より大きければ、SlackでDM送信します。

  if(threads.length > 0){
    send_slack_message();
  }

send_slack_message()の中身は、前回の記事をご覧ください。messageAmazonの配達完了を検知しましたに変更した以外、まるっと使いまわしています。

配達完了メールを既読にする

次の実行時に重複して検索にヒットしないように、メールを既読にします。Class GmailThreadのリファレンスを見ると、markReadメソッドを使えばよいことが分かります。

  threads.forEach((thread) =>
    {
      thread.markRead();
    }
  )

テスト

配達完了メールを1件未読に戻してスクリプトを実行します。
SlackでDMが来てメールが既読になればOKです。

テスト結果

トリガー設定

Google Apps Scriptのページの左のメニューのトリガーを選択します。

トリガーを選択

右下のトリガーを追加をクリックして、出てきたウィンドウの各メニューを設定します。私は次のようにしました。

トリガー設定

しばらくするとスクリプトが実行されて、実行結果が分かるようになります。この時、1件未読に戻しておくのもよいと思います。

実行結果

さいごに

弊社は在宅勤務が基本で平日は家で仕事をしています。これまでは、Amazonで配達予定があるときは、トイレに立った時などに玄関先を見ていました。でも、これでSlackでDMが来たときに見に行けばよいことになります。どんどん怠惰になって行きますが、**怠惰はプログラマの三大美徳のひとつ**です。

コンピュータをビシバシ使って、どんどん生活を便利にしていきたいと思います!

最後までお読みいただきありがとうございました。

TRUSTDOCK テックブログ

Discussion