diff --git a/actionmailbox/CHANGELOG.md b/actionmailbox/CHANGELOG.md index 688f017531..3a852ad7ef 100644 --- a/actionmailbox/CHANGELOG.md +++ b/actionmailbox/CHANGELOG.md @@ -1,3 +1,7 @@ +* Mailgun ingress now passes through the envelope recipient as `X-Original-To`. + + *Rikki Pitt* + * 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`. *Matthijs Vos* diff --git a/actionmailbox/app/controllers/action_mailbox/ingresses/mailgun/inbound_emails_controller.rb b/actionmailbox/app/controllers/action_mailbox/ingresses/mailgun/inbound_emails_controller.rb index 4d319dd75f..42f4fee1fa 100644 --- a/actionmailbox/app/controllers/action_mailbox/ingresses/mailgun/inbound_emails_controller.rb +++ b/actionmailbox/app/controllers/action_mailbox/ingresses/mailgun/inbound_emails_controller.rb @@ -46,10 +46,16 @@ module ActionMailbox before_action :authenticate def create - ActionMailbox::InboundEmail.create_and_extract_message_id! params.require("body-mime") + ActionMailbox::InboundEmail.create_and_extract_message_id! mail end private + def mail + params.require("body-mime").tap do |raw_email| + raw_email.prepend("X-Original-To: ", params.require(:recipient), "\n") if params.key?(:recipient) + end + end + def authenticate head :unauthorized unless authenticated? end diff --git a/actionmailbox/test/controllers/ingresses/mailgun/inbound_emails_controller_test.rb b/actionmailbox/test/controllers/ingresses/mailgun/inbound_emails_controller_test.rb index 35f66f053f..bacf573308 100644 --- a/actionmailbox/test/controllers/ingresses/mailgun/inbound_emails_controller_test.rb +++ b/actionmailbox/test/controllers/ingresses/mailgun/inbound_emails_controller_test.rb @@ -25,6 +25,25 @@ class ActionMailbox::Ingresses::Mailgun::InboundEmailsControllerTest < ActionDis assert_equal "0CB459E0-0336-41DA-BC88-E6E28C697DDB@37signals.com", inbound_email.message_id end + test "add X-Original-To to email from Mailgun" do + assert_difference -> { ActionMailbox::InboundEmail.count }, +1 do + travel_to "2018-10-09 15:15:00 EDT" + post rails_mailgun_inbound_emails_url, params: { + timestamp: 1539112500, + token: "7VwW7k6Ak7zcTwoSoNm7aTtbk1g67MKAnsYLfUB7PdszbgR5Xi", + signature: "ef24c5225322217bb065b80bb54eb4f9206d764e3e16abab07f0a64d1cf477cc", + "body-mime" => file_fixture("../files/welcome.eml").read, + recipient: "replies@example.com" + } + end + + assert_response :no_content + + inbound_email = ActionMailbox::InboundEmail.last + mail = Mail.from_source(inbound_email.raw_email.download) + assert_equal "replies@example.com", mail.header["X-Original-To"].decoded + end + test "rejecting a delayed inbound email from Mailgun" do assert_no_difference -> { ActionMailbox::InboundEmail.count } do travel_to "2018-10-09 15:26:00 EDT"