顯示具有 mail 標籤的文章。 顯示所有文章
顯示具有 mail 標籤的文章。 顯示所有文章

2024年3月27日 星期三

PHP 開發筆記 - 使用 Docker 在 Ubuntu 22.04 和 PHP 8.1 架設 osTicket v1.18.1 環境,研究 Mail Parser 流程

接續上篇追蹤 osTicket 信件處理流程的筆記,這次用 Docker 包裝可運行和測試的獨立環境,主要採用 Ubuntu 22.04 與 PHP 8.1,並且規劃方式,建構出備份原始信件的架構,以及可反覆解析信件的流程。

首先是 Dockerfile ,主要設計從 GitHub.com 取出 v1.18.1.zip 並解壓縮 /var/www/osticket-v1.18.1,其餘是安裝相關套件和資料庫的帳號建立等等,最後再把 MySQL, PHP-FPM 和 nginx 運行起來,並預設把 nginx logs 寫到 stdout 觀看:

RUN wget https://github.com/osTicket/osTicket/releases/download/v1.18.1/osTicket-v1.18.1.zip -O /tmp/osticket.zip \
    && unzip /tmp/osticket.zip -d /var/www/ \
    && mv /var/www/upload /var/www/osticket-v1.18.1 \
    && cp /var/www/osticket-v1.18.1/include/ost-sampleconfig.php /var/www/osticket-v1.18.1/include/ost-config.php \
    && chown -R www-data:www-data /var/www/osticket-v1.18.1 \
    && rm /tmp/osticket.zip

...

RUN service mysql start && \
    mysql -e "CREATE USER 'developer'@'%' IDENTIFIED BY '12345678';" && \
    mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'developer'@'%' WITH GRANT OPTION;" && \
    mysql -e "CREATE DATABASE osticket_dev CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" && \
    mysql -e "GRANT ALL PRIVILEGES ON osticket_dev.* TO 'developer'@'%';" && \
    mysql -e "FLUSH PRIVILEGES;" 

...

CMD service mysql start && service php8.1-fpm start && service nginx start && tail -f /var/log/nginx/access.log /var/log/nginx/error.log;

接下來更動 include/class.mailfetch.php 檔案,讓他下載信件時,可以存一份在 /tmp 方便後續使用:

@file_put_contents("/tmp/debug-mail.$i", $this->mbox->getRawEmail($i));

最後,弄一隻 api/cron-dev.php 檔案,可以指定 RawMail 的格式路徑,從指定位置讀進來解析信件,如此靠 api/cron-dev.php 就可以輕鬆不斷實驗 MIMEDecode 流程:

# php api/cron-dev.php 
[INFO] Input: /tmp/debug-mail
[INFO] Input File not found

