ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

OpenProject 入站邮件集成实战:IMAP/Gmail 收取任务、邮件解析规则与错误处理

OpenProject 入站邮件集成实战:IMAP/Gmail 收取任务、邮件解析规则与错误处理 OpenProject 入站邮件集成实战IMAP/Gmail 收取任务、邮件解析规则与错误处理【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject本篇指南基于 OpenProject 官方文档docs/installation-and-operations/configuration/incoming-emails/README.md展开讲解如何通过 rake 任务从 IMAP 或 Gmail 拉取邮件并自动创建、更新工作包Work Package与回复论坛帖子。读完后你将掌握redmine:email:receive_imap/redmine:email:receive_gmail两个任务的完整参数、Docker 部署下的环境变量配置、Gmail API 服务账号的前期准备以及邮件正文中可用于设置工作包属性的关键字段与错误处理机制。工作原理一个负责拉取与解析的 rake 任务OpenProject 可以接收入站邮件并根据邮件内容创建或更新工作包、在论坛中回复。整个流程由一个 rake 任务驱动任务从邮件服务器拉取邮件、解析正文、再根据内容执行相应动作。该任务可以手动执行也可以借助 Cron 定时任务自动运行Docker 安装方式自带了类 cron守护进程见下文。从源码结构看核心调用链如下lib/tasks/email.rake 定义了redmine:email:receive_imap、redmine:email:receive_gmail、redmine:email:receive_pop3与redmine:email:read四个任务IMAP 拉取逻辑位于 lib/redmine/imap.rb连接后仅搜索未读邮件search([NOT, SEEN])逐封交给IncomingEmails::MailHandler.receive处理Gmail API 拉取逻辑位于 lib/redmine/gmail.rb邮件解析与动作执行的实现位于 app/services/incoming_emails/mail_handler.rb。lib/redmine/imap.rb 还揭示了两种重要的邮件流转行为这解释了后文两个参数的实际含义成功处理后若设置了move_on_success邮件会被复制到目标文件夹然后打上SeenDeleted标记最终由imap.expunge清理处理失败或被忽略邮件先被标记为Seen若设置了move_on_failure则复制到该文件夹并删除避免下次任务重复处理同一封邮件。配置方式一打包安装Packaged InstallationIMAP 方式IMAP 拉取使用 rake 任务redmine:email:receive_imap打包安装下的完整命令示例openproject run bundle exec rake redmine:email:receive_imap hostimap.gmail.com usernametest_user passwordpassword port993 ssltrue ssl_verificationtrue allow_overridetype,project projecttest_projectGmail API 方式openproject run bundle exec rake redmine:email:receive_gmail credentials/path/to/credentials.json user_idtest_user queryis:unread label:openproject allow_overridetype,project如果你使用的是 Enterprise 云以上 Setup 配置已经由平台完成可以直接跳到邮件格式一节。IMAP 任务参数一览以下参数指定邮件收取行为与 Docker 环境变量的对应关系见第二列参数 keyDocker ENV 变量说明hostIMAP_HOST邮件服务器地址usernameIMAP_USERNAME用于连接邮件服务器的用户名passwordIMAP_PASSWORD用户密码portIMAP_PORT连接邮件服务器使用的端口sslIMAP_SSL与IMAP_SSL_VERIFICATION连接邮件服务器是否使用 SSLfolderIMAP_FOLDER要从中收取邮件的文件夹默认INBOXmove_on_successIMAP_MOVE_ON_SUCCESS成功解析的邮件被移动到的文件夹而非直接删除例如 INBOX.successmove_on_failureIMAP_MOVE_ON_FAILURE被忽略的邮件被移动到的文件夹例如 INBOX.failed源码中的默认值可以印证上表host默认127.0.0.1、port默认143、folder默认INBOX见 lib/redmine/imap.rb 与 lib/tasks/email.rakessl与ssl_verification在 rake 任务中默认均为true。工作包属性覆盖参数以下参数改变工作包的处理方式即邮件命中后写入哪些属性参数 keyDocker ENV 变量说明projectIMAP_ATTR_PROJECT目标项目标识符categoryIMAP_ATTR_CATEGORY目标分类名称priorityIMAP_ATTR_PRIORITY目标优先级名称statusIMAP_ATTR_STATUS目标状态名称versionIMAP_ATTR_VERSION目标版本名称已弃用请使用target_versionstarget_versionsIMAP_ATTR_TARGET_VERSIONS目标版本名称多个版本用逗号分隔多个版本需要多版本功能支持typeIMAP_ATTR_TYPE目标类型名称assigned_toIMAP_ATTR_ASSIGNED_TO负责人用户名unknown_userIMAP_UNKNOWN_USERignore忽略邮件默认accept作为匿名用户接收create创建用户账号。提示匿名用户发信要正常工作还必须设置IMAP_NO_PERMISSION_CHECK1no_permission_checkIMAP_NO_PERMISSION_CHECK设为 1 时接收邮件时跳过权限检查allow_overrideIMAP_ALLOW_OVERRIDE指定哪些属性可被邮件内容覆盖即使已被前面的选项固定。逗号分隔列表从 lib/tasks/email.rake 的issue_defaults_from_env可以看出任务默认会读取project、status、type、category、priority、assigned_to、version、target_versions这些环境变量作为属性默认值如需为自定义字段设置默认值可以额外通过default_fields环境变量声明字段名列表如default_fieldsCustomField1 CustomField2字段值中只能包含环境变量合法字符即不能有标点与空格。配置方式二Docker 安装Docker 安装自带一个类 cron守护进程会模拟上述定时任务自动执行。你只需在环境变量列表如 env 文件中指定以下变量IMAP_SSLtrue 或 false取决于 IMAP 连接是否需要隐式 TLS/SSL默认 trueIMAP_SSL_VERIFICATIONtrue 或 false取决于是否校验 SSL 证书默认 trueIMAP_PORT、IMAP_HOSTIMAP 主机与端口IMAP_USERNAME、IMAP_PASSWORD可选环境变量IMAP_CHECK_INTERVAL600检查新邮件的间隔秒数默认 600 秒即 10 分钟IMAP_ALLOW_OVERRIDE允许被覆盖的属性true 表示全部逗号分隔列表写法与allow_override一致其余属性类参数的 Docker ENV 变量名见上文两张参数表。Gmail API更安全的服务账号方案如需使用更安全的 Gmail API 方式而非 IMAP需要先在 Google Cloud 中完成一次性配置打开 Google Cloud Console创建新项目进入启用 API 和服务Enable APIs and Services启用 Gmail API进入该项目的凭据Credentials页面点击创建凭据 服务账号授予服务账号 editor编辑者权限并点击完成点击新建的服务账号进入密钥Keys标签页添加新密钥保存 JSON 密钥文件注意切勿将该 JSON 文件分享给任何人它包含服务账号的私钥打开 Google 管理后台admin.google.com选择 安全 访问和数据控制 API 控制进入域宽委托Domain-Wide Delegation添加新的 API 客户端打开 JSON 密钥文件复制其中的client_id在作用域scopes中填入https://www.googleapis.com/auth/gmail.modify注意必须授予 modify 权限以便将邮件标记为已读域宽委托的作用是让服务账号能够访问你域名下的所有账号。Gmail API 任务参数参数 key说明credentialsGmail 服务账号凭据文件JSONuser_id文档表格中亦写作usernameGmail 邮箱地址queryGmail 搜索查询语句例如is:unread label:openprojectread_on_failure失败时是否也将邮件标记为已读默认 truemax_emails单次最多处理的邮件数默认 1000源码印证lib/redmine/gmail.rb 中通过Google::Auth::ServiceAccountCredentials.make_creds加载 JSON 密钥scope 固定为gmail.modify并调用credentials.update!(sub: user_id)完成域宽委托的身份替换处理成功的邮件会被移除UNREAD标签lib/redmine/gmail.rb失败时是否移除取决于read_on_failure默认 true见 lib/tasks/email.rake。邮件格式这是集成能否工作的前提重要提示请使用邮件客户端的纯文本编辑器而非 HTML 编辑器撰写邮件以免项目名称等字段被错误解析。工作包更新收到工作包通知邮件后直接回复该邮件即可把内容作为评论追加到工作包上同时可以更新属性。例如回复status: closed The issue is sorted then. Closing this.这封回复会为工作包添加评论并将其关闭。工作包创建也可以直接发信创建新的工作包。请发送到与回复工作包通知相同的地址。创建时目标项目要么由上面的配置预先指定要么必须在邮件开头显式声明其他属性也可以一并在正文中定义。例如发送主题为 Fixing problems、正文如下的一封邮件project: demo-project type: Task status: In Progress Im looking into the problems.就会在标识符为demo-project的项目中创建一个类型为 Task、状态为 In Progress 的新工作包。项目标识符可以在项目设置中查看也可以直接看浏览器地址栏。发件人地址的匹配规则邮件的发件地址必须与系统内已有账号匹配MailHandler 才会扮演该用户执行创建动作。若找不到匹配账号邮件默认会被拒绝。要允许未知发件人创建工作包可设置no_permission_check1并配合unknown_useraccept。注意该机制只是邮件地址 → 用户账号的映射并不会基于邮件本身做身份认证。由于邮件地址可以被伪造不应依赖由此方式创建的工作包的真实身份。在 OpenProject Enterprise 云中邮件触发的工作包生成仅能由已注册的邮箱地址发起。unknown_usercreate同理它会事实上允许外部人员创建新账号其安全影响与自我注册设置相当请谨慎开启。带后缀的邮箱账号如accountsuffixgooglemail.com如果你习惯使用带后缀的邮箱收到的通知会发到带后缀的地址但回复时用的是不带后缀的原始地址。为此OpenProject 默认会将对accountdomain的检索通过正则扩展到accountsuffixdomain。如不希望此行为或想自定义前缀分隔符可执行bundle exec rails runner Setting.mail_suffix_separators 可用的属性关键字无论创建还是更新工作包可用的属性集合一致。其中只有project比较特殊你必须要么通过allow_overrideproject,..将其加入可覆盖属性集合要么以projectidentifier形式将其固定为配置变量。待创建工作包的主题取自邮件主题subject正文中所有包含已识别关键字的行会被剔除剩余内容成为描述description。各字段既可以使用内部Key也可以使用属性Name名称取决于系统默认语言或通过发件邮箱识别出的用户所选择的语言KeyName (EN)说明示例projectProject设置项目使用项目标识符project:test_projectresponsibleAccountable设置负责人通过用户邮箱或登录名responsible:userexample.orgassigned_toAssignee设置经办人使用用户邮箱或登录名assignee:test.nutzerexample.orgtypeType设置类型type:MilestoneversionVersion设置版本已弃用请使用 target_versionsversion:v4.1.0target_versionsTarget versions设置目标版本多个用逗号分隔多个版本需要多版本功能target_versions:v4.1.0, v4.2.0start_dateStart date设置开始日期start_date:2015-02-28due_dateDue date设置截止日期due_date:2015-02-28estimated_hoursEstimated hours设置预计工时使用数字estimated_hours:10.5remaining_hoursRemaining hours设置剩余工时使用数字remaining_hours:2.5statusStatus设置状态status:closedpriorityPriority设置优先级priority:HighcategoryCategory设置项目分类category:Testing如要设置自定义字段直接使用浏览器中显示的字段名即可例如Custom field:new value。注意关键字不区分大小写但要设置的值是区分大小写的。附件与观察者附件通过邮件创建或更新工作包时邮件的附件会一并附加到相应的工作包上。观察者如果通过邮件创建工作包时抄送/密送给另一个邮箱to 或 bccOpenProject 会查找该邮箱对应的用户并将其添加为观察者watcher。邮件截断Truncate Emails管理员设置中可指定截断行邮件解析到该行后不再继续。这在回复 OpenProject 自动发出的通知邮件时非常有用——例如把截断行设为--Truncate here--并把它插在执行完更新内容之后的位置从而避免把历史引用内容一并解析。错误处理失败时会收到什么接收过程中出错时系统会尝试向发件人发送一封包含错误细节的邮件。但这封邮件只有在同时满足以下条件时才会发出入站邮件确实被应用读取到了如果拉取环节本身就失败应用自然无从回复用户在系统中处于激活状态注意unknown_usercreate时也会走到这一步配置项report_incoming_email_errors为 true默认为 true。由于发件地址可被伪造返回的错误邮件在理论上可能泄露信息。请评估该风险并通过合理配置该集成来降低影响面。如需关闭错误回告打包安装执行openproject config:set OPENPROJECT_REPORT__INCOMING__EMAIL__ERRORSfalse然后重启 openproject 服务Docker 部署添加环境变量OPENPROJECT_REPORT__INCOMING__EMAIL__ERRORSfalse。延伸阅读仓库中相关的其他入口lib/tasks/email.rake除上文两个任务外还提供redmine:email:receive_pop3POP3 拉取支持apop、delete_unprocessed等参数、redmine:email:read从标准输入读取原始邮件便于调试单封邮件以及redmine:email:test[login]向指定登录名的用户发送测试邮件以验证出站配置extra/mail_handler/rdm-mailhandler.rb一个独立的命令行工具从标准输入读取邮件并通过 API 密钥转发到服务器的/mail_handler端点适合自建邮件网关如 procmail/dovecot 管道直接投递的场景。【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表