You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

修复步骤

  1. 确认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
  1. 在各环境配置文件中显式指定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
  1. 如果是从低版本Rails升级到7.0,补跑Active Storage的安装迁移(全新安装Rails7可跳过这步):
$ rails active_storage:install
$ rails db:migrate
  1. 重启Rails服务,再次通过Conductor面板发送测试邮件即可正常触发自定义Mailbox的处理逻辑。

内容的提问来源于stack exchange,提问作者nomad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:27:24