redmineで期限切れのタスクを保持する人(及び起票者に)アラートメールを出すスクリプト
redmineは便利だが
毎日ログインするには億劫になってしまう。で、ついつい期限切れのタスクが発生している事に気づかないでそのまま放置って事もしばしば。本当は、期限日のN日前ぐらいにはメールを出すべきなんだろう。が、まずは期限切れのものだけでもタスク担当&起票者には警告メールを出して注意を促したい。
スクリプト
ちょいと古いサーバで書いたのでrubygems等々を使わない方向で書いてみた。
require "mysql" require 'net/smtp' require 'kconv' $KCODE = 'u' DB_HOST = '192.168.***.***' DB_USER = 'user' DB_PASS = 'password' DB_NAME = 'redmine' SMTP_SERVER = '192.168.***.***' MAIL_FROM = 'redminealert@redminealert.jp' REDMINE_ISSUE_URL_BASE = "https://someredminehost.jp/issues/show/" def sendmail(title,body,from,to) tomany = to.join(',') head = <<HEAD subject: #{title} To: #{tomany} From: #{from} Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: Text/Plain; charset=iso-2022-jp HEAD src = head + "\n\n" + Kconv.tojis(body) m = Net::SMTPSession.new(address = SMTP_SERVER, port = 25) m.start() m.sendmail(src, from, to) m.finish end my = Mysql.init() my.options(Mysql::SET_CHARSET_NAME, "utf8") db = my.real_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME) sql = " SELECT issues.id, assigned_user.mail, author_user.mail, issues.subject, assigned_user.lastname, author_user.lastname, issues.due_date FROM issues LEFT JOIN issue_statuses ON issues.status_id = issue_statuses.id LEFT JOIN users as assigned_user ON issues.assigned_to_id = assigned_user.id LEFT JOIN users as author_user ON issues. author_id = author_user.id WHERE assigned_user.status = 1 AND issues.due_date < NOW() AND issue_statuses.is_closed <> 1 ORDER BY assigned_user.id " st = db.prepare(sql) rs = st.execute() assigned_mails = Hash.new{|hash,key| hash[key] = []} author_mails = Hash.new{|hash,key| hash[key] = []} while row = rs.fetch() assigned_mails[row[1]] << row author_mails[row[2]] << row if row[1] != row[2] end def process(hash,subject,body_header) hash.each do |key,value| body = body_header + "\n\n" hash[key].each do |issue| body += "■ #{issue[3]}\n" body += "担当:#{issue[4]} / 起票:#{issue[5]}\n" body += "期限:#{issue[6].year}年#{issue[6].month}月#{issue[6].day}日\n" body += "#{REDMINE_ISSUE_URL_BASE}#{issue[0]}\n" body += "\n" end sendmail(subject,body,MAIL_FROM,[key]) end end sub = "[redmine] alert mail" body_header = "以下にあなたマターの未完了タスクがあります。\n早急に対応するか期限の再設定を行ってください。" process(assigned_mails,sub,body_header) sub = "[redmine] alert mail" body_header = "以下にあなた起票の未完了タスクがあります。\n早急に担当に確認するか、期限の再設定を行ってください。" process(author_mails,sub,body_header)
rubyを始めた頃のソースをちょっぱって作ったので色々な意味で容赦してください。メール送るところとかはTMailとかでリプレイスしちゃってください(すくなくとも日本語件名文字化けします(gmailだとみれますが))