From d875477ee660e3e7d43a1d5d85b78c6c4ef83922 Mon Sep 17 00:00:00 2001 From: Alex Turchyn Date: Thu, 10 Aug 2023 23:35:51 +0300 Subject: [PATCH] improve SMTP configs form --- .gitignore | 1 + app/controllers/email_settings_controller.rb | 6 +++++ app/javascript/application.scss | 4 ++++ app/mailers/settings_mailer.rb | 7 ++++++ app/views/accounts/show.html.erb | 4 ++-- app/views/email_settings/index.html.erb | 21 ++++++++++++++++++ .../smtp_successful_setup.html.erb | 1 + lib/action_mailer_configs_interceptor.rb | 22 ++++++++++++++----- .../previews/settings_mailer_preview.rb | 7 ++++++ 9 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 app/mailers/settings_mailer.rb create mode 100644 app/views/settings_mailer/smtp_successful_setup.html.erb create mode 100644 spec/mailers/previews/settings_mailer_preview.rb diff --git a/.gitignore b/.gitignore index 95ad8c38..dd1db6a5 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ yarn-debug.log* /coverage /attachments /docuseal +/ee diff --git a/app/controllers/email_settings_controller.rb b/app/controllers/email_settings_controller.rb index d648f636..3412b98a 100644 --- a/app/controllers/email_settings_controller.rb +++ b/app/controllers/email_settings_controller.rb @@ -7,10 +7,16 @@ class EmailSettingsController < ApplicationController def create if @encrypted_config.update(storage_configs) + SettingsMailer.smtp_successful_setup(@encrypted_config.value['from_email']).deliver_now! + redirect_to settings_email_index_path, notice: 'Changes have been saved' else render :index, status: :unprocessable_entity end + rescue Net::SMTPError, OpenSSL::SSL::SSLError, Net::ReadTimeout => e + flash[:alert] = e.message + + render :index, status: :unprocessable_entity end private diff --git a/app/javascript/application.scss b/app/javascript/application.scss index 0c21e19d..4cb86b4f 100644 --- a/app/javascript/application.scss +++ b/app/javascript/application.scss @@ -70,3 +70,7 @@ button[disabled] .enabled { .base-radio { @apply radio bg-white radio-sm no-animation; } + +.base-select { + @apply select base-input w-full font-normal; +} diff --git a/app/mailers/settings_mailer.rb b/app/mailers/settings_mailer.rb new file mode 100644 index 00000000..2aefcf3a --- /dev/null +++ b/app/mailers/settings_mailer.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class SettingsMailer < ApplicationMailer + def smtp_successful_setup(email) + mail(to: email, subject: 'SMTP has been configured') + end +end diff --git a/app/views/accounts/show.html.erb b/app/views/accounts/show.html.erb index 0f5ec8ab..bb97c819 100644 --- a/app/views/accounts/show.html.erb +++ b/app/views/accounts/show.html.erb @@ -11,13 +11,13 @@
<%= ff.label :timezone, class: 'label' %> - <%= ff.select :timezone, nil, {}, class: 'select base-input w-full font-normal' do %> + <%= ff.select :timezone, nil, {}, class: 'base-select' do %> <%= time_zone_options_for_select(current_account.timezone) %> <% end %>
<%= ff.label :locale, 'Time format', class: 'label' %> - <%= ff.select :locale, options_for_select(controller.class::LOCALE_OPTIONS.invert, current_account.locale), {}, class: 'select base-input w-full font-normal' %> + <%= ff.select :locale, options_for_select(controller.class::LOCALE_OPTIONS.invert, current_account.locale), {}, class: 'base-select' %>
<% end %> diff --git a/app/views/email_settings/index.html.erb b/app/views/email_settings/index.html.erb index f73e5ebb..944590b1 100644 --- a/app/views/email_settings/index.html.erb +++ b/app/views/email_settings/index.html.erb @@ -25,6 +25,27 @@ <%= ff.password_field :password, value: value['password'], required: true, class: 'base-input' %> +
+
+ <%= ff.label :domain, 'Domain (optional)', class: 'label' %> + <%= ff.text_field :domain, value: value['domain'], class: 'base-input' %> +
+
+ <%= ff.label :authentication, class: 'label' %> + <%= ff.select :authentication, options_for_select([%w[Plain plain], %w[Login login], %w[CRAM-MD5 cram_md5]], value.fetch('authentication', 'plain')), { prompt: true }, required: true, class: 'base-select' %> +
+
+
+ <%= ff.label :security_label, 'SMTP Security', class: 'label' %> +
+ <% [%w[None none], %w[SSL ssl], %w[TLS tls]].each do |(label, val)| %> + <%= ff.label :security, value: val, for: "#{val}_radio", class: 'label' do %> + <%= ff.radio_button :security, val, checked: (value['security'].blank? && val == 'none') || value['security'] == val, id: "#{val}_radio", class: 'base-radio mr-2' %> + <%= label %> + <% end %> + <% end %> +
+
<%= ff.label :from_email, 'Send from Email', class: 'label' %> <%= ff.email_field :from_email, value: value['from_email'], required: true, class: 'base-input' %> diff --git a/app/views/settings_mailer/smtp_successful_setup.html.erb b/app/views/settings_mailer/smtp_successful_setup.html.erb new file mode 100644 index 00000000..371dbebe --- /dev/null +++ b/app/views/settings_mailer/smtp_successful_setup.html.erb @@ -0,0 +1 @@ +

SMTP has been successfully configured!

diff --git a/lib/action_mailer_configs_interceptor.rb b/lib/action_mailer_configs_interceptor.rb index 5ff9f2f7..16646791 100644 --- a/lib/action_mailer_configs_interceptor.rb +++ b/lib/action_mailer_configs_interceptor.rb @@ -19,11 +19,7 @@ module ActionMailerConfigsInterceptor email_configs = EncryptedConfig.find_by(key: EncryptedConfig::EMAIL_SMTP_KEY) if email_configs - message.delivery_method(:smtp, user_name: email_configs.value['username'], - password: email_configs.value['password'], - address: email_configs.value['host'], - port: email_configs.value['port'], - tls: email_configs.value['port'].to_s == '465') + message.delivery_method(:smtp, build_smtp_configs_hash(email_configs)) message.from = "#{email_configs.account.name} <#{email_configs.value['from_email']}>" else @@ -32,4 +28,20 @@ module ActionMailerConfigsInterceptor message end + + def build_smtp_configs_hash(email_configs) + value = email_configs.value + + { + user_name: value['username'], + password: value['password'], + address: value['host'], + port: value['port'], + domain: value['domain'], + authentication: value.fetch('authentication', 'plain'), + enable_starttls_auto: true, + ssl: value['security'] == 'ssl', + tls: value['security'] == 'tls' || (value['security'].blank? && value['port'].to_s == '465') + }.compact_blank + end end diff --git a/spec/mailers/previews/settings_mailer_preview.rb b/spec/mailers/previews/settings_mailer_preview.rb new file mode 100644 index 00000000..09068c01 --- /dev/null +++ b/spec/mailers/previews/settings_mailer_preview.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class SettingsMailerPreview < ActionMailer::Preview + def smtp_successful_setup + SettingsMailer.smtp_successful_setup('example@gmail.com') + end +end