目的
便利なバックログですが最近タスクがたまり気味のため
各タスクオーナに個別詳細レポートを送信する
やってみた事
各担当者へ納期順に個別レポートをメールする
送信されるレポートメールサンプル
担当者のメールアドレスに自分が担当分の下記レポートメールが送信され
代表者のメールアドレスには全ての担当者分がまとまって送信されます。
期限日:2014/06/24
[PRJ_NAME-95] 課題名
状態:処理済み / 担当者:XXX2014/06/23 14:13:57
最新コメントの先頭100文字
https://space-name.backlog.jp/view/PRJ_NAME-95
...
プログラム本体
動作確認環境
- Python 2.6.6
- backlog lib (python)
https://code.google.com/p/backloglib/
設定ファイル
プログラム本体と同一ディレクトリに配置の上
ファイル名を config.ini として下さい
1 2 |
KIG_I test@example.net |
1行目 プロジェクト名
2行目 代表者メールアドレス
ソースコード
#coding:utf-8 ##### ## FileName:report_mail.py ## Author:Ryo Tanaka ## Version:0.3 ## Date:2014/06/26 ## Usage:./report_mail.py ## Summary:担当者別にBACKLOGのプロジェクトサマリをメール送信します ##### __author__ = 'tanaka' import datetime import backloglib import smtplib from email.MIMEText import MIMEText from email.Header import Header from email.Utils import formatdate config_file = "config.ini" spacename = "スペースネームを記載 xxxx.backlog.jp の部分です" username = "API用ユーザネームを記載 APIリクエストに使うユーザ名" password = "API用ユーザパスワードを記載 APIリクエストに使うユーザのパスワード" smtpsvr = "メール送信サーバアドレス" port = 25 from_addr = "メール送信元アドレスを記載" whole_report = "" separator = "--------------------------------------------------------------------" # # load_config 設定ファイル読み込み # @param cnf 設定ファイル名 # def load_config(cnf): global line try: f = open(cnf, 'r') line = f.readlines() f.close() except: print cnf + "の読み込みに失敗しました" exit(1) # # create_message MIMETextを作成 # @param from_addr 送信元アドレス # @param to_addr 送信先アドレス # @param subject 件名 # @param body メール本文 # @param encoding 文字エンコーディング # @return msg MIMEText # def create_message(from_addr, to_addr, subject, body, encoding): msg = MIMEText(body, 'plain', encoding) msg['Subject'] = Header(subject, encoding) msg['From'] = from_addr msg['To'] = to_addr msg['Date'] = formatdate(localtime=True) msg['X-Priority'] = '1' return msg # # send_mail メール送信 # @param from_addr 送信元アドレス # @param to_addr 送信先アドレス # @param msg 送信するMIMEText # def send_mail(from_addr, to_addr, msg): smtp = smtplib.SMTP(smtpsvr, port) smtp.sendmail(from_addr, [to_addr], msg.as_string()) smtp.close() # # cut_comment コメント整形 # @param come コメント # @return come 整形したコメント # def cut_comment(come): come = come[0:100] come = come.replace('\n', '') come = come.replace('\r', '') come = come.replace('\r\n', '') return come # # make_report 報告レポート作成 # @param due 期限日 # @param key 課題キー # @param summary 課題の概要 # @param assigner 担当者 # @param url 課題URL # @param time 時刻 # @param comment コメント # @return rep 構築されたレポート # def make_report(due, key, summary, status, assigner, url, time, comment): global separator rep = u"期限日:" + due + "\n" + \ "[" + key + "] " + summary + "\n" + \ u"状態:" + status + u" / 担当者:" + assigner + "\n" + "\n" + \ time + "\n" + \ comment + "\n" + \ url + "\n" + "\n" + \ separator + "\n" return rep # # convert_time 時刻整形 # @param str 日付文字列(YYYYmmddHHMMSS) # @return t_str 整形済み日付文字列(YYYY/mm/dd HH:MM:SS) # def convert_time(str): time = datetime.datetime.strptime(str, "%Y%m%d%H%M%S") t_str = time.strftime("%Y/%m/%d %H:%M:%S") return t_str # # convert_date 時刻整形 # @param str 日付文字列(YYYYmmdd) # @return t_str 整形済み日付文字列(YYYY/mm/dd) # def convert_date(str): time = datetime.datetime.strptime(str, "%Y%m%d") t_str = time.strftime("%Y/%m/%d") return t_str # # set_blank 空白埋め # def set_blank(): global comment global time_str comment = "" time_str = "" # #### # # MAIN # # #### # if __name__ == "__main__" : load_config(config_file) projects = line[0].strip() chief_addr = line[1].strip() backlog = backloglib.Backlog(spacename, username, password) backlog_admin = backloglib.BacklogAdmin(spacename, username, password) project = backlog.get_project(projects) allusers = backlog_admin.get_users() report_subject = "【BACKLOG残タスク】" + project.key + "プロジェクトで未完了のタスクを報告します" mail_addr = [0] * (len(allusers) - 1) for cnt in range(len(allusers) - 1): mail_addr[cnt] = allusers[cnt].mail_address for prj_index in range(len(allusers) - 1): issues = backlog.find_issue({ 'projectId':project.id, 'statusId':[1,2,3], 'assignerId':allusers[prj_index].id, 'sort':"DUE_DATE", 'order':True }) if len(issues) < 1: continue report = [0] * (len(issues) - 1) for issue_index in range(len(issues) - 1): issue = backlog.get_issue(issues[issue_index].id) comments = backlog.get_comments(issues[issue_index].id) if len(comments) < 1: set_blank() else: try: comment = comments[-1].content # 最新のコメントを取得 time_str = convert_time(comments[-1].created_on) # 時刻を整形 except: set_blank() comment = cut_comment(comment) if len(comment) < 1: comment = u"コメントが存在しませんでした" if len(issue.due_date) < 1: due_date = u"なし" else: due_date = convert_date(issue.due_date) rep_section = make_report(due_date, issue.key, issue.summary, issue.status.name, issue.assigner.name, issue.url, time_str, comment) report[issue_index] = rep_section.encode('utf-8') report_msg = "".join(map(str, report)) # report配列を結合 issue_index += 1 try: to_addr = mail_addr[prj_index] body_msg = create_message(from_addr, to_addr, report_subject, report_msg, 'utf-8') whole_report += report_msg send_mail(from_addr, to_addr, body_msg) except: prj_index += 1 continue prj_index += 1 whole_msg = create_message(from_addr, chief_addr, report_subject, whole_report, 'utf-8') send_mail(from_addr, chief_addr, whole_msg) exit(0)