actionmailbox 6.0.6 → 6.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53b469cd500cc96cca5f0cd143efb603c64636710d90600b361b8935d84b3bb4
4
- data.tar.gz: 655769e040880dc091f03c74483e7cd2b5e4cc5e548583d0436452cb3511d36c
3
+ metadata.gz: 250cbc428fc9ad9c9ba5227a22e478dab77c129428e9ac335878ce834e7f24d1
4
+ data.tar.gz: b8835f730cebb308a96d9e1aa8a0d19d1c7d2af6fe9be79c8411a17b72f7a2f1
5
5
  SHA512:
6
- metadata.gz: ff2ca4d9a545d908c9df2a18bbf438eac0f65835454f6bf7479b152292f435d09bd734b66df147aee8ca08f15088b56db4ca756de2d757666f56b8c9f4a5f33f
7
- data.tar.gz: fd4c6acb82cc0eda87835ccdfc2e396e27b447bacee2e4806ef8071001d110b83baaeac056c432c15eaa6731d184a571faaa28e0183e88d1c1112fedd2094809
6
+ metadata.gz: b99940a3413d02da761a105b99538d11e70e33a7fa11689b45425769f130dea79001ab4b557b8469a1c7aed01e52e90b895ee26f0a1bbd8e006134cac33435c9
7
+ data.tar.gz: e844914ff9fa3a69ee3473b2647c81f2def522fdaa6c107ad668def4546ef405bd2452a24ddede27d8d70e7072c2f43c369c9981a551245d75aec1624e7d1d4d
data/CHANGELOG.md CHANGED
@@ -1,158 +1,36 @@
1
- ## Rails 6.0.6 (September 09, 2022) ##
1
+ ## Rails 6.1.0.rc1 (November 02, 2020) ##
2
2
 
3
- * No changes.
3
+ * Sendgrid ingress now passes through the envelope recipient as `X-Original-To`.
4
4
 
5
-
6
- ## Rails 6.0.5.1 (July 12, 2022) ##
7
-
8
- * No changes.
9
-
10
-
11
- ## Rails 6.0.5 (May 09, 2022) ##
12
-
13
- * No changes.
14
-
15
-
16
- ## Rails 6.0.4.8 (April 26, 2022) ##
17
-
18
- * No changes.
19
-
20
-
21
- ## Rails 6.0.4.7 (March 08, 2022) ##
22
-
23
- * No changes.
24
-
25
-
26
- ## Rails 6.0.4.6 (February 11, 2022) ##
27
-
28
- * No changes.
29
-
30
-
31
- ## Rails 6.0.4.5 (February 11, 2022) ##
32
-
33
- * No changes.
34
-
35
-
36
- ## Rails 6.0.4.4 (December 15, 2021) ##
37
-
38
- * No changes.
39
-
40
-
41
- ## Rails 6.0.4.3 (December 14, 2021) ##
42
-
43
- * No changes.
44
-
45
-
46
- ## Rails 6.0.4.2 (December 14, 2021) ##
47
-
48
- * No changes.
49
-
50
-
51
- ## Rails 6.0.4.1 (August 19, 2021) ##
52
-
53
- * No changes.
54
-
55
-
56
- ## Rails 6.0.4 (June 15, 2021) ##
57
-
58
- * No changes.
59
-
60
-
61
- ## Rails 6.0.3.7 (May 05, 2021) ##
62
-
63
- * No changes.
64
-
65
-
66
- ## Rails 6.0.3.6 (March 26, 2021) ##
67
-
68
- * No changes.
69
-
70
-
71
- ## Rails 6.0.3.5 (February 10, 2021) ##
72
-
73
- * No changes.
74
-
75
-
76
- ## Rails 6.0.3.4 (October 07, 2020) ##
77
-
78
- * No changes.
79
-
80
-
81
- ## Rails 6.0.3.3 (September 09, 2020) ##
82
-
83
- * No changes.
84
-
85
-
86
- ## Rails 6.0.3.2 (June 17, 2020) ##
87
-
88
- * No changes.
89
-
90
-
91
- ## Rails 6.0.3.1 (May 18, 2020) ##
92
-
93
- * No changes.
94
-
95
-
96
- ## Rails 6.0.3 (May 06, 2020) ##
5
+ *Mark Haussmann*
97
6
 
98
7
  * Update Mandrill inbound email route to respond appropriately to HEAD requests for URL health checks from Mandrill.
