redmine接收邮件创建工单

大家好:

    今天R队要给大家分享的是redmine中一个炒鸡实用的功能----发送邮件给redmine自动提交工单。此功能可扩展Redmine的使用场景,即使不在公司内网也可以通过邮件来提bug、或通过邮件来更新测试进展、反馈测试结果等。

一. 流程解析

Redmine接收邮件的整体流程如下图:


 (1) rake命令行

        整个邮件收取流程的入口,是通过rake命令行调用。在调试时我们手动调用即可,在生产环境中,一般可以配置 crontab 或其他定时任务,每隔若干分钟收取一次邮件并处理。

代码逻辑在 lib/tasks/email.rake ,主要就是负责调用IMAP模块

 (2) IMAP模块

        对IMAP协议的实现,由ruby核心库提供,redmine只是负责调用。主要操作如下:

 # lib/redmine/imap.rb

  # 创建imap连接,并鉴权。其中用到的host、port、username、password等参数,在环境变量中配置,或通过命令行传入
  imap = Net::IMAP.new(host, port, ssl)  
  imap.login(imap_options[:username], imap_options[:password])
  
  # 登录成功后,搜索并拉取邮箱中未读的邮件
  # RFC822是一种标准化的电子邮件格式,包含了邮件头信息和正文
  imap.select(folder)
  imap.uid_search(['NOT', 'SEEN']).each do |uid|
    msg = imap.uid_fetch(uid,'RFC822')[0].attr['RFC822']
    MailHandler.safe_receive(msg, options)

 (3) MailerHandler

        读取邮件成功后,返回了一串RFC822格式的邮件内容构成的String,交给Redmine的MailerHandler模块进行处理。

这里的方法调用顺序大致如下:

  1. self.receive(类方法)

    处理环境变量参数,通过Rails框架把String转化为Mail实体

  2. new.receive(实例方法)

    对邮件来源进行过滤,并把发件人设置为@user(可以通过配置为每个新用户自动创建账号)

  3. dispatch

    根据邮件的header、subject信息,分不同情况处理,具体如下:

    • MESSAGE_ID_RE

      回复Redmine自动发送的邮件时,邮件的reference字段会默认带有类似”<redmine.issue-12345[email protected]”格式的内容,此时会识别出Issue的工单号12345,触发 receive_issue_reply

    • ISSUE_REPLY_SUBJECT_RE

      在第一条不匹配的情况下,若邮件标题中包含”[xxxx #12345]”的内容,也会识别出Issue单号12345,并触发 receive_issue_reply

    • MESSAGE_REPLY_SUBJECT_RE

      若邮件标题包含”[xxxx msg12345]”,会触发 receive_message_reply,不过此流程我们暂时用不到

    • DEFAULT

      若成功接受了邮件,但是不属于以上任何一种情况,会走 dispatch_to_default 的默认逻辑,如果要通过邮件新建Issue,则是在此分支下进行。

 (4)  Issue

        在识别到Issue ID、或确定要创建新Issue之后,接下来要做的事情就是交给Issue模块来处理了。

        如果是新建Issue,会把邮件标题作为工单的标题,邮件正文作为工单的描述;如果是更新Issue,会把邮件正文作为journal回复到工单下。

        同时不论是新建还是回复工单,都会根据邮件内容来更新Issue的字段(调用issue_attributes_from_keywords、custom_field_values_from_keywords方法)。这里需要注意的是,和页面编辑Issue不同的是,这里的任何字段校验失败都没法提示错误,只会默默的失败。因此最好加上异常处理,并打印日志。





    

    

猜你喜欢

转载自blog.csdn.net/weixin_42463677/article/details/81016595
今日推荐