Rails 7 ActionMailbox报422错误 Service name can't be blank
Rails 7 Action Mailbox 入站邮件测试返回422错误修复
错误日志
本地启动服务后通过Conductor面板提交测试入站邮件,请求失败返回422状态码,日志报错如下:
13:39:20 web.1 | Started POST "/rails/conductor/action_mailbox/inbound_emails" for ::1 at 2022-07-02 13:39:20 -0400 13:39:20 web.1 | ActiveRecord::SchemaMigration Pluck (2.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC 13:39:20 web.1 | Processing by Rails::Conductor::ActionMailbox::InboundEmailsController#create as HTML 13:39:20 web.1 | Parameters: {"utf8"=>"✓", "authenticity_token"=>"asdfads", "mail"=>{"from"=>"user@gmail.com", "to"=>"support@email.com", "cc"=>"", "bcc"=>"", "x_original_to"=>"", "in_reply_to"=>"", "subject"=>"test", "body"=>"test"}, "commit"=>"Deliver inbound email"} 13:39:20 web.1 | Completed 422 Unprocessable Entity in 53ms (ActiveRecord: 21.3ms | Allocations: 43704) 13:39:20 web.1 | 13:39:20 web.1 | 13:39:20 web.1 | 13:39:20 web.1 | ActiveRecord::RecordInvalid (Validation failed: Service name can't be blank): 13:39:20 web.1 | 13:39:20 web.1 | activerecord (7.0.0) lib/active_record/validations.rb:80:in `raise_validation_error' 13:39:20 web.1 | activerecord (7.0.0) lib/active_record/validations.rb:53:in `save!'
已完成配置
操作前已完成以下Action Mailbox配置:
- 执行安装命令并完成数据库迁移:
$ rails action_mailbox:install $ rails db:migrate
- 在开发、生产环境配置文件中指定Mailgun作为入站入口:
# config/environments/development.rb & config/environments/production.rb config.action_mailbox.ingress = :mailgun
- 通过credentials配置Mailgun签名密钥:
action_mailbox: mailgun_signing_key: XXX
- 生成自定义邮件处理器:
# app/mailboxes/forwards_mailbox.rb class ForwardsMailbox < ApplicationMailbox def process byebug end end
- 配置路由规则将所有入站邮件转发到自定义处理器:
# app/mailboxes/application_mailbox.rb class ApplicationMailbox < ActionMailbox::Base routing :all => :forwards end
问题根因
该报错和Mailgun、SendGrid的入口配置完全无关。Rails 7中Action Mailbox存储原始邮件内容、附件时强依赖Active Storage组件,升级到Rails 7后如果没有显式配置Active Storage的存储服务,创建ActiveStorage::Blob记录时会触发Service name can't be blank的校验错误,最终导致入站邮件记录保存失败返回422。
修复步骤
- 确认
config/storage.yml中存在各环境对应的存储服务配置,最小配置参考如下:
local: service: Disk root: <%= Rails.root.join("storage") %> test: service: Disk root: <%= Rails.root.join("tmp/storage") %> # 生产环境按需替换为S3/OSS等对象存储配置 amazon: service: S3 access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> region: us-east-1 bucket: your-app-bucket
- 在各环境配置文件中显式指定Active Storage使用的服务:
- 开发环境
config/environments/development.rb添加:
config.active_storage.service = :local
- 测试环境
config/environments/test.rb添加:
config.active_storage.service = :test
- 生产环境
config/environments/production.rb添加(替换为实际使用的存储服务名):
config.active_storage.service = :amazon
- 如果是从低版本Rails升级到7.0,补跑Active Storage的安装迁移(全新安装Rails7可跳过这步):
$ rails active_storage:install $ rails db:migrate
- 重启Rails服务,再次通过Conductor面板发送测试邮件即可正常触发自定义Mailbox的处理逻辑。
内容的提问来源于stack exchange,提问作者nomad
相关产品推荐
相关产品推荐