99
8
 
100
9
  *Bill Cromie*
101
10
 
11
+ * Add way to deliver emails via source instead of filling out a form through the conductor interface.
102
12
 
103
- ## Rails 6.0.2.2 (March 19, 2020) ##
104
-
105
- * No changes.
106
-
107
-
108
- ## Rails 6.0.2.1 (December 18, 2019) ##
109
-
110
- * No changes.
111
-
112
-
113
- ## Rails 6.0.2 (December 13, 2019) ##
13
+ *DHH*
114
14
 
115
- * No changes.
15
+ * Mailgun ingress now passes through the envelope recipient as `X-Original-To`.
116
16
 
17
+ *Rikki Pitt*
117
18
 
118
- ## Rails 6.0.1 (November 5, 2019) ##
19
+ * Deprecate `Rails.application.credentials.action_mailbox.api_key` and `MAILGUN_INGRESS_API_KEY` in favor of `Rails.application.credentials.action_mailbox.signing_key` and `MAILGUN_INGRESS_SIGNING_KEY`.
119
20
 
120
- * No changes.
21
+ *Matthijs Vos*
121
22
 
23
+ * Allow easier creation of multi-part emails from the `create_inbound_email_from_mail` and `receive_inbound_email_from_mail` test helpers.
122
24
 
123
- ## Rails 6.0.0 (August 16, 2019) ##
25
+ *Michael Herold*
124
26
 
125
27
  * Fix Bcc header not being included with emails from `create_inbound_email_from` test helpers.
126
28
 
127
29
  *jduff*
128
30
 
31
+ * Add `ApplicationMailbox.mailbox_for` to expose mailbox routing.
129
32
 
130
- ## Rails 6.0.0.rc2 (July 22, 2019) ##
131
-
132
- * No changes.
133
-
134
-
135
- ## Rails 6.0.0.rc1 (April 24, 2019) ##
136
-
137
- * No changes.
138
-
139
-
140
- ## Rails 6.0.0.beta3 (March 11, 2019) ##
33
+ *James Dabbs*
141
34
 
142
- * No changes.
143
35
 
144
-
145
- ## Rails 6.0.0.beta2 (February 25, 2019) ##
146
-
147
- * Allow skipping incineration of processed emails.
148
-
149
- This can be done by setting `config.action_mailbox.incinerate` to `false`.
150
-
151
- *Pratik Naik*
152
-
153
-
154
- ## Rails 6.0.0.beta1 (January 18, 2019) ##
155
-
156
- * Added to Rails.
157
-
158
- *DHH*
36
+ Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/actionmailbox/CHANGELOG.md) for previous changes.
data/MIT-LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2019 Basecamp, LLC
3
+ Copyright (c) 2018-2020 Basecamp, LLC
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -6,7 +6,7 @@ module ActionMailbox
6
6
  # - +body-mime+: The full RFC 822 message
7
7
  # - +timestamp+: The current time according to Mailgun as the number of seconds passed since the UNIX epoch
8
8
  # - +token+: A randomly-generated, 50-character string
9
- # - +signature+: A hexadecimal HMAC-SHA256 of the timestamp concatenated with the token, generated using the Mailgun API key
9
+ # - +signature+: A hexadecimal HMAC-SHA256 of the timestamp concatenated with the token, generated using the Mailgun Signing key
10
10
  #
11
11
  # Authenticates requests by validating their signatures.
12
12
  #
@@ -16,21 +16,21 @@ module ActionMailbox
16
16
  # - <tt>401 Unauthorized</tt> if the request's signature could not be validated, or if its timestamp is more than 2 minutes old
17
17
  # - <tt>404 Not Found</tt> if Action Mailbox is not configured to accept inbound emails from Mailgun
18
18
  # - <tt>422 Unprocessable Entity</tt> if the request is missing required parameters
19
- # - <tt>500 Server Error</tt> if the Mailgun API key is missing, or one of the Active Record database,
19
+ # - <tt>500 Server Error</tt> if the Mailgun Signing key is missing, or one of the Active Record database,
20
20
  # the Active Storage service, or the Active Job backend is misconfigured or unavailable
21
21
  #
22
22
  # == Usage
23
23
  #
