リターンメールが届いたらkintoneにフラグを立てる

リターンメールが届いたらkintoneにフラグを立てる

弊社では新規顧客開拓管理にkintoneを使用しており、メールワイズと連携させてkintoneから一斉にメールを送っています。その際リターンメール(宛先不明メール)が返ってきて使用できないアドレスがあった場合、今後メールを送らないようにkintoneにフラグを立てています。大量のリターンメールが届いた際に手間を省くため、GASを使用してリターンメールが届いたら自動で、kintoneのアプリにフラグを立てるようにしました。今回はその方法をご紹介いたします。

他のアカウントのメールをGmailにPOPで取得する

GASを使用するため、メールはGmailを利用しました。Gmailにはgmail.com以外の他のメールサービスのアカウントからメールを受信する機能が用意されていますので、その機能を使用いたします。元々Gmailを使用している方はこの作業は必要ありません。設定方法はGmailのヘルプに記載されています。

kintoneのメールアドレスを重複禁止にする

今回はkintoneをGASから検索、更新する際にメールアドレスをキーとして使用するため、メールアドレスは重複禁止にする必要があります。

下記のメールアドレスのフィールドの設定画面で一番下の「値の重複を禁止する」にチェックを入れていただければ、重複禁止の設定になります。

kintoneのフィールド設定

KintoneManagerをライブラリに追加する

GASからkintoneAPIを呼ぶ処理が簡単に出来るライブラリ「KintoneManager」が公開されていますので、こちらをGASに追加して使用させていただきます。ライブラリの追加方法などは「KintoneManager」を公開されている記事Qiita Tip: kintone とGoogle Apps Script連携に記載されています。

Gmailからリターンメールを特定しアドレスを取得する

次に、GASを作成していきます。まずはGmailからリターンメールを特定する処理を作成します。

//リターンメールのメールアドレス取得(subject:件名、from:送信元)
//何日前までのメールを検索するかを指定する。→newer_than:〇〇d
  const query = 'newer_than:1d subject:"Mail Delivery Subsystem" OR from:"mailer-daemon"'
//max件数は500件
  const start = 0;
  const max = 500;
 
  const threads = GmailApp.search(query, start, max);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
  const email = [];

//getToでメッセージの受信者をコンマで区切って取得
  for(const messages of messagesForThreads){
    const message = messages[0];
    var record = message.getTo();

//Gmailから取得したアドレスについている<>の記号を取る
    if (record !== ""){
      var str = record;
      var maile = str.replace(/</,"");
      var maile2 = maile.replace(/>/,"");
      email.push(maile2);
    }
  }

定数queryにリターンメールの件名や送信者を設定します。今回は下記表の演算子を用いて、リターンメールのよく見る件名「Mail Delivery Subsystem」や送信者「mailer-damon」を設定いたしました。また、何日前までのメールを検索するのかを「newer_than:」などの演算子で指定することもできます。Gmailを検索する際に使用する演算子は他にも多くありますので、Gmailのヘルプでご確認ください。

newer_than:日(d)、月(m)、年(y)で期間を指定して、それより新しいメールを検索
subject:件名に含まれる単語を指定する
from:送信者を指定する
メールを指定する演算子

また、定数startに何件目から検索するか、定数maxにGmailを検索する件数を設定します。一日に検索できる件数は、無料版のGmailを使用している場合1日20000件までとなっておりますので、お気を付け下さい。(メールサーバーによってもメールの配信数などに上限があることがありますので、ご注意ください)

定数を設定したら、下記の関数でGmailを検索します。

  const threads = GmailApp.search(query, start, max);

すると、定数threadsにqueryの条件に合致したメールの全スレッドを取得することができます。その全スレッドの中に含まれるメッセージをまとめて取得するには、下記の関数を使用します。

const messagesForThreads = GmailApp.getMessagesForThreads(threads);

messagesForThreadsには取得したメールが二次元配列状に格納されます。そのため、リターンメールが返ってきたメールアドレスを取得するためには、for文で繰り返し検索しgetTo()メソッドでメールアドレスを取得します。

取得したメールアドレスは<aaaa@xxxx.jp>のような形になっているため、括弧を取り除きアドレスのみを取得するため、replaceメソッドで括弧を削除します。

連携するkintoneの情報を指定する

GASに連携するkintoneの情報を指定します。

const subdomain = "kintoneのサブドメインを指定";
  
