2024 年度 OSS リテラシ 3 : メール送信

はじめに

IoT では測定データが閾値を超えた場合にメール通知することが一般的に行われる. grafana の機能として閾値を超えた場合にメールを送ることもできるが, ここではより一般的に Linux サーバ上でデータベースより最新温度を取得し, mail コマンドでメール送信する方法を述べる.

準備

s-nail コマンドでメールの送信を送るようにする

$ sudo apt install s-nail

動作確認

$ echo "テストメール" | s-nail -S mta=smtp://<メールサーバ IP>:25 -S smtp-auth=none -S v15-compat=yes -s タイトル -r 自分のメールアドレス  送信先メールアドレス

チェックスクリプト

require 'yaml'
require 'mysql2'

###
### 変数宣言
###
name  = "XXXXX"     # マイコンの名前
table = "XXXXX"     # テーブル名
temp  = 0.0         # 温度用変数の初期化
temp_max = 30.0     # 温度の閾値

###
### データベース
###
conf = "XXXXXXXXXXXXX"             # データベースへの接続情報の置き場.
mydb = YAML.load_file( conf )      # 設定ファイルの読み込み

# データベースへの接続
client = Mysql2::Client.new(
   :host     => "#{mydb["SERV"]}",
   :username => "#{mydb["USER"]}",
   :password => "#{mydb["PASS"]}",
   :database => "#{mydb["DBNM"]}"
)

###
### データベースより時刻情報を取り出す
###

# SQL 文の作成.該当のマイコンで計測した最新の温度のみ取得
sql = "SELECT temp XXXXXX #{table}  XXXXXXXXX  #{name} XXXXXXXX order by time desc limit 1"

# SQL を実行して得られた温度を保管
client.query(sql).each do |item|
  # p item
  temp = item["temp"].to_f
end

###
### メール送信
###

puts "最新温度: #{temp}"

if temp > temp_max
  comm = " echo '温度が規定値を超えました (#{temp} C)' | s-nail XXXXXXX"
  puts comm

  # Linux のコマンドを実行
  # system( comm )    # <-- 動作確認してからコメントアウトを外すこと
end

課題

作成したスクリプトを cron コマンドで定期的に実行するようにしなさい. その後,サーミスタ温度計を触るなどして, 温度が閾値を超えたときにメールが送られることを確認せよ. コマンド crontab -l の出力結果と,送信されたメールの 2 つのスクリーンショットを提出すること.