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だとみれますが))