親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

さくらのメールサーバの容量を個別にチェックして通知メールを送信


メールサーバの容量チェック

以前会社でさくらのメールサーバを運用していた時、1人で大量に容量を使いすぎないように、定期的にチェックして容量が大きい人は容量を空けてもらう依頼を出していた時がありました。
毎日目視でチェックするのはしんどかったので、スクレイピングでチェックするツールを作成し、該当者に自動でメール送信をするプログラムを作っていたので共有します。

使用している技術

Pythonを使用しているのですが、開発時期がちょっと前なのでバージョンは2系になります。
また、さくらのコントロールパネルの画面をスクレイピングしており、BeautifulSoupを使用しています。
スクレイピングは毎日cronで定期実行しており、該当者にはsmtplibを使用してメールを送信しています。
メールの送信周りの設定は今回は触れませんので各自でお願いします。

また、今回は例として、さくらのドメイン名はtest.sakura.ne.jpとし、送信するメールの宛先のドメインはtest.jpであるとします。
そしてメールの容量は1人6GBまで使用できることになっており、すでに5GBを超えている人に対してアラートメールを送るようにしています。



スクレイピングツールの中身

# -*- coding: utf-8 -*-

import re
import mechanize
import BeautifulSoup
import smtplib
from email.mime.text import MIMEText

# コントロールパネルの画面
url_user = 'https://secure.sakura.ad.jp/rscontrol/main/user'

# ログイン画面
url_login = 'https://secure.sakura.ad.jp/rscontrol/'

# コントロールパネルのアカウントを入力してください。
domain_name = 'test.sakura.ne.jp'
password = 'pppppppppp'

# 以下はコントロールパネルへのログイン処理
br = mechanize.Browser()
br.open(url_login)
br.select_form(name='login')
br['domain'] = domain_name
br['password'] = password
br.submit()
br.open(url_user)

# 画面をスクレイピング
bs = BeautifulSoup.BeautifulSoup(br.response().read())

viewbox = bs.findAll('table', { "class":"viewbox" })
all_tr = viewbox[1].findAll('tr')

for tr in all_tr:
    td = tr.find('td', {"class":"alnum"})
    if td is None:
        continue

    capacity = tr.findAll('td', {"class":"right"})[0].text

    if capacity.count('GB') == 0:
        continue

    capa_num = capacity.replace('GB','')
    if float(capa_num) < 5:
        continue

    mailaddress = user + '@test.jp'

    msg = MIMEText( "メールの容量がそろそろパンパンですよ。\n1人6GBまでって決まってるんだけど。\n早くサーバから削除してね。\n容量を超えたらメールが受信できなくなって困るのはあなたですよ。",'plain','utf-8')
    msg['Subject'] = '【警告】メールの容量がもういっぱい'
    msg['From']    = 'Alert@test.jp'

    msg['To']      = mailaddress
    msg['CC']      = 'testtest@test.jp'

    # この例ではtesttest@test.jpというメールアカウントから送るようになっていますが、各々の環境に合わせて設定してください。
    s = smtplib.SMTP()
    s.connect()
    s.sendmail('testtest@test.jp', [mailaddress,'testtest2@test.jp'], msg.as_string())
    s.close()

cronの設定

最後にcronを設定しましょう。
みんなが出社してくる朝9時にメールが流れるようにします。
※今回は/var/www/html/batch/にmail_check.pyというファイル名で置いてあるとします。

00 9 * * * python /var/www/html/batch/mail_check.py


ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者:斎藤 康毅
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)
みんなのPython 第4版

みんなのPython 第4版

  • 作者:柴田 淳
  • 発売日: 2016/12/22
  • メディア: 単行本