24
- # 1. Give Action Mailbox your {Mailgun API key}[https://help.mailgun.com/hc/en-us/articles/203380100-Where-can-I-find-my-API-key-and-SMTP-credentials-]
24
+ # 1. Give Action Mailbox your Mailgun Signing key (which you can find under Settings -> Security & Users -> API security in Mailgun)
25
25
  # so it can authenticate requests to the Mailgun ingress.
26
26
  #
27
- # Use <tt>rails credentials:edit</tt> to add your API key to your application's encrypted credentials under
28
- # +action_mailbox.mailgun_api_key+, where Action Mailbox will automatically find it:
27
+ # Use <tt>bin/rails credentials:edit</tt> to add your Signing key to your application's encrypted credentials under
28
+ # +action_mailbox.mailgun_signing_key+, where Action Mailbox will automatically find it:
29
29
  #
30
30
  # action_mailbox:
31
- # mailgun_api_key: ...
31
+ # mailgun_signing_key: ...
32
32
  #
33
- # Alternatively, provide your API key in the +MAILGUN_INGRESS_API_KEY+ environment variable.
33
+ # Alternatively, provide your Signing key in the +MAILGUN_INGRESS_SIGNING_KEY+ environment variable.
34
34
  #
35
35
  # 2. Tell Action Mailbox to accept emails from Mailgun:
36
36
  #
@@ -46,10 +46,16 @@ module ActionMailbox
46
46
  before_action :authenticate
47
47
 
48
48
  def create
49
- ActionMailbox::InboundEmail.create_and_extract_message_id! params.require("body-mime")
49
+ ActionMailbox::InboundEmail.create_and_extract_message_id! mail
50
50
  end
51
51
 
52
52
  private
53
+ def mail
54
+ params.require("body-mime").tap do |raw_email|
55
+ raw_email.prepend("X-Original-To: ", params.require(:recipient), "\n") if params.key?(:recipient)
56
+ end
57
+ end
58
+
53
59
  def authenticate
54
60
  head :unauthorized unless authenticated?
55
61
  end
@@ -64,14 +70,28 @@ module ActionMailbox
64
70
  ).authenticated?
65
71
  else
66
72
  raise ArgumentError, <<~MESSAGE.squish
67
- Missing required Mailgun API key. Set action_mailbox.mailgun_api_key in your application's
68
- encrypted credentials or provide the MAILGUN_INGRESS_API_KEY environment variable.
73
+ Missing required Mailgun Signing key. Set action_mailbox.mailgun_signing_key in your application's
74
+ encrypted credentials or provide the MAILGUN_INGRESS_SIGNING_KEY environment variable.
69
75
  MESSAGE
70
76
  end
71
77
  end
72
78
 
73
79
  def key
74
- Rails.application.credentials.dig(:action_mailbox, :mailgun_api_key) || ENV["MAILGUN_INGRESS_API_KEY"]
80
+ if Rails.application.credentials.dig(:action_mailbox, :mailgun_api_key)
81
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
82
+ Rails.application.credentials.action_mailbox.api_key is deprecated and will be ignored in Rails 6.2.
83
+ Use Rails.application.credentials.action_mailbox.signing_key instead.
84
+ MSG
85
+ Rails.application.credentials.dig(:action_mailbox, :mailgun_api_key)
86
+ elsif ENV["MAILGUN_INGRESS_API_KEY"]
87
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
88
+ The MAILGUN_INGRESS_API_KEY environment variable is deprecated and will be ignored in Rails 6.2.
89
+ Use MAILGUN_INGRESS_SIGNING_KEY instead.
90
+ MSG
91
+ ENV["MAILGUN_INGRESS_API_KEY"]
92
+ else
93
+ Rails.application.credentials.dig(:action_mailbox, :mailgun_signing_key) || ENV["MAILGUN_INGRESS_SIGNING_KEY"]
94
+ end
75
95
  end
76
96
 
77
97
  class Authenticator
@@ -27,7 +27,7 @@ module ActionMailbox
27
27
  #
28
28
  # 2. Generate a strong password that Action Mailbox can use to authenticate requests to the Postmark ingress.
29
29
  #
30
- # Use <tt>rails credentials:edit</tt> to add the password to your application's encrypted credentials under
30
+ # Use <tt>bin/rails credentials:edit</tt> to add the password to your application's encrypted credentials under
31
31
  # +action_mailbox.ingress_password+, where Action Mailbox will automatically find it:
32
32
  #
33
33
  # action_mailbox:
@@ -27,7 +27,7 @@ module ActionMailbox
27
27
  #
