Class: Studio::MailTransport

Inherits:
Object
  • Object
show all
Defined in:
lib/studio/mail_transport.rb

Defined Under Namespace

Classes: Result

Class Method Summary collapse

Class Method Details

.configure!(env: ENV, rails_env: defined?(Rails) ? Rails.env : "development", action_mailer: defined?(ActionMailer) ? ActionMailer::Base : nil, logger: defined?(Rails) ? Rails.logger : nil, mailer_from: defined?(Studio) && Studio.respond_to?(:mailer_from) ? Studio.mailer_from : nil, resend_loader: method(:load_resend!), resend_configurer: method(:configure_resend!)) ⇒ Object

Raises:

  • (ArgumentError)


8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/studio/mail_transport.rb', line 8

def configure!(env: ENV,
               rails_env: defined?(Rails) ? Rails.env : "development",
               action_mailer: defined?(ActionMailer) ? ActionMailer::Base : nil,
               logger: defined?(Rails) ? Rails.logger : nil,
               mailer_from: defined?(Studio) && Studio.respond_to?(:mailer_from) ? Studio.mailer_from : nil,
               resend_loader: method(:load_resend!),
               resend_configurer: method(:configure_resend!))
  raise ArgumentError, "action_mailer is required" unless action_mailer

  if rails_env.to_s == "test"
    return Result.new(transport: :test, delivery_method: action_mailer.delivery_method, message: "test environment skipped")
  end

  selected = env["MAIL_TRANSPORT"].to_s.downcase
  ses_ready = selected == "ses" && present?(env["SES_SMTP_USERNAME"]) && present?(env["SES_SMTP_PASSWORD"])

  if selected == "ses" && !ses_ready
    log(logger, :warn, "[mail] MAIL_TRANSPORT=ses but SES_SMTP_USERNAME/PASSWORD missing - keeping fallback transport")
  elsif present?(selected) && !%w[ses resend].include?(selected)
    log(logger, :warn, "[mail] unknown MAIL_TRANSPORT=#{selected.inspect} - keeping fallback transport")
  end

  if ses_ready
    configure_ses!(env: env, action_mailer: action_mailer)
    region = env.fetch("SES_REGION", "us-east-2")
    log(logger, :info, "[mail] transport=SES region=#{region} from=#{mailer_from}")
    return Result.new(transport: :ses, delivery_method: action_mailer.delivery_method, message: "SES SMTP active")
  end

  if present?(env["RESEND_API_KEY"])
    resend_loader.call
    resend_configurer.call(env["RESEND_API_KEY"])
    action_mailer.delivery_method = :resend
    log(logger, :info, "[mail] transport=Resend from=#{mailer_from}")
    return Result.new(transport: :resend, delivery_method: action_mailer.delivery_method, message: "Resend active")
  end

  Result.new(transport: :default, delivery_method: action_mailer.delivery_method, message: "no transactional transport configured")
end

.configure_resend!(api_key) ⇒ Object



65
66
67
# File 'lib/studio/mail_transport.rb', line 65

def configure_resend!(api_key)
  Resend.api_key = api_key
end

.configure_ses!(env:, action_mailer:) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/studio/mail_transport.rb', line 48

def configure_ses!(env:, action_mailer:)
  region = env.fetch("SES_REGION", "us-east-2")
  action_mailer.delivery_method = :smtp
  action_mailer.smtp_settings = {
    address: env.fetch("SES_SMTP_HOST", "email-smtp.#{region}.amazonaws.com"),
    port: env.fetch("SES_SMTP_PORT", 587).to_i,
    user_name: env["SES_SMTP_USERNAME"],
    password: env["SES_SMTP_PASSWORD"],
    authentication: :login,
    enable_starttls_auto: true
  }
end

.load_resend!Object



61
62
63
# File 'lib/studio/mail_transport.rb', line 61

def load_resend!
  require "resend"
end