不好意思,我又来求助大家了!希望大家在思路上或方法上给点灵感。
在日常产品运营和开发过程中,很多同事发现了一些 bug,但苦于不知道 bug 该怎么提,或该向谁提,导致了产品 bug 不能快速得到反馈,那么也就无法及时得到处理。
公司现在用的是 Redmine(Rails2.3.14)作为项目管理的,公司就希望在 redmine 中添加一个bug email to a new issue的功能。
意思就是公司员工在发现了 bug 的时候,可以及时的向一特定的邮箱([email protected]),发送一封邮件,那么此 Redmine 功能能够根据此邮件的内容生成一个对应的 bug 工单。
1.此功能只对公司邮箱有效(非公司邮箱向[email protected]发送的邮件将被忽略)
redmine 自带了此功能,但是发现它对 mail 的内容和格式有特殊要求,不太符合公司要求,所以我觉得不采用其自带的(是否有重新发明轮子的感觉)
我的想法很单纯,写一个 rake,然后再写个 crontab 定时去执行这个 rake。 那么我的 rake 要做什么? 1.取邮件,即获取最新的邮件,而且要排除已处理过的邮件。我的做法是每 5 分钟取最新的 5 条邮件(按照公司邮件提交的频率),然后拿到上一次处理过的最后一条邮件,如果此 5 条中没有此记录,判断得出 5 条都是新的,如果有,那么 就从这条邮件中的下一条开始算起,每次操作完成后都缓存下组后一条的邮件记录,并过滤掉不是本公司的邮件,具体代码形如:
# get new and xxx.com emails
emails = Mail.find(:what => :last, :count => 5, :order => :asc)
message_ids = emails.map{|mail| mail.message_id}
message_id = IO.readlines("#{RAILS_ROOT}/doc/mail_box").last
message_id = message_id.strip if message_id
index = message_ids.index(message_id)
emails = emails[index+1,emails.size] if index
emails = emails.select{|mail| mail if(mail.from.first.to_s=~/xxx.com$/) }
2.邮件到 Issue 的转换,主要用到了 mail 这个 Gem 包,并在转换的过程中记录日志,以便日后查看,具体代码如下:
#to new bug issue
unless emails.blank?
out_put_file = File.open("#{RAILS_ROOT}/doc/mail_box","a")
log_file_path = "#{RAILS_ROOT}/log/mail.log"
log_file = nil
if File.exist? log_file_path
log_file = File.open(log_file_path,"a")
else
log_file = File.new(log_file_path,"w+")
end
emails.each do |mail|
issue = Issue.new
issue.tracker_id = 1
issue.subject = (mail.subject + "#由Bug邮箱自动生成")
author = User.find_by_mail(mail.from.first)
author = User.find_by_mail(DEFAULT_EMAIL) unless author
issue.author_id = author.id
issue.description = (get_mail_body mail)
issue.project_id = DEFAULT_TEAM
issue.save!
out_put_file.puts mail.message_id
out_put_file.flush
log_file.puts (mail.date.strftime("%F %R:%S") + mail.subject)
log_file.flush
end
#record new mail message_id
out_put_file.close
log_file.close
end
其中所依赖一个解析邮件 body 的方法
#get email body
def get_mail_body(mail)
mail.parts.each do |part|
next unless part.content_type =~ /^text\/html/
content = part.decode_body
charset = mail.parts.last.charset.to_s
unless charset == "utf-8"
content = Iconv.iconv("utf-8", charset, content)
end
return content
end
end
对于文本格式或普通 html 格式(及没有图片等内容)邮件处理比较成功,但是有图片等资源此代码解析就会失效。
1.现在我解析 email body 得到的是 html 代码,然后在在 redmine 中直接以 html 显示,而 redmine 中这段用的是 ,所以我还需要从 html 转化成它的格式,(不知道有没有现成的方法或 gem 包呢)。 2.关于邮件中图片的资源的获取,因为提 bug 的人很多不知道怎么描述,直接贴张图就 ok 了,故对图片的获取很重要。在此请教大家邮件中获取图片的方法?
happy to wait for you!