相信每個人加入的 FB 社團都很多,但不見得每篇新貼文都有興趣看,主要也是時間不夠。如果能篩選出有興趣的貼文才收到通知,就能節省相當多時間。
如果是 FB 社團管理員,官方提供了「關鍵字提醒」的功能,但一般社員無法享受這個福利。
以下的「基本作法」是一種常見思路:
- 參照「訂閱FB社團通知郵件」→「二、Facebook 設定」,可將 FB 社團所有新貼文寄到 Gmail
- 在 Gmail 設定關鍵字篩選
- Gmail 篩選器如果關鍵字只設定「一個中文字」時,會漏掉許多郵件,代表篩選器的關鍵字必須為設定「兩個中文字」以上,形成一個詞彙,才能精確篩選。
- 如果 Chrome 有安裝「Gmail 檢查新信」這類套件,FB 社團新郵件通知可能還是很頻繁,會打擾工作頻率。
- 使用 GAS 可定時檢查 Gmail,每隔一段時間才統整相關郵件,並寄發通知,讓我們在指定時間才接收 FB 社團新貼文。
一、原理說明
1. 操作流程接續「基本作法」的流程:- 在 Gmail 篩選器,針對 FB 社團寄來的新貼文郵件,「標上星號」,並「標示為已讀取」,如此 Chrome 套件就不會頻繁通知有新郵件
- 在 GAS 寫程式,讀取所有「標上星號」郵件的內容,與自行設定「關鍵字」進行比對
- 所有符合的郵件整合成一封郵件,寄到指定 Gmail 信箱
- 將所有處理過的郵件移除星號
- 依照需求設定排程,例如每 n 小時執行一次程式,或是每天指定時刻執行,如此只有固定時刻會收到篩選後的郵件內容
- 操作說明:Gmail Service
- 搜尋參數:可搭配 Gmail 使用的搜尋運算子
- 使用額度:Google 服務的配額
二、範例程式碼
以下為 GAS 範例程式碼,修改參數請參考註解說明:function filterEmail() {
var receiver = "xxx@gmail.com", // 收件者郵件
subject = "FB 社團篩選郵件", // 郵件標題
keyword = ["關鍵字1", "關鍵字2"], // 所有要篩選的字串
from = "facebookmail.com", // 寄件者網域
query = "is:starred from:(" + from + ")", // 搜尋參數 篩選標記星號、從 FB 寄來的郵件
quota = 200000, // 郵件大小上限 200k
threads = GmailApp.search(query), // 搜尋符合條件的郵件
l = threads.length, // 郵件數量
html = "", // 寄出的郵件 html 內容
i = 0,
serial = 0,
newHtml, thread;
// 沒有郵件則不處理
if (!l) {
return;
}
for (i; i < l; i++) {
thread = threads[i];
// 篩選郵件 html 內容
newHtml = getHtml(thread);
// 內容超過郵件大小上限時 分批寄出信件
if ((html + newHtml).length > quota) {
serial++;
sendMail(html, serial);
html = newHtml;
} else {
// 沒超過時 多封郵件內容整合為一封
html += newHtml;
}
// 郵件移除星號
GmailApp.unstarMessages(thread.getMessages());
}
// 寄出整合後的郵件
if (html) {
serial++;
sendMail(html, serial);
}
// 取得郵件 html 內容
function getHtml(thread) {
var message = thread.getMessages()[0],
from = message.getFrom(), // 寄件者
subject = message.getSubject(), // 郵件主旨
body = message.getBody(), // 郵件 html 內容
plainBody = message.getPlainBody(), // 郵件純文字內容
html = "",
i;
// 篩選關鍵字
for (i in keyword) {
// 內容可根據自己需求 選擇使用 body 或 plainBody 來產生
if (body.indexOf(keyword[i]) > -1) {
html += "寄件者:" + from + "<br/>";
html += "主旨:" + subject + "<br/>";
html += "內容:" + body + "<br/><br/><br/>";
return html;
}
}
return html;
}
// 寄出郵件
function sendMail(html, serial) {
var date = Utilities.formatDate(new Date(), "GMT+8", "yyyy-MM-dd HH:mm"), // 日期格式化
subject_date = subject + "" + date + "-" + serial; // 組合信件標題 加上日期及序號
// 寄信
MailApp.sendEmail({
to: receiver,
subject: subject_date,
htmlBody: html
});
}
}
三、補充說明
1. 授權第一次執行 GAS 程式碼時,因為取得 Gmail 郵件需要權限,請參考「製作可執行 GAS 指令碼的圖片按鈕」→「三、撰寫 Apps Script 指令碼」的流程進行授權。 2. 排程執行程式碼 GAS 設定排程自動執行的操作,可參考「排程抓證交所台股交易資料」→「五、設定排程」。更多 Google Apps Script 相關文章: