使用ActionMailbox接收支持邮件并存储请求
发布时间: 2025-08-17 02:27:07 阅读量: 1 订阅数: 4 

### 使用 Action Mailbox 接收支持邮件并存储请求
在 Rails 应用中,接收客户的支持邮件并处理相关请求是一项常见需求。本文将详细介绍如何配置 Rails 以接收邮件,创建邮箱来处理这些邮件,并将支持请求存储到数据库中,同时还会涉及如何对邮箱进行测试。
#### 配置 Rails 接收邮件的步骤
配置 Rails 接收邮件需要三个主要步骤,以下是详细的流程图:
```mermaid
graph LR
A[设置 Action Mailbox] --> B[设置 Active Storage]
B --> C[创建邮箱接收邮件]
```
#### 设置 Action Mailbox
要在应用中设置 Action Mailbox,需要运行一个 Rake 任务,该任务会创建一些配置文件、一个基础邮箱类以及一些数据库表,用于存储传入邮件的信息。具体操作如下:
```bash
bin/rails action_mailbox:install
```
运行上述命令后,会有如下输出:
```plaintext
Copying application_mailbox.rb to app/mailboxes
create app/mailboxes/application_mailbox.rb
Copied migration
20190316191846_create_active_storage_tables.active_storage.rb
from active_storage
Copied migration
20190316191847_create_action_mailbox_tables.action_mailbox.rb
from action_mailbox
```
接下来,将 Rake 任务创建的表添加到开发和测试数据库中:
```bash
bin/rails db:migrate
```
在实际应用中,还需要为特定的传入邮件服务提供商配置 Action Mailbox,可参考 Rails 指南获取详细信息。为了满足当前需求,Rails 提供了模拟发送邮件的方法。
#### 设置 Active Storage
Action Mailbox 将所有传入邮件存储在云存储系统(如 Amazon 的 S3)中,Rails 包含一个名为 Active Storage 的库,用于抽象云服务的细节。为了让 Action Mailbox 正常工作,需要配置 Active Storage。
具体步骤如下:
1. 编辑 `config/environments/development.rb`,在配置块末尾添加以下行:
```ruby
# rails6/depot_ua/config/environments/development.rb
config.active_storage.service = :local
```
2. 编辑 `config/environments/test.rb`,添加类似的行,但使用 `:test` 服务:
```ruby
# rails6/depot_ua/config/environments/test.rb
config.active_storage.service = :test
```
3. 创建 `config/storage.yml` 文件,内容如下:
```yaml
# rails6/depot_ua/config/storage.yml
local:
service: Disk
root: <%= Rails.root.join("storage") %>
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
```
这样配置后,当收到邮件时,整个邮件负载会写入存储服务,我们可以访问邮件的部分内容来触发 Rails 应用中的逻辑。
#### 创建邮箱接收邮件
Action Mailbox 通过将传入邮件路由到邮箱来工作。邮箱是 `ApplicationMailbox` 的子类,包含一个名为 `process` 的方法,该方法会为路由到该邮箱的每封邮件调用。
要将发往 `[email protected]` 的邮件路由到一个邮箱,可以在 `ApplicationMailbox` 中插入 `routing` 方法调用:
```ruby
# rails6/depot_ua/app/mailboxes/application_mailbox.rb
class ApplicationMailbox < ActionMailbox::Base
routing "[email protected]" => :support
end
```
然后使用 Rails 生成器创建 `SupportMailbox` 类:
```bash
bin/rails g mailbox support
```
生成的 `SupportMailbox` 类如下:
```ruby
# rails6/depot_ua/app/mailboxes/support_mailbox.rb
class SupportMailbox < ApplicationMailbox
def process
puts "START SupportMailbox#process:"
puts "From : #{ mail.from_address}"
puts "Subject: #{ mail.subject}"
puts "Body : #{ mail.body}"
puts "END SupportMailbox#process:"
end
end
```
由于没有配置真实的邮件提供商,可以使用 Rails 提供的特殊 UI(Conductor)来本地触发邮箱。启动服务器,导航到 `http://localhost:3000/rails/conductor/action_mailbox/inbound_emails`,点击“Deliver new inbound email”,填写邮件信息并发送,即可在服务器日志中看到插入的 `puts` 输出。
#### 存储支持请求
邮箱的目的是对收到的每封邮件执行代码。由于邮件的发送时间不确定,需要将客户支持请求的详细信息存储在某个地方,以便管理员后续处理。为此,将创建一个名为 `SupportRequest` 的新模型,并让 `SupportMailbox` 的 `process` 方法为收到的每封邮件创建一个实例。
##### 创建支持请求模型
使用 Rails 生成器创建 `SupportRequest` 模型:
```bash
bin/rails g model support_request
```
生成的迁移文件如下,需要填充相应内容:
```ruby
# rails6/depot_ub/db/migrate/20190318121503_create_support_requests.rb
class CreateSupportRequests < ActiveRecord::Migration[6.0]
def change
create_table :support_requests do |t|
t.string :email, comment: "Email of the submitter"
t.string :subject, comment: "Subject of their support email"
t.text :body, comment: "Body of their support ema
```
0
0
相关推荐









