メーリングリスト風サービスを作ってみた

長年利用させていただいていたメーリングリストサービスの `freeml byGMO` が 2019.12.2 を持ってサービス終了ということで、ちょっと困ったので作ってみました。

## メーリングリスト
メーリングリストは、町内会の情報共有で利用していて、そんなに頻度は多くないのですが、祭りの準備とかイベントがある時などに、回覧板では情報共有に時差が出るので（もちろん回覧板でも情報は町内を回りますが）簡単に共有できるメーリングリストは重宝しています。

最近なら `LINEグループ` とか `Slack` とかで情報共有ってのは普通なのですが、これはコンピュータやネットワークなどについてある程度知識や技術がある人たちには使えますが、そうでない場合はなかなか敷居が高いものです。特に地方では高齢の方も多く、携帯電話（ガラケー）は使えてもスマホは使えない、というのはよくあります。ガラケーであれば、メールアドレスを持っているので、送信はできなくても受信ができるので、回覧板よりも早く情報共有することも可能です。
なので、こういう幅広い年代間での情報共有にはまだまだメーリングリストは有効なのです。

## GMO、freeml やめるってよ
前項でも書きましたが、メーリングリストは便利ですが 'メール' 自体が今となっては少しリアルタイム性の遅い、そして送受信に多少手間がかかるツールとなってしまい、メンバー間のコミュニケーションツールとしては下火になっています。なので、無料でメーリングリストのサービスを続けていくのも難しくなってきたのだと思います。

しかしながら、前項でも書いた通り、ネットやコンピュータに対する知識や技術が少ない人でも簡単に情報共有できるツールとしては、メーリングリストはまだまだ有効なコミュニケーションツールです。

## メーリングリストを自前で用意する
というわけで、代わりの無料のメーリングリストを探してみたのですが、なかなか良さげなのが見つからなかったのと、おそらくいずれ同じ運命をたどるのだろうと想像したので、自前で用意できないか考えてみました。

有名どころでは `majordomo` とか、`GNU Mailman` とかありますが、いずれもちょっと面倒（インストールとか設定とか）だったので、一から作ることにしました。

## メーリングリスト風サービスを作ってみる
メーリングリストとは、ある一つの代表メールアドレスへ参加者の一人がメールを送信すると、登録されているメンバー全員へ、そのメールが配信される、というものです。

単純に言えば、この機能を実装できれば良い、ということになります。

というわけで、既存のメールアカウントを利用してメーリングリスト風サービスを作ってみました。

### 用意するもの
+ メーリングリスト用のアドレス（アカウント）
+ サービスを動かすサーバ (Linux とか Mac とか）
+ Ruby2.5.x 以上（sinatra + unicorn で動きます）

ソースはここにあるので、git clone してください。
https://github.com/ysomei/mllikeservice

### インストール方法
ruby や nginx などはすでにインストールされているものとします。
ちなみに ruby は rbenv でインストールします。
＃ruby のバージョンは 2.5.5 で確認しています。
＃bundler もインストールしておきましょう。

```
$ rbenv install 2.5.5
$ rbenv local 2.5.5
$ gem install bundler
```
```
$ git clone https://github.com/ysomei/mllikeservice.git
$ cd mllikeservice
$ bundle install --path vendor/bundler
$ ./script/unicorn_mllikeservice start
```

サービスのポート番号は 8286 ですので、nginx で reverse proxy するなり、そのままのポートで使用するなりしてください。
＃nginx で reverse proxy する場合は config/application.rb の root_path のところを修正して、nginx の設定で、 proxy 設定の location を /mllikeservice/ { ...　としてください。
基本的にインストール先は自宅サーバ等を想定しているので、外部に出すことは想定していません。

### サービス設定画面
起動したらブラウザでページにアクセスします。

```
http://localhost:8286
```
`config/application.rb` にBasic認証設定がしてあるので、設定してあるIDとパスワードでログインします。

![menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59523/76f1e2cd-e7ce-3982-ff31-a6a966ae1973.png)

### メーリングリストを追加
Add ML リンクをクリックするとML追加画面になります。ここでメーリングリストに使いたいメールアドレスとアカウント設定をします。

![addml.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59523/4b5befb7-8b00-f300-638c-85cc68c02199.png)

`ML Name` はメーリングリスト名です。例）美術部ML
`ML MailAddress` はメーリングリストの宛先アドレス。 例）bijutsubu@ml.example.com
`Mail Server`、`IMAP/POP3`、`Account`、`Password`　はアカウント設定です。上の ML Mailaddress にアクセスできる設定を記述します。

### ML一覧
Show ML List は登録されているメーリングリストの一覧を表示します。
クリックすると詳細が見れます。

![mllist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59523/93f732c2-9fd0-4160-2ebb-1b7acc36b429.png)

### メンバー追加、情報修正
選択したMLの情報修正とメンバーの追加修正ができます。
＃現在はとりあえず修正と追加のみです。削除したい場合は直接ファイルを編集してください。。。
＃ アカウント設定：data/mailinglist-address/settings.yml
＃ ユーザー設定：data/mailinglist-address/users.yml

![mlinfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59523/915db05d-0e8b-5fbe-52bb-2f55b552c1ce.png)

### メーリングリスト風サービスの動作
メーリングリスト追加で追加したサーバへ１分毎にアクセスして新しいメールがきているかどうか確認しています。
新しいメールが到着していれば、それがメンバーから送信されたものかを確認して、そうであれば登録されているメンバー全員へメールを送信します。
登録メンバー以外からのメールは無視します。

メールは削除しないので、放っておくとメールボックスのサイズがいっぱいになって受信できなくなるかもしれないので、定期的に Thunderbird のようなメーラーで適切に処理をしましょう。

メールサーバが IMAP の場合は `既読` にするとメーリングリストに反映されないので、注意しましょう。
＃サービスは未読のもののみ処理するようになっています。処理後にサービスが既読にします。
＃とは言え、一応 data/mailinglist-address/mailhashlist.csv で連番管理と一緒に送信済み管理をしています。
＃POP3の場合は既読／未読がないので、 data/mailinglist-address/pop3readed.dat で既読管理をしています。

## まとめ
あまり難しいこと（たとえばメールサーバをインストールしたり、majordomo のようなサービスをインストールして連携させたり、コマンドラインでメンバー管理とか）をして運用したくなかったので、既存のメールアカウントを利用してメーリングリスト風サービスができるものを作りました。
＃自前でそういうサービスを用意しなくてもできるようにしました。
＃とは言ってもやっぱり専用のメールアカウントは用意するのですが。。。


まだまだバグとか不具合とかあるかもしれませんが、ぼちぼち修正しながら使っていこうと思います。＃町内会で利用するという需要があるので。。。

将来的には、LINEグループに配信したり、Slackに流したりもできればなぁと思っています。＃逆は今の所考えてませんが。。。

同じように？困っている人の参考になれば幸いです。
以上。