2012年9月21日 星期五

PHP 自動發信程式

之前為了發 COSCUP 的通知信,參考網路上的範例用 PHP 寫了個小程式。我把範例程式放在這個 gist 上:https://gist.github.com/3135053

其實明顯看得出來,程式沒什麼架構,純粹只是為了可以 work 而寫的拋棄式程式。不過丟出來一方面可以當自己的筆記,以後要找比較好找,另一方面,也許另一個人想要寫類似的小玩具的時候就可以參考了 :P

以下是一些簡單的介紹。

我使用這個程式的狀況是,我需要寄一封信給很多人,而我又希望每個人收到的信,收件者只有自己,而且信件開頭還會寫上他的名字,這樣比較貼心。所以沒辦法用「寄給自己 and BCC」的方法達成,只好透過程式完成。

這個小程式實際上是透過一套稱為 PHPMailer 的 library 做真正的寄信動作,所以困難的部分都被它做走了!我們只要把該設定的東西設定一下就差不多。要設定的項目大概有這些:

  • SMTP server 資訊 (主機、port、認證方式...等)
  • 登入資訊 (我使用 Gmail 寄信,所以需要登入)
  • 寄件者與收件者資訊
  • 信件資訊 (標題與內文)
在我這邊,每封信不同的地方只有收件者與內文,所以我會每次重新產生並設定,其餘部分都在最前面寫死。

收件者與內文的部分,我是先將收件者名單從 Google Spreadsheets 中匯出成 .tsv 檔 (因為比較容易 parse),再直接讀入。這個寫在 function parse_name_list_tsv($filename) 中。然後用一個自己刻的簡單 template tool (function fill_template($content, $data), 才 4 行XD) 去加上 user-specified 的資料,最後送信收工!

一些有趣的小細節:
  • 忘記為什麼了,我一開始跑起來會出現跟時區有關的錯誤,所以必須加上 date_default_timezone_set('Asia/Taipei'); 來避免這個問題
  • 因為我的 Google Account 有開啟兩階段驗證 (2-Step Verification),而我們這種小工具當然不可能支援,所以要為我們的程式特別創造一組應用程式密碼,才能正常使用喔!
  • 一開始不小心抓到舊版的 PHPMailer,它有個 bug 就是,CC 的人會變成 BCC (或是反過來...我忘了),所以我直接從它的 source code 裡找到有問題的那段修掉了 (open source rocks!),不過還是不太確定是不是我使用錯誤。結果後來發現有新版 PHPMailer,就特別關注了一下這個問題,發現已經被修掉了XD 修的方法一樣....哈!
  • 因為 PHPMailer 新增收件人的 API 是 AddAddress(),所以要注意,要更改收件人的話必須先執行 ClearAddresses(),否則收件人清單會一直長....(好險我在正式寄信前的測試就發現這個問題...orz)
大概...差不多是這樣吧!突然有點佩服自己,一點小東西也可以囉嗦這麼多,哈哈....

沒有留言:

張貼留言