28
28
  # 2. Generate a strong password that Action Mailbox can use to authenticate requests to the ingress.
29
29
  #
30
- # Use <tt>rails credentials:edit</tt> to add the password to your application's encrypted credentials under
30
+ # Use <tt>bin/rails credentials:edit</tt> to add the password to your application's encrypted credentials under
31
31
  # +action_mailbox.ingress_password+, where Action Mailbox will automatically find it:
32
32
  #
33
33
  # action_mailbox:
@@ -27,7 +27,7 @@ module ActionMailbox
27
27
  #
28
28
  # 2. Generate a strong password that Action Mailbox can use to authenticate requests to the SendGrid ingress.
29
29
  #
30
- # Use <tt>rails credentials:edit</tt> to add the password to your application's encrypted credentials under
30
+ # Use <tt>bin/rails credentials:edit</tt> to add the password to your application's encrypted credentials under
31
31
  # +action_mailbox.ingress_password+, where Action Mailbox will automatically find it:
32
32
  #
33
33
  # action_mailbox:
@@ -48,7 +48,21 @@ module ActionMailbox
48
48
  before_action :authenticate_by_password
49
49
 
50
50
  def create
51
- ActionMailbox::InboundEmail.create_and_extract_message_id! params.require(:email)
51
+ ActionMailbox::InboundEmail.create_and_extract_message_id! mail
52
+ rescue JSON::ParserError => error
53
+ logger.error error.message
54
+ head :unprocessable_entity
52
55
  end
56
+
57
+ private
58
+ def mail
59
+ params.require(:email).tap do |raw_email|
60
+ envelope["to"].each { |to| raw_email.prepend("X-Original-To: ", to, "\n") } if params.key?(:envelope)
61
+ end
62
+ end
63
+
64
+ def envelope
65
+ JSON.parse(params.require(:envelope))
66
+ end
53
67
  end
54
68
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ class Conductor::ActionMailbox::InboundEmails::SourcesController < Rails::Conductor::BaseController
5
+ def new
6
+ end
7
+
8
+ def create
9
+ inbound_email = ActionMailbox::InboundEmail.create_and_extract_message_id! params[:source]
10
+ redirect_to main_app.rails_conductor_inbound_email_url(inbound_email)
11
+ end
12
+ end
13
+ end
@@ -20,7 +20,7 @@ module Rails
20
20
 
21
21
  private
22
22
  def new_mail
23
- Mail.new(params.require(:mail).permit(:from, :to, :cc, :bcc, :in_reply_to, :subject, :body).to_h).tap do |mail|
23
+ Mail.new(params.require(:mail).permit(:from, :to, :cc, :bcc, :x_original_to, :in_reply_to, :subject, :body).to_h).tap do |mail|
24
24
  mail[:bcc]&.include_in_headers = true
25
25
  params[:mail][:attachments].to_a.each do |attachment|
26
26
  mail.add_file(filename: attachment.original_filename, content: attachment.read)
@@ -10,7 +10,7 @@ module ActionMailbox::InboundEmail::MessageId
10
10
  extend ActiveSupport::Concern
11
11
 
12
12
  class_methods do
13
- # Create a new +InboundEmail+ from the raw +source+ of the email, which be uploaded as a Active Storage
13
+ # Create a new +InboundEmail+ from the raw +source+ of the email, which is uploaded as an Active Storage
14
14
  # attachment called +raw_email+. Before the upload, extract the Message-ID from the +source+ and set
15
15
  # it as an attribute on the new +InboundEmail+.
16
16
  def create_and_extract_message_id!(source, **options)
@@ -24,7 +24,7 @@ module ActionMailbox
24
24
  #
25
25
  # inbound_email.mail.from # => 'david@loudthinking.com'
26
26
  # inbound_email.source # Returns the full rfc822 source of the email as text
27
- class InboundEmail < ActiveRecord::Base
27
+ class InboundEmail < Record
28
28
  self.table_name = "action_mailbox_inbound_emails"
29
29
 
30
30
  include Incineratable, MessageId, Routable
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActionMailbox
4
+ class Record < ActiveRecord::Base #:nodoc:
5
+ self.abstract_class = true
6
+ end
7
+ end
8
+
9
+ ActiveSupport.run_load_hooks :action_mailbox_record, ActionMailbox::Record
@@ -12,4 +12,5 @@
12
12
  <% end %>
13
13
  </table>
14
14
 