//アプリID、アプリ名、APIトークンを指定
const apps = {
YOUR_APPLICATION: { appid: アプリID, name: "アプリ名", token: "kintoneAPIトークン" }
};
const manager = new KintoneManager.KintoneManager(subdomain, apps);// ライブラリの初期化

それぞれの定数に指定するkintone情報は以下になります。

subdomainkintoneを開いたときに出てくるURL「https://xxxxxxxxx.cybozu.com/A/#/portal」の「xxxxxxxxx」を指定。
appid更新したいアプリを開いたときのURL「https://xxxxxxxx.cybozu.com/a/3/」の「3」を指定。
nameアプリ名を指定。
tokenkintoneのAPIトークンを指定。APIトークンの生成方法はkintoneヘルプに記載されています。
今回は検索と更新を行うため、レコード閲覧・レコード編集ができるものにしてください。
定数に指定するkintone情報

指定したkintone情報を初期化したKintoneManagerのライブラリに設定します。

kintoneと連携しメールアドレスを検索する

function searchRecords(manager,email){
  const query = 'メールアドレスのフィールドコード = "' + email + '"';
  const response = manager.search("YOUR_APPLICATION", query);
  const content = JSON.parse(response.getContentText());
  const records = content.records;
  return records;
}

上記関数searchRecordsがメールアドレスがkintoneに存在するかを検索する処理になります。searchRecordsを呼ぶ際にkintone情報を指定した定数managerと検索対象のメールアドレスを連携します。

const query = 'メールアドレスのフィールドコード = "' + メールアドレス + '"'

上記の定数queryにkintoneでメールアドレスを登録しているフィールドのフィールドコードと検索したいメールアドレスを設定します。その情報を元にkintoneを検索します。

const response = manager.search("YOUR_APPLICATION", query);
const content = JSON.parse(response.getContentText());

上記の処理でkintoneから指定したメールアドレスのレコードを検索後レコードを取得します。取得したデータはJSONデータであるため、JSON.parse()メソッドを使用してGASで読み込めるデータの形にします。

kintoneを更新する

kintoneを検索して、メールアドレスが存在する場合kintoneを更新します。弊社で使用しているkintoneのリターンメールのフラグのフィールドはチェックボックスを使用し、「リターンメールあり」と設定しています。下記処理もチェックボックスを更新するものになります。

 for (var i = 0; i < email.length; i++){
  //メールアドレスがレコードに存在するか調べる
    var records =  searchRecords(manager,email[i]);
    let code, record2;
    if(records.length !== 0){
          record2 =[{
            "updateKey":{"field":"メールアドレスのフィールドコード", "value":email[i]},
            "record":{
            "チェックボックスのフィールドコード":{"value":["リターンメールあり"]}       
            }
          }];
          code =  editRecords(manager, record2);
    }
    //コードが200だと成功
    console.log(code);
 }

リターンメールがあったメールアドレス一つずつにkintoneを検索し存在した場合、kintoneの更新処理を行っていきます。

     if(records.length !== 0){
          record2 =[{
            "updateKey":{"field":"メールアドレスのフィールドコード", "value":email[i]},
            "record":{
            "チェックボックスのフィールドコード":{"value":["リターンメールあり"]}       
            }
          }];
          code =  editRecords(manager, record2);

上記の処理では、メールアドレスで検索し取得したkintoneのレコードがゼロ件ではない場合、リターンメールフラグのチェックボックスの更新内容を設定してkintoneの更新を行います。「メールアドレスのフィールドコード」「チェックボックスのフィールドコード」と記載があるところにメールアドレスとチェックボックスのフィールドコードを指定してください。

更新する内容の設定は以下になります。

updateKeyレコードを特定できるキーとなるフィールドを設定します。今回はメールアドレスを設定しています。設定する内容は以下になります。
“field”:”メールアドレスのフィールドコード”, “value”:メールアドレス
record更新するものを設定します。今回設定する内容は以下になります。
“チェックボックスのフィールドコード”:{“value”:[“チェックを付けたい内容”]}
設定内容

更新内容を設定後、下記の更新処理editRecordsを呼び出します。

//編集(更新)
function editRecords(manager,records){
  const response = manager.update("YOUR_APPLICATION", records);
  const code = response.getResponseCode();
  return code;
}

呼び出す際には、検索のときと同じようにkintone情報を指定した定数managerと、更新したい内容を設定したrecordsを連携します。更新処理が成功したかどうかをコードの値で返答します。コードの値が200の場合は成功になります。

kintone画面での確認

ご紹介した処理を動かすと下記のようにkintoneのアプリにリターンメールのフラグが立つようになります。

リターンメールのフラグ