Dynamically supply SMTP config in Rails
There are some scenarios where you need to dynamically set the SMTP config before sending out an E-mail. E.g.
- To let the users set their SMTP config via UI and store them in database.
- To support a multi-tenants system where each tenant has its own config.
- Use different set of config for different type of E-mail.
To do this, you can load the config dynamically before a mailer action is executed. Assuming you have a "Setting" table that store the SMTP config, you can read and set them when executing a mailer action. Example:
class UserMailer < ApplicationMailer def send_notification(user) mail from: read_setting_value('SMTP_FROM'), to: 'to_email', subject: 'Subject' set_smtp end private def set_smtp smtp_settings = { address: read_setting_value('SMTP_URL'), port: read_setting_value('SMTP_PORT').to_i, domain: read_setting_value('SMTP_DOMAIN'), user_name: read_setting_value('SMTP_USERNAME'), password: read_setting_value('SMTP_PASSWORD'), authentication: read_setting_value('SMTP_AUTHENTICATION'), enable_starttls_auto: true } mail.delivery_method.settings.merge!(smtp_settings.reject { |_k, v| v.blank? }) end def read_setting_value(name) setting = Setting.find_by_name(name) setting&.value end end
AI Summary
Chrome On-device AI
2025-02-08 11:54:09
Share Article