15
- <%= link_to "Deliver new inbound email", main_app.new_rails_conductor_inbound_email_path %>
15
+ <%= link_to "New inbound email by form", main_app.new_rails_conductor_inbound_email_path %> |
16
+ <%= link_to "New inbound email by source", main_app.new_rails_conductor_inbound_email_source_path %>
@@ -5,37 +5,42 @@
5
5
  <%= form_with(url: main_app.rails_conductor_inbound_emails_path, scope: :mail, local: true) do |form| %>
6
6
  <div>
7
7
  <%= form.label :from, "From" %><br>
8
- <%= form.text_field :from %>
8
+ <%= form.text_field :from, value: params[:from] %>
9
9
  </div>
10
10
 
11
11
  <div>
12
12
  <%= form.label :to, "To" %><br>
13
- <%= form.text_field :to %>
13
+ <%= form.text_field :to, value: params[:to] %>
14
14
  </div>
15
15
 
16
16
  <div>
17
17
  <%= form.label :cc, "CC" %><br>
18
- <%= form.text_field :cc %>
18
+ <%= form.text_field :cc, value: params[:cc] %>
19
19
  </div>
20
20
 
21
21
  <div>
22
22
  <%= form.label :bcc, "BCC" %><br>
23
- <%= form.text_field :bcc %>
23
+ <%= form.text_field :bcc, value: params[:bcc] %>
24
+ </div>
25
+
26
+ <div>
27
+ <%= form.label :x_original_to, "X-Original-To" %><br>
28
+ <%= form.text_field :x_original_to, value: params[:x_original_to] %>
24
29
  </div>
25
30
 
26
31
  <div>
27
32
  <%= form.label :in_reply_to, "In-Reply-To" %><br>
28
- <%= form.text_field :in_reply_to %>
33
+ <%= form.text_field :in_reply_to, value: params[:in_reply_to] %>
29
34
  </div>
30
35
 
31
36
  <div>
32
37
  <%= form.label :subject, "Subject" %><br>
33
- <%= form.text_field :subject %>
38
+ <%= form.text_field :subject, value: params[:subject] %>
34
39
  </div>
35
40
 
36
41
  <div>
37
42
  <%= form.label :body, "Body" %><br>
38
- <%= form.text_area :body, size: "40x20" %>
43
+ <%= form.text_area :body, size: "40x20", value: params[:body] %>
39
44
  </div>
40
45
 
41
46
  <div>
@@ -0,0 +1,12 @@
1
+ <% provide :title, "Deliver new inbound email by source" %>
2
+
3
+ <h1>Deliver new inbound email by source</h1>
4
+
5
+ <%= form_with(url: main_app.rails_conductor_inbound_email_sources_path, local: true) do |form| %>
6
+ <div>
7
+ <%= form.label :source, "Source" %><br>
8
+ <%= form.text_area :source, size: "80x60" %>
9
+ </div>
10
+
11
+ <%= form.submit "Deliver inbound email" %>
12
+ <% end %>
data/config/routes.rb CHANGED
@@ -17,6 +17,9 @@ Rails.application.routes.draw do
17
17
  # TODO: Should these be mounted within the engine only?
18
18
  scope "rails/conductor/action_mailbox/", module: "rails/conductor/action_mailbox" do
19
19
  resources :inbound_emails, as: :rails_conductor_inbound_emails
20
+ get "inbound_emails/sources/new", to: "inbound_emails/sources#new", as: :new_rails_conductor_inbound_email_source
21
+ post "inbound_emails/sources", to: "inbound_emails/sources#create", as: :rails_conductor_inbound_email_sources
22
+
20
23
  post ":inbound_email_id/reroute" => "reroutes#create", as: :rails_conductor_inbound_email_reroute
21
24
  end
22
25
  end
@@ -8,9 +8,9 @@ module ActionMailbox
8
8
 
9
9
  module VERSION
10
10
  MAJOR = 6
11
- MINOR = 0
12
- TINY = 6
13
- PRE = nil
11
+ MINOR = 1
12
+ TINY = 0
13
+ PRE = "rc1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -21,7 +21,7 @@ module ActionMailbox
21
21
  end
22
22
 
23
23
  def route(inbound_email)
24
- if mailbox = match_to_mailbox(inbound_email)
24
+ if mailbox = mailbox_for(inbound_email)
25
25
  mailbox.receive(inbound_email)
26
26
  else
