action mailbox

Action Mailer Basics和Action Mailbox Basics:郵件系統。html

https://edgeguides.rubyonrails.org/action_mailbox_basics.html#eximgit

https://edgeguides.rubyonrails.org/action_mailer_basics.htmlgithub


 

案例:

//在rails6 app分支
10238  rails action_mailbox:install
//會生成一個app/mailboxes/application_mailbox.rb
//同時生成3個數據庫table
10240 rails g scaffold User email name 10241 rails g scaffold Discussion title 10242 rails g scaffold Comment user:references discussion:references body:text 10243 rails db:migrate 10245 rails g mailbox Replies

上面代碼使用rails6的新特性:action mailbox。它用於導航接收的email給控制器mailboxes。正則表達式

它能夠使用Postmark等常見API庫。也能夠直接經過它內建的Exim等APi來處理接收的email。數據庫

接收的email,經過使用action job來異步導航到一個或多個指定的mailboxes。api

 

使用方法

安裝-》配置api-》生成一個mailbox-》使用。具體見ruby

 

繼續:app

class ApplicationMailbox < ActionMailbox::Base
  # routing /something/i => :somewhere
  routing /reply\+.+@reply.github.com/i => :replies
  routing :all => :replies
end

 

routing方法,指定不一樣的郵件到特定的mailbox中。本例全部的郵件都被RepliesMailbox類進行處理。異步

 

⚠️一個方便的轉化ruby 正則表達式語法網站:https://rubular.com/ide

 

繼續:

在replies_mailbox.rb內編寫方法。

mailbox集成了mail這個model。一個Ruby Mail Library.
https://github.com/mikel/mail/
提供了生成,轉化,發送的一系列方法。

在gemfile.lock中可見:

actionmailbox (6.0.0.rc1)
  ...
  mail (>= 2.7.1)

class RepliesMailbox < ApplicationMailbox
  MATCHER = /reply-(.+)@reply.example.com/i # mail => Mail object
  # inbound_email => ActionMailbox::InboundEmail record

  #before_processing :ensure_user


  def process
    return if user.nil?

    discussion.comments.create(
      user: user,
      # decoded方法返回對象的值(格式是string),即返回的是body,不是subject
      body: mail.decoded
    )

  end

  def user
    @user ||= User.find_by(email: mail.from)
  end

  def discussion
    @discussion ||= Discussion.find(discussion_id)
  end

# recipients是mail的方法,find{}進行匹配找到第一個符合的data。
# recipients能夠用to方法代替。
# recipient是一個string, 使用[Regexp, 1]獲得捕捉到的字符。具體見正則表達式的捕捉() def discussion_id recipient = mail.recipients.find{|r| MATCHER.match?(r) } recipient[MATCHER, 1] end private def ensure_user if user.nil? bounce_with UserMailer.missing(inbound_email) end end
class ApplicationMailbox < ActionMailbox::Base
  # routing /something/i => :somewhere
  # routing /reply\+.+@reply.github.com/i => :replies
  # routing :all => :replies
  routing RepliesMailbox::MATCHER => :replies
end

 

而後添加user和discussion2條記錄。

在discussions/show.html.erb增長下面的代碼:

...
<h4>Comments</h4>
<div>
 <% @discussions.comments.each do |comment| %> <strong><%= comment.user.name%></strong> commented:<br/> <%= simple_format comment.body%>
<% end %> </div>

 

完成!

測試

進入http://localhost:3000/rails/conductor/action_mailbox/inbound_emails

點擊Deliver new inbound email連接,選擇發送一封

這是source:

Date: Fri, 24 May 2019 11:30:37 +0800
From: 1@1.com
To: reply-1@reply.example.com
Message-ID: <5ce7655da43ed_c653feae01b5b9c714c@chentianweideiMac.local.mail>
In-Reply-To: 
Subject: congratulations
Mime-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

hello boy!
相關文章
相關標籤/搜索