issueを期日(前、または当日)でメール通知したい

513 views
Skip to first unread message

his

unread,
Feb 3, 2008, 9:36:53 PM2/3/08
to Redmine Users (japanese)
標記、需要はあると思うのですが、
どなたか実装経験のある方いらっしゃいますか。

もしいらっしゃれば、是非実装方法をご教授頂きたいのですが。

fmkt

unread,
Feb 3, 2008, 10:01:08 PM2/3/08
to Redmine Users (japanese)
こんにちは。

fmktといいます。

こんな感じでどうでしょう。
#添付ファイルってないのか...?

====ここから====

#!/usr/bin/ruby
require File.join(File.dirname(__FILE__), "../config/environment")
require 'time'
require 'kconv'
require 'tmail'
require 'net/smtp'

class Scheduler

class << self
def reminder
issues = Issue.find(:all,
:include => [:project],
:conditions=>["due_date = ? and status_id < 4",
Date.today])
# 前日含めたければ ["due_date = ? and status_id < 4", Date.today] を
# ["due_date = ? or due_date = ? and status_id < 4", Date.today,
Date.yesterday] で出来るかな?
# status_id < 4は未終了のものにしています。未終了も含めたければこの部分は消してください。
issues.each do |issue|
member_addrs = Member.find(:all,
:conditions=>["project_id = ? and role_id <
3",
issue.project.id]).map(&:user).map(&:mail)
# role_id < 3 これは開発者、管理者に限定してます。

send_bodys = Array.new
send_bodys << "Redmine Reminder #{Date.today}"
send_bodys << "以下の問題の期限が迫っています"
send_bodys << "プロジェクト名 , #{issue.project.name}"
send_bodys << "問題 , #{issue.subject}"
send_bodys << "アドレス , http://hostname/issues/show/#{issue.id}"
send_schedule_mail(send_bodys, member_addrs)
end
end

private

def send_schedule_mail(body, send_addr=["宛先のデフォルトメールアドレス"])
finddate = body.shift
mail = TMail::Mail.new
mail.to = *(send_addr)
mail.from = Setting.mail_from
conv_subject = Kconv.toutf8(finddate).split(//,
1).pack('m').chomp
encoded_subject = "=?UTF-8?B?" + conv_subject.gsub('\n', '') + "?
="
mail.subject = encoded_subject
mail.date = Time.now
mail.mime_version = '1.0'
mail.reply_to = "返信先のアドレス"

message = TMail::Mail.new
message.set_content_type('text', 'plain', {'charset'=>'iso-2022-
jp'})
message.transfer_encoding = '7bit'
message.body = Kconv.tojis(body.join("\r\n"))

filename = (Kconv.tojis(finddate.gsub("/","-") + ".csv")).gsub("
","_")
attachment = TMail::Mail.new
attachment.body =
Kconv.tojis([body.join("\n")].pack("m").chomp.gsub(/.{76}/, "\\1\n"))
attachment.transfer_encoding = 'base64'
attachment.set_content_type('text', 'comma-separated-values',
{'charset'=>'utf-8'})
attachment.set_content_disposition('attachment', {'filename' =>
filename,'charset' => 'utf-8'})
mail.parts.push(message)
mail.parts.push(attachment)
mail.write_back

$smtp_server = 'メールサーバ' #config/envirionmentから取れるようにしてもいい
Net::SMTP.start($smtp_server) do |smtp|
smtp.sendmail(mail.encoded, mail.from, *(send_addr))
end
true
end
end
end

if __FILE__ == $0
Scheduler.reminder
end


====ここまで===

私の会社で使用しているスクリプトの一部をはしょってリマインダの部分だけ
書いています。そのため不必要な引数とかあるかもしれません.
# はしょってるせいで動かないところもあるかも。

使用方法は このファイルをlibの直下に schedule.rb として置いて
linuxならcrontab 、 windowsならタスクスケジューラで 毎日決めた時間に動かせばいいと思います。

これを元に色々いじってみて好きなように動かしてみてください。

fmkt

unread,
Feb 4, 2008, 4:38:16 AM2/4/08
to Redmine Users (japanese)
#レスが直接着たけどまぁいいか。
うまくできたようで何よりです。

role_idやstatus_is はセットアップ、設定次第で各々で違うと思います。

script/console で
IssueStatus.find(:all)
Role.find(:all)

などして確認してから設定して下さい。

では。
Reply all
Reply to author
Forward
0 new messages