27
27
  inbound_email.bounced!
@@ -30,12 +30,12 @@ module ActionMailbox
30
30
  end
31
31
  end
32
32
 
33
+ def mailbox_for(inbound_email)
34
+ routes.detect { |route| route.match?(inbound_email) }&.mailbox_class
35
+ end
36
+
33
37
  private
34
38
  attr_reader :routes
35
-
36
- def match_to_mailbox(inbound_email)
37
- routes.detect { |route| route.match?(inbound_email) }.try(:mailbox_class)
38
- end
39
39
  end
40
40
  end
41
41
 
@@ -17,6 +17,10 @@ module ActionMailbox
17
17
  def route(inbound_email)
18
18
  router.route(inbound_email)
19
19
  end
20
+
21
+ def mailbox_for(inbound_email)
22
+ router.mailbox_for(inbound_email)
23
+ end
20
24
  end
21
25
  end
22
26
  end
@@ -10,11 +10,58 @@ module ActionMailbox
10
10
  create_inbound_email_from_source file_fixture(fixture_name).read, status: status
11
11
  end
12
12
 
13
- # Create an +InboundEmail+ by specifying it using +Mail.new+ options. Example:
13
+ # Creates an +InboundEmail+ by specifying through options or a block.
14
+ #
15
+ # ==== Options
16
+ #
17
+ # * <tt>:status</tt> - The +status+ to set for the created +InboundEmail+.
18
+ # For possible statuses, see {its documentation}[rdoc-ref:ActionMailbox::InboundEmail].
19
+ #
20
+ # ==== Creating a simple email
21
+ #
22
+ # When you only need to set basic fields like +from+, +to+, +subject+, and
23
+ # +body+, you can pass them directly as options.
14
24
  #
15
25
  # create_inbound_email_from_mail(from: "david@loudthinking.com", subject: "Hello!")
16
- def create_inbound_email_from_mail(status: :processing, **mail_options)
17
- mail = Mail.new(mail_options)
26
+ #
27
+ # ==== Creating a multi-part email
28
+ #
29
+ # When you need to create a more intricate email, like a multi-part email
30
+ # that contains both a plaintext version and an HTML version, you can pass a
31
+ # block.
32
+ #
33
+ # create_inbound_email_from_mail do
34
+ # to "David Heinemeier Hansson <david@loudthinking.com>"
35
+ # from "Bilbo Baggins <bilbo@bagend.com>"
36
+ # subject "Come down to the Shire!"
37
+ #
38
+ # text_part do
39
+ # body "Please join us for a party at Bag End"
40
+ # end
41
+ #
42
+ # html_part do
43
+ # body "<h1>Please join us for a party at Bag End</h1>"
44
+ # end
45
+ # end
46
+ #
47
+ # As with +Mail.new+, you can also use a block parameter to define the parts
48
+ # of the message:
49
+ #
50
+ # create_inbound_email_from_mail do |mail|
51
+ # mail.to "David Heinemeier Hansson <david@loudthinking.com>"
52
+ # mail.from "Bilbo Baggins <bilbo@bagend.com>"
53
+ # mail.subject "Come down to the Shire!"
54
+ #
55
+ # mail.text_part do |part|
56
+ # part.body "Please join us for a party at Bag End"
57
+ # end
58
+ #
59
+ # mail.html_part do |part|
60
+ # part.body "<h1>Please join us for a party at Bag End</h1>"
61
+ # end
62
+ # end
63
+ def create_inbound_email_from_mail(status: :processing, **mail_options, &block)
64
+ mail = Mail.new(mail_options, &block)
18
65
  # Bcc header is not encoded by default
19
66
  mail[:bcc].include_in_headers = true if mail[:bcc]
20
67
 
@@ -33,10 +80,11 @@ module ActionMailbox
33
80
  create_inbound_email_from_fixture(*args).tap(&:route)
34
81
  end
35
82
 
36
- # Create an +InboundEmail+ using the same arguments as +create_inbound_email_from_mail+ and immediately route it to
37
- # processing.
38
- def receive_inbound_email_from_mail(**kwargs)
39
- create_inbound_email_from_mail(**kwargs).tap(&:route)
83
+ # Create an +InboundEmail+ using the same options or block as
84
+ # {create_inbound_email_from_mail}[rdoc-ref:#create_inbound_email_from_mail],
85
+ # then immediately route it for processing.
86
+ def receive_inbound_email_from_mail(**kwargs, &block)
87
+ create_inbound_email_from_mail(**kwargs, &block).tap(&:route)
40
88
  end