# php api/cron-dev.php /tmp/debug-mail.1
[INFO] Input: /tmp/debug-mail.1
Ticket Object
(
    [ht] => Array
        (
            [ticket_id] => 2
            [ticket_pid] => 
...
            [lastupdate] => 2024-03-27 21:35:52
            [created] => 2024-03-27 21:35:52
            [updated] => 2024-03-27 21:35:52
            [topic] => 
            [staff] => 
            [user] => User Object
                (
                    [ht] => Array
                        (
                            [id] => 2
                            [org_id] => 0
                            [default_email_id] => 2
                            [status] => 0
                            [name] => UserName
                            [created] => 2024-03-27 21:35:52
                            [updated] => 2024-03-27 21:35:52
                            [default_email] => UserEmailModel Object
                                (
                                    [ht] => Array
                                        (
                                            [id] => 2
                                            [user_id] => 2
                                            [flags] => 0
                                            [address] => user@example.com
...

2015年12月31日 星期四

使用付費版騰訊企業郵箱以及從 Microsoft Exchange server 轉移心得

騰訊企業郵箱-付費版功能

由於公司有超過一半的人在中國,過去一直請 IT 人員維護 Microsoft Exchange Mail server,而 2016 年有了新計劃,公司服務雲端化!其中 Mail service 是一塊非常令人頭痛的問題,但責任扛起來就不重,只好硬著頭皮衝了!原先規劃十一月進行,因故延至十二月,而真正執行是十二月中,原先把測試期間拉到一個月,但發現新舊帳號在一起造成同事們不少困擾,所以加速處理,在 2015/12/31 大家還忙著修 bug、業務忙著關帳、老闆趕著出新版軟體的當下,終於完成轉換。

原本心中的首選是想要用 Gmail for Work,但實在是有太多人在中國生活,存取太不靠譜,所以進而挑中國第一大咖的服務:騰訊企業郵箱,簡單的概念:QQ 這麼大咖,不太會倒,它倒了全中國的郵箱也倒光了!

騰訊企業郵箱-免費版

起初,公司已經有在使用騰訊企業郵箱免費版好一陣子了,免費版跟付費版差只差在進階功能,例如郵件稽核、管理這類服務,若只是單純有個 Webmail 收發肯定夠用的。打個岔一下,有興趣可以試試免費使用,預設應該有 50~100 個帳號,並且最多可以申請到 200 個免費帳號的額度。 而付費版的差別,包括可以一次管理多個網域(最多五個),以及一卡車的增值功能。

那談談如何從 Microsoft Exchange Server 移轉過去,這可真不是普通的蛋疼。首先,要是用騰訊企業郵箱時,騰訊企業郵箱會先檢驗某個 domain 是不是您擁有,既然跟 mail 相關,最直觀就是 MX Record 的設定,但對於已經營運的郵箱是根本不能停的,為了這個我跟客服吵了很久 XD 整體上沒有驗證的話,所建立的帳號是完全不能登入的!為了轉移勢必需要先讓公司同仁登入,也因此下了決定,該衝了!最大的傷害就是 MX Record 切換到騰訊後,若有人要寄信給公司同仁,信件會跑去騰訊企業郵箱(在這之前當然要先完成帳號的建立,不然騰訊企業郵箱會以帳號不存在,不給寄而退信)。所幸老闆們很支持也接受這個風險,就衝啦!我先請 IT 人員調出公司收郵件最少的時段,接著在轉換前幾天先把 MX Record 的 ttl 設小,最後就快速轉換,做完騰訊郵箱驗證,再轉回舊的。

原先我打好的如意算盤:騰訊企業郵箱認證成功,成員可以登入試用,而舊信箱(exchange server)還是可以工作,真是完美啊!

但沒一個小時我就發現問題了:所有委託騰訊企業郵箱管理的信箱(例如abcd.com),該公司的成員要寄信到敝公司時,走的是騰訊企業郵箱的 SMTP server,而寄信路徑最佳化的結果,就是被騰訊企業郵箱收走!

這是一個滿嚴重的問題,代表信件部分會被騰訊企業郵箱收走,而乖乖看 MX Record 會被舊 exchange server 收走,也是這個關鍵因素,讓我把測試期從一個月縮短至兩個禮拜(原先想要一個禮拜,但因為有其他問題而延後)。騰訊企業郵箱真的很大咖,不少公司、新創都採用他,再加上 qq.com 也是他的!所有 @qq.com 寄信來問問題、橋接業務的,也完完全全被騰訊企業郵箱收走,因為我們在那驗證了 MX Record,騰訊企業郵箱會認定這 domain 由他接手處理。

在認清環境後,開始不斷號召同仁盡快試用,接著開始碰到奇奇怪怪的問題:
  • outlook 20010 以下,會碰到檢視憑證的問題?
  • 同仁都習慣用 outlook ,那聯絡人該怎樣同步?
  • 公司有高規格單位,防火牆包得緊緊的,怎樣用騰訊企業郵箱?
其中最難處理的是防火牆問題,曾經也有一度要自架 mail server,最後透過管理機制討論再討論,解套了!這個影響是:採用各大 mail service 時,其 smtp/pop/imap server 一定都是用認得那幾組,無論騰訊企業郵箱、Office 365還是 GMail 等,將造成想要管理同仁寄信的安全機制出現了漏洞,例如某同仁只要申請個 a123.com 後,把郵箱也交給騰訊企業郵箱代管,那 a123.com 跟敝公司的 smtp server 基本上是同一組的,完全無法限制同仁外寄信件的。

所以花了將近一週是在做溝通,包含提出 mail reply 架構等(類似多架一台 smtp server,而帳號認證可以走騰訊企業郵箱 pop protocol),所幸最後解套,大家認同有這個風險 XD 我就省去架設及多管理一台機器。但一週就過去了 Orz 接下來就是趕緊處理剩下兩個問題

首先是 outlook 檢視憑證問題,單純只是 outlook bug 而已,解法就是試著更新 outlook 吧!例如 outlook 2007 就裝一下 outlook 2007 sp3。這是因為騰訊企業郵箱在多網域上只用了一組憑證(pop.exmail.qq.com, imap.exmail.qq.com, smtp.exmail.qq.com, hwpop.exmail.qq.com, hwimap.exmail.qq.com, hwsmtp.exmail.qq.com),而 outlook 不支援而已。

接著處理聯絡人同步部分,只需把公用聯絡人打開,同仁寄信時就有自動搜尋補齊信箱的功能,而騰訊企業郵箱有提供 outlook 助手,透過 outlook 助手會自動從騰訊企業郵箱下載聯絡人清單並匯入 outlook 中,也就是 outlook 通訊錄可以繼續用,經測試 outlook 2007 必須更新至 sp3 才能完整使用!若使用 outlook 2013 的使用者,可以試試 activesync 協定,也能同步聯絡人

以上算是完成九成的任務了!剩下的則是佛心來的客服服務,負責做 mail server 轉移,不知不覺就會扛上了管理 mail server 責任。

整個移轉的簡易 SOP:
  1. 請 IT 人員會出聯絡人清單
  2. 撰寫程式將聯絡人清單轉成 CSV 可匯入騰訊企業郵箱(過程包括要製作亂數密碼,但密碼格式有錯時,批次匯入不會告知,有同仁登入不進去時,記得幫他改密碼)
  3. 請 IT 人員給予一天哪個時段收信量最少,將進行 MX Record 的快速轉換,用以認證網域擁有者,完成認證後同仁才能登入 webmail 試用
  4. 請同仁儘速登入使用,並告知會有部份郵件被騰訊企業郵箱收走,在測試期間請新舊信箱都要收信
  5. 協助同仁使用,包含解決 outlook 常見問題,或是請他們直接用騰訊維護的 Foxmail
  6. 時機一到時,直接把 MX Record 切換至騰訊企業郵箱,並設置 TXT Record - spf 的部分,降低騰訊企業郵箱寄出信被誤判成垃圾信
  7. 可以嘗試把舊的 smtp server 關閉,或是限制成員發送的能力(例如信件大於1kb無法寄出),進而半強迫同仁轉用騰訊企業郵箱 smtp server
最後,聊點題外話,其實兩年前也差點用 Mail service 這個題目創業,在學生時代我也開發過 mail app 的,這其中的辛酸血淚說都說不完,而讓我想起這件事是因為 Foxmail !我翻了wiki跟百度,才知道這一開始也是一人開發的,就像 openwebmail 吧 :P 負責開發 Foxmail 的是張小龍,一位 1969 年次的高手,釋出三年後就被公司以 1200萬買走,但最猛的是後來被騰訊收購,以及張小龍後續要開發了 QQMail 以及炙手可熱得微信,是的,他是微信創辦人,更是騰訊副總裁。此外,跟生活在中國的朋友閒聊,更能體會騰訊企業郵箱的恐怖,姑且不論費用的便宜,其實還滿多搬的出檯面上的使用者,例如不少學校採用,如北京大學、深圳大學、上海也有,一個單位開的帳號破萬也都很正常,更別說....還有100k的。不禁回想起當年想拿 mail service 創業,還想說該怎樣打入中國生態這件事,真的...還是要先把市調做好 XD 以及中國生態圈中微信佔了很大很大的一部份,而騰訊企業郵箱又可以跟微信無縫結合,這股氣勢真的非常強。

經過這次深度接觸騰訊企業郵箱的經驗,中國的領域真的很威,若不是生活在當下的人,真的很難有所突破,有興趣的,大概可以參考這篇:PTT China_travel [心得] 來到中國你會需要什麼App

其他參考資料:

2015年10月27日 星期二

透過 Google Analytics - Measurement Protocol 追蹤 IOT、Email 開信率等

雖然很多東西都建立在 Android 上,但總是有純 Unix 的環境,這時就用用 Google analytics (GA) 的 REST API 了 XD 這東西用途很廣,因為它可以偽裝成 image ,例如 <img src="//www.google-analytics.com/collect?...">,甚至可以用在 EDM 等等的(雖然 Email 常常預設把遠端資源關閉) ,此例,我們專注在 IOT 上,而測試方式只要用用 cURL 即可,十分便利。

由於是 IOT 角色,須留意 GA 的資源限制:https://developers.google.com/analytics/devguides/collection/protocol/v1/limits-quotas

  • 10 million hits per month per tracking ID
  • 200,000 hits per user per day
  • 500 hits per session not including ecommerce (item and transaction hit types).

總之,用法都很簡單,叫 IOT 定期打卡即可,最重要的工作項目反而是定義產品的使用情境,把那些狀態定義好後,當作 web page 來呼叫 Google Analytics API 吧!

簡易範例:

$ curl 'https://www.google-analytics.com/collect?v=1&t=screenview&tid=TRACKING_ID&an=YOUR_APP_NAME&cid=CLIENT_ID&cd=YOUR_PRODUCT_STATE'
GIF89a?????


其中範例回應的就是一張 GIF 圖檔,而更多應用請參考 https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters ,若一直試不出來,可以用 https://ga-dev-tools.appspot.com/hit-builder/ 偵錯看看。