ホームページが止まっていても、自分では意外と気づきません。お客さんに言われてはじめて知る、ということもあります。わたしは、ホームページが止まったらメールで知らせてくれる SiteBeacon(サイトビーコン)を使っていますが、メールも、ほかのメールに埋もれると見落とします。
そこで、SiteBeacon から「止まりました」「戻りました」のメールが届いたら、ラズパイが声で知らせるようにしました。サーバーの側は何も変えず、ラズパイがメールの件名を見分けて、前もって作った声を鳴らすだけです。
この記事の前にできていること
- ラズパイに PC から SSH でつなげる(第 3 回まで)
- ラズパイがメールの件名を見て、声を鳴らす仕組み(売れたメールをラズパイが声で知らせる仕組み)
- 声のファイルを作れる(VOICEVOX で通知の声を作る)
この記事でできるようになること
- SiteBeacon の「停止」「復旧」のお知らせのメールが届いたら、ラズパイが声で知らせる
- それ以外のお知らせ(【要確認】【アクセス制限】など)では鳴らさない
- 夜に止まったときは、朝まで取っておいて、朝に知らせる
SiteBeacon とは
SiteBeacon は、ホームページを 5 分ごとに外から開いて、止まっていたらメールで知らせるサービスです。ホームページ 2 つまでは無料で、ホームページの側には何も足しません。直ったときも「戻りました」と、止まっていた時間と一緒に知らせてくれます。SSL 証明書やドメインの期限が近いときのお知らせもあります。
SiteBeacon は、わたし(フリースタイル)が作って運営しているサービスです。この記事では、自分のホームページを見守るのに、実際にこう使っている、という形で紹介します。お知らせのメールの件名さえ決まった形なら、ほかの監視サービスでも同じように作れます。
仕組みの流れ
- SiteBeacon が、ホームページが止まったのを見つけて、メールを送る
- ラズパイが 3 分ごとにメールの箱をのぞき、件名と差出人を見る(既読にしない・消さない)
- 「停止」「復旧」のお知らせなら、決まった声のファイルを、鳴らす順番待ち(queue)に置く
- 鳴らす係が、1 分以内に鳴らす。夜(21 時〜朝 8 時)は鳴らさずに取っておき、朝になってから鳴らす
2〜4 は、売れたメールの仕組みのままです。今回足すのは、SiteBeacon のお知らせを見分ける 2 行と、声のファイル 2 つだけです。
手順 A:お知らせのメールの件名を確認する
SiteBeacon のお知らせのメールは、件名の頭が「[SiteBeacon]」で、そのあとに大事さのラベル([警告]・[復旧] など)と、お知らせの種類(【停止】・【復旧】など)が続きます。差出人は siteb@s-m.biz です。
| 件名の例 | 声で知らせるか |
|---|---|
| [SiteBeacon][警告] 【停止】〇〇 のホームページが表示できません | 知らせる(すぐ見てほしい) |
| [SiteBeacon][復旧] 【復旧】〇〇 が表示できるようになりました | 知らせる(安心できる) |
| [SiteBeacon] 【要確認】〇〇 のページで、ご確認いただきたい点があります | 知らせない(メールを見て確認する) |
| [SiteBeacon][注意] 【アクセス制限】〇〇 でチェックが制限されています | 知らせない(ホームページは止まっていない) |
〇〇には、SiteBeacon に登録したホームページの名前が入ります。声で知らせるのは、止まった・戻ったの 2 つだけにしました。何でも鳴らすと、声に慣れて聞き流すようになるからです。
手順 B:声を 2 つ作って、ラズパイに置く
VOICEVOX の記事の make_voice.py で、声のファイルを 2 つ作ります。PC で VOICEVOX を起動してから、PowerShell で実行します。
python make_voice.py 126 siteb_down.wav "サイトビーコンが、ホームページの停止を見つけました。メールを確認してください。"
python make_voice.py 126 siteb_back.wav "サイトビーコンから、ホームページが復旧したと、知らせがありました。"
scp siteb_down.wav siteb_back.wav mypi:notify/sounds/
「停止」の声には「メールを確認してください」と、次にすることも加えました。メールには、いつから止まっているか、どのページかが書いてあるので、それを見て、ホームページを作った人やサーバーの会社に連絡します。
手順 C:見分ける 2 行を足す
足す先は、売れたメールの記事で作った、メールをのぞくプログラムです(家では ~/notify/mail_notify.py という名前で、RULES・match()・enqueue()・quiet_now() が入っています。鳴らさない時間などの設定は、同じフォルダの config.ini の [notify] に書いています)。
この RULES に、次の 2 行を足します。足す前に、cp mail_notify.py mail_notify.py.bak でバックアップを取っておきます。
RULES = [
# …売れたメールなどの行…
# SiteBeacon のお知らせ(停止・復旧だけ。件名の頭は [SiteBeacon][警告] など)
(re.compile(r"^\[SiteBeacon\](\[[^\]]*\])?\s*【停止】"), ("s-m.biz",), "siteb_down.wav"),
(re.compile(r"^\[SiteBeacon\](\[[^\]]*\])?\s*【復旧】"), ("s-m.biz",), "siteb_back.wav"),
]
書き方と役目
^\[SiteBeacon\]:件名の頭が「[SiteBeacon]」のメールだけを見る(\[[^\]]*\])?:そのあとの [警告]・[復旧] などのラベルは、あってもなくてもよい(ラベルの言葉が変わっても止まらないように)【停止】・【復旧】:お知らせの種類で、鳴らす声を分ける。【要確認】などは、どの行にも合わないので鳴らさない("s-m.biz",):差出人が s-m.biz のメールだけ。同じ件名をほかの人が送ってきても鳴らさない
手順 D:鳴らさずに、見分け方を試す
本物のホームページを止めて試すわけにはいかないので、件名の見分け方だけを先に試します。件名の例を match()(件名と差出人から鳴らす声を決める関数)に渡すだけなので、メールは見ず、声も鳴りません。
この試し方は、mail_notify.py の一番下が if __name__ == "__main__": の形(直接動かしたときだけメールを見る形)になっていることが前提です。一番下で処理を直接呼んでいると、import しただけでメールを見に行き、声を順番待ちに置いてしまいます。
cd ~/notify
python3 -c '
import mail_notify as m
for s in ["[SiteBeacon][警告] 【停止】自分のサイト のホームページが表示できません",
"[SiteBeacon][復旧] 【復旧】自分のサイト が表示できるようになりました",
"[SiteBeacon] 【要確認】自分のサイト のページで、ご確認いただきたい点があります",
"[SiteBeacon][注意] 【アクセス制限】自分のサイト でチェックが制限されています"]:
print(m.match(s, "siteb@s-m.biz") or "(鳴らさない)", "←", s)
print(m.match("[SiteBeacon][警告] 【停止】自分のサイト のホームページが表示できません", "alert@example.com") or "(鳴らさない)", "← 差出人がほかのドメイン")
'
siteb_down.wav ← [SiteBeacon][警告] 【停止】自分のサイト のホームページが表示できません
siteb_back.wav ← [SiteBeacon][復旧] 【復旧】自分のサイト が表示できるようになりました
(鳴らさない) ← [SiteBeacon] 【要確認】自分のサイト のページで、ご確認いただきたい点があります
(鳴らさない) ← [SiteBeacon][注意] 【アクセス制限】自分のサイト でチェックが制限されています
(鳴らさない) ← 差出人がほかのドメイン
- 停止と復旧だけが声になり、要確認とアクセス制限は鳴らしません。
- 家のラズパイでは、件名が日本語の文字コード(ISO-2022-JP・UTF-8)で包まれて届いた形でも試し、同じように見分けられました(件名を元の文字に戻してから
match()に渡しているため)。 - 差出人がほかのドメインのときは、件名が同じでも鳴らしません。
最後に、2 つの声を鳴らす順番待ちに置いて、家のスピーカーで実際に鳴らしました。鳴らす係が 1 分ごとに見に来て、置いた 1 分後に続けて鳴りました。
2026-11-11 08:02:02 queue を鳴らします: 20261111-080106-mail-siteb_down.wav
2026-11-11 08:02:08 queue を鳴らします: 20261111-080107-mail-siteb_back.wav
夜に止まったときは、朝に知らせる
夜中にホームページが止まったときに、ラズパイに起こされるかどうかは、決めておいたほうがよいところです。この記事では、夜は鳴らさずに朝まで取っておくことにしました。夜中に知っても、その場でできることは少なく、朝にメールを見て連絡すれば間に合うことがほとんどだからです。
メールを見るのは夜も続けているので、夜のあいだに止まって戻ったときは、朝に「停止」と「復旧」の声が続けて鳴ります。止まっていた時間は、復旧のメールに書いてあります。
ただ、これは人によって違います。お店の予約や注文を夜も受けているホームページなら、夜中でもすぐ知りたいことが多いと思います。夜も知らせてほしいときは、次のどちらかにします。
全部の声を、夜も鳴らす
ラズパイの ~/notify/config.ini の、鳴らさない時間の始まりと終わりを同じ数字にします。鳴らさない時間がなくなり、売れたメールの声なども、夜中にすぐ鳴るようになります。
[notify]
quiet_start = 0
quiet_end = 0
「停止」の声だけ、夜もすぐ鳴らす
ほかの声は朝まで待たせて、ホームページが止まったときだけ夜中でも知らせる形です。mail_notify.py に次の deliver() を足し、見つけたメールの声を順番待ちに置いている所の enqueue(wav) を deliver(wav, cfg) に変えます。play_path() は、売れたメールの記事の「鳴らす側」の関数です。mail_notify.py からも呼べるようにしておきます(同じ関数をコピーするか、鳴らす側のファイルから読み込む)。
NIGHT_OK = ("siteb_down.wav",) # 夜でもすぐ鳴らす声
def deliver(wav, cfg):
if wav in NIGHT_OK and quiet_now(cfg):
# 鳴らさない時間でも、順番待ちを通さずにその場で鳴らす
play_path(os.path.join(HERE, "sounds", wav), cfg.get("notify", "device", fallback="") or None)
else:
enqueue(wav) # いつもどおり順番待ちに置く(夜は朝まで待つ)
NIGHT_OK:夜でもすぐ鳴らす声の一覧。「復旧」も夜に知りたければ、"siteb_back.wav"を足しますquiet_now(cfg):今が鳴らさない時間かどうか。鳴らさない時間なら、順番待ちを通さずにその場で鳴らします- それ以外の声は、今までどおり順番待ちに置き、朝になってから鳴ります
play_path() と enqueue() を、鳴らさずに記録だけする形に差しかえて試した結果です(夜:停止だけすぐ鳴らし、復旧と売れたメールは順番待ちに置いて朝まで待つ/昼:全部いつもどおり順番待ちへ)。家のラズパイは、朝まで待つ形のまま使っています。
夜 [('すぐ鳴らす', 'siteb_down.wav'), ('順番待ちへ', 'siteb_back.wav'), ('順番待ちへ', 'mercari.wav')]
昼 [('順番待ちへ', 'siteb_down.wav'), ('順番待ちへ', 'siteb_back.wav'), ('順番待ちへ', 'mercari.wav')]
セキュリティの考え方
- メールは、のぞくだけです。既読にせず、消さず、メールを送ることもしません。本文も取らず、件名と差出人だけを見ます。
- メールのパスワードは、ラズパイの設定ファイル(config.ini)だけに書き、ほかの人が読めないようにしておきます(
chmod 600 config.ini)。 - 差出人の欄は送る側が書き換えられるので、差出人のドメインで見分けても、なりすましを全部防げるわけではありません。声は「メールを確認してください」のきっかけにとどめ、何をするかは、メールの内容を見てから決めます。
まとめ
SiteBeacon のお知らせのメールを件名で見分けて、ラズパイに「停止を見つけました」「復旧しました」と話させるようにしました。足したのは、見分ける 2 行と、声のファイル 2 つだけです。メールに気づかなくても、声で知らせてくれるので、ホームページが止まったままになるのを防げます。
自分のホームページを見守りたいときは、SiteBeacon も使ってみてください。
次に読む
- VOICEVOX で通知の声を作る(声の作り方)
- 売れたメールをラズパイが声で知らせる仕組みを作った(メールの見方・鳴らす順番・夜の扱い)
- ラズパイにセルフチェックと自己再生の機能を加えてみた
- ほかの使い方:ラズパイでできること