Quantcast
Channel: WFU BLOG
Viewing all articles
Browse latest Browse all 571

FB 社團如何篩選貼文通知﹍操作 Google Apps Script 定時過濾 Gmail 郵件

$
0
0
相信每個人加入的 FB 社團都很多,但不見得每篇新貼文都有興趣看,主要也是時間不夠。如果能篩選出有興趣的貼文才收到通知,就能節省相當多時間。 如果是 FB 社團管理員,官方提供了「關鍵字提醒」的功能,但一般社員無法享受這個福利。 以下的「基本作法」是一種常見思路:
  • 參照「訂閱FB社團通知郵件」→「二、Facebook 設定」,可將 FB 社團所有新貼文寄到 Gmail
  • 在 Gmail 設定關鍵字篩選
這個流程對於多數情況已經很夠用了,能夠接受的話可以不用看本篇的作法。而本篇的 Google Apps Script(以下簡稱 GAS) 解決方案,主要能改善以下幾點:
  • Gmail 篩選器如果關鍵字只設定「一個中文字」時,會漏掉許多郵件,代表篩選器的關鍵字必須為設定「兩個中文字」以上,形成一個詞彙,才能精確篩選。
  • 如果 Chrome 有安裝「Gmail 檢查新信」這類套件,FB 社團新郵件通知可能還是很頻繁,會打擾工作頻率。
  • 使用 GAS 可定時檢查 Gmail,每隔一段時間才統整相關郵件,並寄發通知,讓我們在指定時間才接收 FB 社團新貼文。
(圖片出處: unsplash.com)

一、原理說明

1. 操作流程接續「基本作法」的流程:
  • 在 Gmail 篩選器,針對 FB 社團寄來的新貼文郵件,「標上星號」,並「標示為已讀取」,如此 Chrome 套件就不會頻繁通知有新郵件
  • 在 GAS 寫程式,讀取所有「標上星號」郵件的內容,與自行設定「關鍵字」進行比對
  • 所有符合的郵件整合成一封郵件,寄到指定 Gmail 信箱
  • 將所有處理過的郵件移除星號
  • 依照需求設定排程,例如每 n 小時執行一次程式,或是每天指定時刻執行,如此只有固定時刻會收到篩選後的郵件內容
2. GAS 說明文件過去在「使用 Gmail API 寄信的簡易管道」曾經說明,操作 Gmail API 是非常難搞的一件事,最方便的處理管道還是交給 GAS,因為 GAS 提供了一個 GmailApp 服務,可以用最無腦的方式寄送 Gmail 郵件。 以下提供操作 GmailApp 需要瞭解的官方文件: 根據官方文件,使用 GmailApp 的額度一天可寄 100 封郵件,可讀取 20000 封郵件,每封郵件內容最多 200KB。

二、範例程式碼

以下為 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 相關文章:

Viewing all articles
Browse latest Browse all 571

Trending Articles