11# frozen_string_literal: true
2- class ReceiveEmailService < CivilService ::Service
2+ class ForwardEmailViaSesService < CivilService ::Service
33 def self . ses_client
44 @ses_client ||= Aws ::SES ::Client . new
55 end
@@ -27,7 +27,7 @@ def inner_call
2727 forward_addresses = forward_addresses_for_recipient ( recipient )
2828
2929 if forward_addresses
30- Rails . logger . debug { "Forwarding mail for #{ recipient } -> #{ forward_addresses . join ( ', ' ) } " }
30+ Rails . logger . debug { "Forwarding mail for #{ recipient } -> #{ forward_addresses . join ( ", " ) } " }
3131 forward_email ( recipient , forward_addresses )
3232 elsif intercode_address? ( recipient )
3333 Rails . logger . warn ( "Could not find matching route for #{ recipient } , sending bounce" )
@@ -68,62 +68,20 @@ def intercode_domains
6868 end
6969
7070 def forward_addresses_for_recipient ( recipient )
71- address = EmailRoute . normalize_address ( recipient )
72-
73- staff_positions = staff_positions_for_recipient ( address )
74- return staff_positions . flat_map { |sp | sp . user_con_profiles . map ( &:email ) + sp . cc_addresses } if staff_positions
75-
76- team_members = team_members_for_recipient ( address )
77- return team_members . flat_map { |tm | tm . user_con_profile . email } if team_members
78-
79- route = EmailRoute . find_by ( receiver_address : address )
80- route &.forward_addresses
81- end
82-
83- def staff_positions_for_recipient ( address )
84- convention = Convention . find_by ( domain : Mail ::Address . new ( address ) . domain )
85- return nil unless convention
86-
87- return [ convention . catch_all_staff_position ] . compact if convention . email_mode == 'staff_emails_to_catch_all'
88-
89- matched_positions =
90- convention
91- . staff_positions
92- . includes ( user_con_profiles : :user )
93- . select do |sp |
94- full_email_aliases = sp . email_aliases . map { |ea | "#{ ea } @#{ convention . domain } " }
95- destinations = [ sp . email , *full_email_aliases ] . map { |dest | EmailRoute . normalize_address ( dest ) }
96- destinations . include? ( address )
97- end
98- return matched_positions if matched_positions . any?
99-
100- [ convention . catch_all_staff_position ] . compact
101- end
102-
103- def team_members_for_recipient ( address )
104- convention = Convention . find_by ( event_mailing_list_domain : Mail ::Address . new ( address ) . domain )
105- return nil unless convention
106-
107- events =
108- convention . events . select do |event |
109- next if event . team_mailing_list_name . blank?
110- full_alias = "#{ event . team_mailing_list_name } @#{ convention . event_mailing_list_domain } "
111- EmailRoute . normalize_address ( full_alias ) == address
112- end
113- TeamMember . where ( event_id : events . map ( &:id ) ) . includes ( user_con_profile : :user ) . to_a
71+ EmailForwardingRouter . new ( recipient ) . forward_addresses
11472 end
11573
11674 def headers_for_forwarding ( forward_message )
11775 {
118- ' X-Intercode-Original-Return-Path' => forward_message . header [ ' Return-Path' ] ,
119- ' Return-Path' => "bounces@#{ mailer_host } " ,
120- ' X-Intercode-Original-Sender' => forward_message . header [ ' Sender' ] ,
121- ' Sender' => nil ,
122- ' X-Intercode-Original-Source' => forward_message . header [ ' Source' ] ,
123- ' Source' => nil ,
124- ' DKIM-Signature' => nil , # SES will re-sign the message for us
125- ' X-SES-CONFIGURATION-SET' => ' default' ,
126- ' X-Intercode-Message-ID' => message_id
76+ " X-Intercode-Original-Return-Path" => forward_message . header [ " Return-Path" ] ,
77+ " Return-Path" => "bounces@#{ mailer_host } " ,
78+ " X-Intercode-Original-Sender" => forward_message . header [ " Sender" ] ,
79+ " Sender" => nil ,
80+ " X-Intercode-Original-Source" => forward_message . header [ " Source" ] ,
81+ " Source" => nil ,
82+ " DKIM-Signature" => nil , # SES will re-sign the message for us
83+ " X-SES-CONFIGURATION-SET" => " default" ,
84+ " X-Intercode-Message-ID" => message_id
12785 }
12886 end
12987
@@ -166,8 +124,8 @@ def forward_email(original_recipient, new_recipients)
166124 begin
167125 self . class . ses_client . send_raw_email ( { raw_message : { data : forward_message . to_s } } )
168126 rescue Aws ::SES ::Errors ::InvalidParameterValue => e
169- if e . message . include? ( ' Message length is more' )
170- send_bounce ( original_recipient , bounce_type : ' MessageTooLarge' )
127+ if e . message . include? ( " Message length is more" )
128+ send_bounce ( original_recipient , bounce_type : " MessageTooLarge" )
171129 else
172130 send_bounce ( original_recipient )
173131 end
@@ -178,7 +136,7 @@ def mailer_host
178136 Rails . application . config . action_mailer . default_url_options [ :host ]
179137 end
180138
181- def send_bounce ( recipient , bounce_type : ' DoesNotExist' )
139+ def send_bounce ( recipient , bounce_type : " DoesNotExist" )
182140 self . class . ses_client . send_bounce (
183141 {
184142 original_message_id : message_id ,
0 commit comments