Post by Email
for Pulse CMS
2016/12/16
at Pulse CMS Meetup in Osaka
刀祢邦芳(Tone, Kuniyoshi)
自己紹介
● ITエンジニア歴42年
○ IBMメインフレーム→Windows→UNIX→Web
● 現在の仕事ではOSSと安価な商用ソフトがメイン
○ Tableau
○ Office365, Power BI with Azure(安価ではないが・・)
○ Pentaho (Spoon)
○ Zabbix & OpManager
○ PHPRunner
○ WinAutomation
○ Redmine, Magento など少々 ● CMS遍歴
○ Zope & Plone
○ XOOPS
○ Nucleus
○ WordPress
○ Drupal 6, 7, 8
○ Gatsby
紹介記事 https://goo.gl/axUFsD 
● そして・・・Pulse CMS
● 言語遍歴
○ Powershell, bash, awk ...
○ JavaScript, Google Apps Script
○ COBOL, FORTRAN, PL/1, Basic
○ マクロ・アセンブラ(6502, System/370)
○ Elixir 勉強中
○ PHPは見よう見まね
○ Java,C,C#,VB,PHP,ruby,python,Perlはあん
まり使ってません
● JS Framework遍歴
○ Meteor
○ React
○ Riot 勉強中
● DBMS遍歴
○ Sybase
○ MS SQL
○ MySQL
○ Snowflake
やりたいこと
● Drupal 7で作った同窓会掲示板サイトの移植
○ メンバー個人のアカウントでログインして投稿・閲覧する人はごく少数
■ ログインの殆どがゲストアカウントで閲覧のみ
○ だから、メール投稿&新着配信機能も追加(これが大変だった)
○ 今もバグがあるけど修正は困難だし、 Drupalのアップデートも頻繁で面倒
● 結局メール投稿&配信がメインでおまけとして過去ログの閲覧検索ができればよ
い
○ 保守のためログインするのは管理者だけ
○ その他のメンバーは全員共通の Basic認証でも可
○ セキュリティが強固な静的サイトに近いものを公開したい
○ メールを記事に変換し易いように1記事1ファイルがよい
● Pulse CMSがぴったり
○ 完全なGeneratorの「Gatsby」も面白そうだがReactベースなのでカスタマイズは難しそう
本番システム構成
● Windows 2012 Server on VPS(by Contabo https://contabo.com )
○ 全員65才以上の同窓生のため私以外に Linuxを使いこなせる人は見当たらない
○ Windows PCの延長としてRemote Desktopで操作できるサーバーなら誰かに引き継げる
● Bitnami WAMP Stack (MySQLは不要だが) + Pulse CMS V4.6
● Node.js V6.6
○ 勉強を兼ねて、受信メールからブログファイルの作成に使用
● Talend Open Studio(無償)
○ GUIで種々のバッチ処理が作成できるので保守しやすい
○ まずはメール送信や Google SpreadsheetのAPIを使う予定
○ 将来の引き継ぎを考えて今後は極力これを使用する
★でも本当はNode.js版をGithub公開したい(将来の夢)
・4 core
・12 GB RAM
・300GB SSD
・100 Mbps
・14.98 € /Month
デモ
● 本日はlocalhostでデモ
● Blog 表示 http://localhost:8081/pulse/blog
● Admin画面 http://localhost:8081/pulse/admin
● 受信メールを未読に設定
● 受信用バッチの起動
○ もう一度起動すると未読がゼロなので何も処理されない
● Blogに1件新規投稿されている
処理の流れ「未読メールの取得と投稿」
● 「inbox」モジュールを用いて、
○ 受信ボックスから未読メールを 1件だけ取得し、メールのソースをファイル出力
○ そのメールを既読とする
● 「mailparser」モジュールを用いて、
○ メールソースを解析
○ 件名、送信日付、送信者アドレス、本文( HTMLまたはTEXT)、添付ファイルを取得
● Pulse CMSのブログファイルのテンプレートを読込む
○ テンプレート内のキーワードを件名などで置換したテキストを Pulse CMSのcontent/blogに書き込
む
○ 添付ファイルは別途保存し、リンクを本文の末尾に追加する(これは現在未完)
● Pulse CMSは追加されたファイルをすぐに認識し、ページリフレッシュでブログの
ページに表示してくれる。本文はHTMLでもよい。
<素晴らしい!>
inbox による処理
● user & passwordを与えてIMAPサーバ(ここではGmail)に接続
○ でもuser & passwordをソースに埋め込むのは良くないので
● searchメソッドで未読メールのUIDを取得
● fetchdataで該当UIDのソースを取得
● ソースをmail.txtに書き込む
○ ファイルを経由せずブログ投稿まで一気に処理もできるが単体テストしやすいようにファイルをインタ
フェースとする
(Node.jsは基本が非同期なのでこれらを順番に同期して処理するのが実は面倒です)
var client = inbox.createConnection(false, 'imap.gmail.com', { // gmail接続
secureConnection: true,
auth: {
user: process.argv[2], // node実行時の第2パラメータ
pass: process.argv[3] // 第3パラメータ
}
});
ブログ用テンプレート
#title#
#date#
#datetime#
投稿者 #from#
#body#
mailparserによる処理
● テンプレートblogtemplate.htmlをstringに読込む
● mail.txtにあるメールのソースをstringに読込み、
mailparserオブジェクトに渡し、解析させる
● 解析終了時に作成されるmail_object内の、
○ subject, headers.date, headers.fromをテンプレート内の#title#などの文字列と置換
○ mail_object.htmlをテンプレート内の#body#と置換
(undefinedならばmail_object.textを使用)
● 作成されたブログ用文字列をPulseのcontent/blogフォルダーに出力
○ ファイル名は
「プレフィックス」+「連番」+yyyymmdd-hhmmss.txt
○ 最終的にはこのプレフィックスをキーにして投稿通知メールへの返信をコメントとして追記する予定
苦労&工夫したところ
● ブログに投稿日時まで表示させる
○ config.phpを修正しデフォルトの日付を非表示にする
○ テンプレートの#datetime#文字列をyyyy/mm/dd hh:mmで置換
● Node.jsでの同期処理
○ 単純に順番に処理を実行していくのが実は面倒
● Mail Parserでのiso-2022対応
○ 簡単な対応法があるので今後対応
// BLOG
$result_per_page = 5; // Blog posts per page
$disqus_comments = false; // Turn on/off blog comments (Disqus)
$disqus_shortname = "sample-name"; // Your disqus account name
// $date_format = "M j, Y"; // More: https://php.net/manual/en/function.date.php
$date_format = " "; // More: https://php.net/manual/en/function.date.php // date is not displayed
今後の予定
● 投稿者のメールアドレスのチェック
○ 名簿データベース(Google Spreadsheet使用)との存在チェック
● 投稿メールをメンバーに送信する
● リプライをコメントと見なして本文に追加する
● URLをファイル名のみにする(このカスタマイズ機能追加希望)
○ 日本語の件名がURLにあるのは若干不安
○ ファイル名に時分秒まで持たせるので重複はまず発生しない
● 別途目次ページを作成する
○ Pulse CMSがページナビゲーション対応しても数百ページのナビゲーションは大変
○ それよりは数百行が 1ページになった目次ページを作る
○ 1ページにするとタイトルや日付検索はとりあえずブラウザで可能になる
● 全文検索
● 一番大変な既存のサイトからの移行
完

Post by email for pulse cms

  • 1.
    Post by Email forPulse CMS 2016/12/16 at Pulse CMS Meetup in Osaka 刀祢邦芳(Tone, Kuniyoshi)
  • 2.
    自己紹介 ● ITエンジニア歴42年 ○ IBMメインフレーム→Windows→UNIX→Web ●現在の仕事ではOSSと安価な商用ソフトがメイン ○ Tableau ○ Office365, Power BI with Azure(安価ではないが・・) ○ Pentaho (Spoon) ○ Zabbix & OpManager ○ PHPRunner ○ WinAutomation ○ Redmine, Magento など少々 ● CMS遍歴 ○ Zope & Plone ○ XOOPS ○ Nucleus ○ WordPress ○ Drupal 6, 7, 8 ○ Gatsby 紹介記事 https://goo.gl/axUFsD  ● そして・・・Pulse CMS ● 言語遍歴 ○ Powershell, bash, awk ... ○ JavaScript, Google Apps Script ○ COBOL, FORTRAN, PL/1, Basic ○ マクロ・アセンブラ(6502, System/370) ○ Elixir 勉強中 ○ PHPは見よう見まね ○ Java,C,C#,VB,PHP,ruby,python,Perlはあん まり使ってません ● JS Framework遍歴 ○ Meteor ○ React ○ Riot 勉強中 ● DBMS遍歴 ○ Sybase ○ MS SQL ○ MySQL ○ Snowflake
  • 3.
    やりたいこと ● Drupal 7で作った同窓会掲示板サイトの移植 ○メンバー個人のアカウントでログインして投稿・閲覧する人はごく少数 ■ ログインの殆どがゲストアカウントで閲覧のみ ○ だから、メール投稿&新着配信機能も追加(これが大変だった) ○ 今もバグがあるけど修正は困難だし、 Drupalのアップデートも頻繁で面倒 ● 結局メール投稿&配信がメインでおまけとして過去ログの閲覧検索ができればよ い ○ 保守のためログインするのは管理者だけ ○ その他のメンバーは全員共通の Basic認証でも可 ○ セキュリティが強固な静的サイトに近いものを公開したい ○ メールを記事に変換し易いように1記事1ファイルがよい ● Pulse CMSがぴったり ○ 完全なGeneratorの「Gatsby」も面白そうだがReactベースなのでカスタマイズは難しそう
  • 4.
    本番システム構成 ● Windows 2012Server on VPS(by Contabo https://contabo.com ) ○ 全員65才以上の同窓生のため私以外に Linuxを使いこなせる人は見当たらない ○ Windows PCの延長としてRemote Desktopで操作できるサーバーなら誰かに引き継げる ● Bitnami WAMP Stack (MySQLは不要だが) + Pulse CMS V4.6 ● Node.js V6.6 ○ 勉強を兼ねて、受信メールからブログファイルの作成に使用 ● Talend Open Studio(無償) ○ GUIで種々のバッチ処理が作成できるので保守しやすい ○ まずはメール送信や Google SpreadsheetのAPIを使う予定 ○ 将来の引き継ぎを考えて今後は極力これを使用する ★でも本当はNode.js版をGithub公開したい(将来の夢) ・4 core ・12 GB RAM ・300GB SSD ・100 Mbps ・14.98 € /Month
  • 5.
    デモ ● 本日はlocalhostでデモ ● Blog表示 http://localhost:8081/pulse/blog ● Admin画面 http://localhost:8081/pulse/admin ● 受信メールを未読に設定 ● 受信用バッチの起動 ○ もう一度起動すると未読がゼロなので何も処理されない ● Blogに1件新規投稿されている
  • 6.
    処理の流れ「未読メールの取得と投稿」 ● 「inbox」モジュールを用いて、 ○ 受信ボックスから未読メールを1件だけ取得し、メールのソースをファイル出力 ○ そのメールを既読とする ● 「mailparser」モジュールを用いて、 ○ メールソースを解析 ○ 件名、送信日付、送信者アドレス、本文( HTMLまたはTEXT)、添付ファイルを取得 ● Pulse CMSのブログファイルのテンプレートを読込む ○ テンプレート内のキーワードを件名などで置換したテキストを Pulse CMSのcontent/blogに書き込 む ○ 添付ファイルは別途保存し、リンクを本文の末尾に追加する(これは現在未完) ● Pulse CMSは追加されたファイルをすぐに認識し、ページリフレッシュでブログの ページに表示してくれる。本文はHTMLでもよい。 <素晴らしい!>
  • 7.
    inbox による処理 ● user& passwordを与えてIMAPサーバ(ここではGmail)に接続 ○ でもuser & passwordをソースに埋め込むのは良くないので ● searchメソッドで未読メールのUIDを取得 ● fetchdataで該当UIDのソースを取得 ● ソースをmail.txtに書き込む ○ ファイルを経由せずブログ投稿まで一気に処理もできるが単体テストしやすいようにファイルをインタ フェースとする (Node.jsは基本が非同期なのでこれらを順番に同期して処理するのが実は面倒です) var client = inbox.createConnection(false, 'imap.gmail.com', { // gmail接続 secureConnection: true, auth: { user: process.argv[2], // node実行時の第2パラメータ pass: process.argv[3] // 第3パラメータ } });
  • 8.
  • 9.
    mailparserによる処理 ● テンプレートblogtemplate.htmlをstringに読込む ● mail.txtにあるメールのソースをstringに読込み、 mailparserオブジェクトに渡し、解析させる ●解析終了時に作成されるmail_object内の、 ○ subject, headers.date, headers.fromをテンプレート内の#title#などの文字列と置換 ○ mail_object.htmlをテンプレート内の#body#と置換 (undefinedならばmail_object.textを使用) ● 作成されたブログ用文字列をPulseのcontent/blogフォルダーに出力 ○ ファイル名は 「プレフィックス」+「連番」+yyyymmdd-hhmmss.txt ○ 最終的にはこのプレフィックスをキーにして投稿通知メールへの返信をコメントとして追記する予定
  • 10.
    苦労&工夫したところ ● ブログに投稿日時まで表示させる ○ config.phpを修正しデフォルトの日付を非表示にする ○テンプレートの#datetime#文字列をyyyy/mm/dd hh:mmで置換 ● Node.jsでの同期処理 ○ 単純に順番に処理を実行していくのが実は面倒 ● Mail Parserでのiso-2022対応 ○ 簡単な対応法があるので今後対応 // BLOG $result_per_page = 5; // Blog posts per page $disqus_comments = false; // Turn on/off blog comments (Disqus) $disqus_shortname = "sample-name"; // Your disqus account name // $date_format = "M j, Y"; // More: https://php.net/manual/en/function.date.php $date_format = " "; // More: https://php.net/manual/en/function.date.php // date is not displayed
  • 11.
    今後の予定 ● 投稿者のメールアドレスのチェック ○ 名簿データベース(GoogleSpreadsheet使用)との存在チェック ● 投稿メールをメンバーに送信する ● リプライをコメントと見なして本文に追加する ● URLをファイル名のみにする(このカスタマイズ機能追加希望) ○ 日本語の件名がURLにあるのは若干不安 ○ ファイル名に時分秒まで持たせるので重複はまず発生しない ● 別途目次ページを作成する ○ Pulse CMSがページナビゲーション対応しても数百ページのナビゲーションは大変 ○ それよりは数百行が 1ページになった目次ページを作る ○ 1ページにするとタイトルや日付検索はとりあえずブラウザで可能になる ● 全文検索 ● 一番大変な既存のサイトからの移行
  • 12.