弊社では新規顧客開拓管理にkintoneを使用しており、メールワイズと連携させてkintoneから一斉にメールを送っています。その際リターンメール(宛先不明メール)が返ってきて使用できないアドレスがあった場合、今後メールを送らないようにkintoneにフラグを立てています。大量のリターンメールが届いた際に手間を省くため、GASを使用してリターンメールが届いたら自動で、kintoneのアプリにフラグを立てるようにしました。今回はその方法をご紹介いたします。
目次
他のアカウントのメールをGmailにPOPで取得する
GASを使用するため、メールはGmailを利用しました。Gmailにはgmail.com以外の他のメールサービスのアカウントからメールを受信する機能が用意されていますので、その機能を使用いたします。元々Gmailを使用している方はこの作業は必要ありません。設定方法はGmailのヘルプに記載されています。
kintoneのメールアドレスを重複禁止にする
今回はkintoneをGASから検索、更新する際にメールアドレスをキーとして使用するため、メールアドレスは重複禁止にする必要があります。
下記のメールアドレスのフィールドの設定画面で一番下の「値の重複を禁止する」にチェックを入れていただければ、重複禁止の設定になります。
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情報は以下になります。
subdomain | kintoneを開いたときに出てくるURL「https://xxxxxxxxx.cybozu.com/A/#/portal」の「xxxxxxxxx」を指定。 |
appid | 更新したいアプリを開いたときのURL「https://xxxxxxxx.cybozu.com/a/3/」の「3」を指定。 |
name | アプリ名を指定。 |
token | kintoneのAPIトークンを指定。APIトークンの生成方法は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のアプリにリターンメールのフラグが立つようになります。