41
89
 
42
90
  # Create an +InboundEmail+ using the same arguments as +create_inbound_email_from_source+ and immediately route it
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators/mailbox/mailbox_generator"
4
+
5
+ module ActionMailbox
6
+ module Generators
7
+ class InstallGenerator < ::Rails::Generators::Base
8
+ source_root Rails::Generators::MailboxGenerator.source_root
9
+
10
+ def create_action_mailbox_files
11
+ say "Copying application_mailbox.rb to app/mailboxes", :green
12
+ template "application_mailbox.rb", "app/mailboxes/application_mailbox.rb"
13
+ end
14
+
15
+ def add_action_mailbox_production_environment_config
16
+ environment <<~end_of_config, env: "production"
17
+ # Prepare the ingress controller used to receive mail
18
+ # config.action_mailbox.ingress = :relay
19
+
20
+ end_of_config
21
+ end
22
+
23
+ def create_migrations
24
+ rails_command "railties:install:migrations FROM=active_storage,action_mailbox", inline: true
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,12 +1,12 @@
1
1
  Description:
2
2
  ============
3
- Stubs out a new mailbox class in app/mailboxes and invokes your template
3
+ Generates a new mailbox class in app/mailboxes and invokes your template
4
4
  engine and test framework generators.
5
5
 
6
6
  Example:
7
7
  ========
8
- rails generate mailbox inbox
8
+ bin/rails generate mailbox inbox
9
9
 
10
- creates a InboxMailbox class and test:
10
+ creates an InboxMailbox class and test:
11
11
  Mailbox: app/mailboxes/inbox_mailbox.rb
12
12
  Test: test/mailboxes/inbox_mailbox_test.rb
@@ -1,20 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- namespace :action_mailbox do
4
- # Prevent migration installation task from showing up twice.
5
- Rake::Task["install:migrations"].clear_comments
6
-
7
- desc "Copy over the migration"
8
- task install: %w[ environment run_installer copy_migrations ]
9
-
10
- task :run_installer do
11
- installer_template = File.expand_path("../rails/generators/installer.rb", __dir__)
12
- system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{installer_template}"
13
- end
14
-
15
- task :copy_migrations do
16
- Rake::Task["active_storage:install:migrations"].invoke
17
- Rake::Task["railties:install:migrations"].reenable # Otherwise you can't run 2 migration copy tasks in one invocation
18
- Rake::Task["action_mailbox:install:migrations"].invoke
19
- end
3
+ desc "Installs Action Mailbox and its dependencies"
4
+ task "action_mailbox:install" do
5
+ Rails::Command.invoke :generate, ["action_mailbox:install"]
20
6
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: actionmailbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.6
4
+ version: 6.1.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  - George Claghorn
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-09-09 00:00:00.000000000 Z
12
+ date: 2020-11-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -17,70 +17,70 @@ dependencies:
17
17
  requirements:
18
18
  - - '='
19
19
  - !ruby/object:Gem::Version
20
- version: 6.0.6
20
+ version: 6.1.0.rc1
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - '='
26
26
  - !ruby/object:Gem::Version
27
- version: 6.0.6
27
+ version: 6.1.0.rc1
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: activerecord
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - '='
33
33
  - !ruby/object:Gem::Version
34
- version: 6.0.6
34
+ version: 6.1.0.rc1
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - '='
40
40
  - !ruby/object:Gem::Version
41
- version: 6.0.6
41
+ version: 6.1.0.rc1
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: activestorage
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - '='
47
47
  - !ruby/object:Gem::Version
48
- version: 6.0.6
48
+ version: 6.1.0.rc1
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - '='
54
54
  - !ruby/object:Gem::Version
55
- version: 6.0.6
55
+ version: 6.1.0.rc1
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: activejob
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - '='
61
61
  - !ruby/object:Gem::Version
62
- version: 6.0.6
62
+ version: 6.1.0.rc1
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - '='
68
68
  - !ruby/object:Gem::Version
69
- version: 6.0.6
69
+ version: 6.1.0.rc1
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: actionpack
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - '='
75
75
  - !ruby/object:Gem::Version
76
- version: 6.0.6
76
+ version: 6.1.0.rc1
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - '='
82
82
  - !ruby/object:Gem::Version
