phplistでメールマガジン構築実験

※Linux関連記事についてはsnagplaces on @wikiにまとめていますので、そちらをご参照ください。

※現在phplistは削除したので、今後更新することはないと思います。

phplistは文字通りPHPで書かれたメールマガジン発行スクリプトです。データの保存にMySQLを使用しているため、わりかしセキュアなシステムだろうなと思います。

前提条件:

  • Apache・Postfix・Dovecotが構築済み

参考サイト:

MySQLの設定

テストサーバにはMySQLがインストール済みであったものの、設定が何一つされていなかったのでまずはそこから行います。

補足:rootパスワードを忘れた場合はmySQLのrootのパスワード初期化 [Pen-test.jpn.org]に初期化の方法が載ってます。

PHPとMySQLとのひも付け

これをしておかないと「Fatal Error: Mysql is not supported in your PHP, recompile and try again.」といったエラーが出ます。原因はphp5が基本だとmysqlを内包しない設定になっているせいで、php-mysqlを導入する以外の方法としては、–without-mysqlオプションを外したうえでphpをコンパイルする方法のどちらかになります。

# yum install php-mysql
# service httpd restart

my.cnfの設定

# vi /etc/my.cnf

【8行目あたり追記】文字コードをUTF-8にする
default-character-set = utf8
【14行目あたり追記】MySQLクライアントの文字コードをUTF-8にする
[mysql]
default-character-set = utf8

MySQLの起動

# service mysqld start

MySQLを自動起動に設定

# chkconfig mysqld on

MySQL初期設定

以前は初期設定時にちまちまと不要ユーザやデータベースを削除していたのですが、MySQL5では対話形式での初期設定ツールが付属していました。もしかしたら昔のバージョンでもあったかもしれませんが。

# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we’ll need the current
password for the root user.  If you’ve just installed MySQL, and
you haven’t set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 【Enter】
OK, successfully used password, moving on…

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] 【Enter】
New password: 【MySQLのrootログインのためのパスワードを入力】
Re-enter new password: 【確認のため同一パスワードを入力】
Password updated successfully!
Reloading privilege tables..
 … Success!

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] 【Enter、匿名ユーザの削除】
 … Success!

Normally, root should only be allowed to connect from ‘localhost’.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] 【Enter、リモートからのrootログイン禁止】
 … Success!

By default, MySQL comes with a database named ‘test’ that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] 【Enter、testデータベースの削除】
 – Dropping test database…
 … Success!
 – Removing privileges on test database…
 … Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] 【Enter、MySQLテーブルの更新】
 … Success!

Cleaning up…

All done!  If you’ve completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

 データベースの確認

mysql> show databases;
+——————–+
| Database           |
+——————–+
| information_schema |
| mysql              |
+——————–+
3 rows in set (0.00 sec)

ユーザの確認

mysql> select user,host from user;
+——+———–+
| user | host      |
+——+———–+
| root | localhost |
+——+———–+
1 row in set (0.00 sec)

phplist用データベースとユーザの作成

データベースの作成

# mysql -uroot -p
Enter password:

mysql> use mysql;

mysql> create database phplist character set ‘utf8’; ※「character set」のところは別になくていいと思う

phplist用ユーザ(phplist)の作成

mysql> grant all privileges on phplist.* to phplist@localhost identified by ‘パスワード’;

phplistの導入

phplistのダウンロード

 # wget http://www.phplist.jp/mydownloads+visit.cid+1+lid+3.htm

ダウンロードしたファイルの解凍

# unzip phplist-2.10.4jp.zip

日本語関連ファイルがEUCなのでUTF-8に変換

日本語化するべき項目は以下の6つ(ディレクトリ含む)。rubyのコマンドで変換する方法でやっていますがあまり信用できません(結局手動で変換した)。しかも同じコマンドを2回やるとファイルを壊してしまいます。

# cd /home/monitor/public_html/phplist-2.10.4jp/public_html/lists/
# ruby -rnkf -i -ne ‘print NKF.nkf("-E -w", $_)’ \
texts/japanese.inc \
admin/help/ja/* \
admin/info/ja/* \
admin/lan/ja/* \
admin/phpmailer/language/phpmailer.lang-ja.php \
admin/defaultconfig.inc

各設定ファイル編集

# vi admin/mysql.inc

【45行目あたり追記】
mysql_query("SET NAMES ‘utf8’", $db);

# vi texts/japanese.inc

【5行目あたり変更】
$strCharSet             = ‘UTF-8’;

# vi admin/send_core.php

【946行目あたり変更】
value="’.htmlentities($subject,ENT_QUOTES,’EUC-JP’).’" size=40></td></tr>
【952行目あたり変更】
value="’.htmlentities($from,ENT_QUOTES,’EUC-JP’).’" size=40></td></tr>

# vi admin/phpmailer/class.phpmailer.php

【36行目あたり変更】
var $CharSet           = "iso-2022-jp";
【49行目あたり変更】
var $Encoding          = "7bit";
【422行目あたり追記】
 $body = mb_convert_encoding($body, $this->CharSet);
【1142行目あたり追記】
$str = mb_encode_mimeheader($str, $this->CharSet, "B");

# vi admin/class.phplistmailer.php

【24行目あたり変更】
parent::SetLanguage(‘ja’,’phpmailer/language/’);

# vi admin/structure.php

【69行目あたり変更】MySQLの1M制限回避(らしい
"name" => array("varchar(50) not null","Name of Dataitem"),

# vi config/config.php

【25行目あたり変更】MySQLで設定したDB名
$database_name = "phplist";
【28行目あたり変更】MySQLで設定したphplist用のユーザ名
$database_user = "phplist";
【31行目あたり変更】MySQLで設定したphplistユーザのパスワード
$database_password = ‘パスワード’;

※以下の項目は本稼働時に変更する
【191行目あたり修正】テストモードを終了
define ("TEST",0);

phpmailerを適切な場所に移動

# cd /home/monitor/public_html/phplist-2.10.4jp/public_html
# cp -r * /home/monitor/public_html

phplistのWeb設定

  1. 「http://ドメイン/lists/admin」にアクセス
  2. 「データベースの初期化」をクリック
  3. 「phplistセットアップ」をクリック
  4. 「admin/phplist」でログイン
  5. 「システム機能」→「セットアップ」をクリック
  6. 未解決な項目がでるので、それぞれ変更しておく

必要な作業はこれくらい。

機能が豊富でできることは多いのですが、グループをlistと称したりと一部独特な表現があったり、設定時の手間がかかることを考えると、これもまたmailman同様にクセがありました。
ちなみに、Wordpressのプラグインでメールマガジンを実現するSubscribe2というものがあって、これもテスト環境に構築してはみたのですが、送信などは容易ではあるものの、登録したメールアドレスのグループ化は記事カテゴリに任せるという方式で、あくまでユーザに希望の記事を登録させるという形式であったため自分の用途には合わず。
個人的には指定ページにアクセスではなく指定アドレスに送信したらメールマガジンに登録され、件名本文から自動的に区分されるようなものがほしかったのですが…なかなかみつからんもんですね。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中