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 つのスクリーンショットを提出すること.