83
- version: 6.0.6
83
+ version: 6.1.0.rc1
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: mail
86
86
  requirement: !ruby/object:Gem::Requirement
@@ -112,6 +112,7 @@ files:
112
112
  - app/controllers/action_mailbox/ingresses/postmark/inbound_emails_controller.rb
113
113
  - app/controllers/action_mailbox/ingresses/relay/inbound_emails_controller.rb
114
114
  - app/controllers/action_mailbox/ingresses/sendgrid/inbound_emails_controller.rb
115
+ - app/controllers/rails/conductor/action_mailbox/inbound_emails/sources_controller.rb
115
116
  - app/controllers/rails/conductor/action_mailbox/inbound_emails_controller.rb
116
117
  - app/controllers/rails/conductor/action_mailbox/reroutes_controller.rb
117
118
  - app/controllers/rails/conductor/base_controller.rb
@@ -122,10 +123,12 @@ files:
122
123
  - app/models/action_mailbox/inbound_email/incineratable/incineration.rb
123
124
  - app/models/action_mailbox/inbound_email/message_id.rb
124
125
  - app/models/action_mailbox/inbound_email/routable.rb
126
+ - app/models/action_mailbox/record.rb
125
127
  - app/views/layouts/rails/conductor.html.erb
126
128
  - app/views/rails/conductor/action_mailbox/inbound_emails/index.html.erb
127
129
  - app/views/rails/conductor/action_mailbox/inbound_emails/new.html.erb
128
130
  - app/views/rails/conductor/action_mailbox/inbound_emails/show.html.erb
131
+ - app/views/rails/conductor/action_mailbox/inbound_emails/sources/new.html.erb
129
132
  - config/routes.rb
130
133
  - db/migrate/20180917164000_create_action_mailbox_tables.rb
131
134
  - lib/action_mailbox.rb
@@ -146,7 +149,7 @@ files:
146
149
  - lib/action_mailbox/test_case.rb
147
150
  - lib/action_mailbox/test_helper.rb
148
151
  - lib/action_mailbox/version.rb
149
- - lib/rails/generators/installer.rb
152
+ - lib/generators/action_mailbox/install/install_generator.rb
150
153
  - lib/rails/generators/mailbox/USAGE
151
154
  - lib/rails/generators/mailbox/mailbox_generator.rb
152
155
  - lib/rails/generators/mailbox/templates/application_mailbox.rb.tt
@@ -160,12 +163,11 @@ licenses:
160
163
  - MIT
161
164
  metadata:
162
165
  bug_tracker_uri: https://github.com/rails/rails/issues
163
- changelog_uri: https://github.com/rails/rails/blob/v6.0.6/actionmailbox/CHANGELOG.md
164
- documentation_uri: https://api.rubyonrails.org/v6.0.6/
166
+ changelog_uri: https://github.com/rails/rails/blob/v6.1.0.rc1/actionmailbox/CHANGELOG.md
167
+ documentation_uri: https://api.rubyonrails.org/v6.1.0.rc1/
165
168
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
166
- source_code_uri: https://github.com/rails/rails/tree/v6.0.6/actionmailbox
167
- rubygems_mfa_required: 'true'
168
- post_install_message:
169
+ source_code_uri: https://github.com/rails/rails/tree/v6.1.0.rc1/actionmailbox
170
+ post_install_message:
169
171
  rdoc_options: []
170
172
  require_paths:
171
173
  - lib
@@ -176,12 +178,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
176
178
  version: 2.5.0
177
179
  required_rubygems_version: !ruby/object:Gem::Requirement
178
180
  requirements:
179
- - - ">="
181
+ - - ">"
180
182
  - !ruby/object:Gem::Version
181
- version: '0'
183
+ version: 1.3.1
182
184
  requirements: []
183
- rubygems_version: 3.3.3
184
- signing_key:
185
+ rubygems_version: 3.1.4
186
+ signing_key:
185
187
  specification_version: 4
186
188
  summary: Inbound email handling framework.
187
189
  test_files: []
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- say "Copying application_mailbox.rb to app/mailboxes"
4
- copy_file "#{__dir__}/mailbox/templates/application_mailbox.rb", "app/mailboxes/application_mailbox.rb"
5
-
6
- environment <<~end_of_config, env: "production"
7
- # Prepare the ingress controller used to receive mail
8
- # config.action_mailbox.ingress = :relay
9
-
10
- end_of_config