mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-30 18:47:51 +00:00 
			
		
		
		
	chore: Make SMTP environment variables configurable (#1868)
fixes: #1647
This commit is contained in:
		
							
								
								
									
										19
									
								
								.env.example
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								.env.example
									
									
									
									
									
								
							| @@ -39,17 +39,24 @@ POSTGRES_PASSWORD= | |||||||
| RAILS_ENV=development | RAILS_ENV=development | ||||||
| RAILS_MAX_THREADS=5 | RAILS_MAX_THREADS=5 | ||||||
|  |  | ||||||
| # Mail outgoing | # The email from which all outgoing emails are sent | ||||||
| MAILER_SENDER_EMAIL=accounts@chatwoot.com | # could user either  `email@yourdomain.com` or `BrandName <email@yourdomain.com>` | ||||||
| SMTP_PORT=1025 | MAILER_SENDER_EMAIL=Chatwoot <accounts@chatwoot.com> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #SMTP domain key is set up for HELO checking | ||||||
| SMTP_DOMAIN=chatwoot.com | SMTP_DOMAIN=chatwoot.com | ||||||
| # if you are running docker-compose, set SMTP_ADDRESS value as "mailhog", | # the default value is set "mailhog" and is used by docker-compose for development environments, | ||||||
| # else set the value as "localhost" | # Set the value as "localhost" or your SMTP address in other environments | ||||||
| SMTP_ADDRESS=mailhog | SMTP_ADDRESS=mailhog | ||||||
|  | SMTP_PORT=1025 | ||||||
| SMTP_USERNAME= | SMTP_USERNAME= | ||||||
| SMTP_PASSWORD= | SMTP_PASSWORD= | ||||||
|  | # plain,login,cram_md5 | ||||||
| SMTP_AUTHENTICATION= | SMTP_AUTHENTICATION= | ||||||
| SMTP_ENABLE_STARTTLS_AUTO= | SMTP_ENABLE_STARTTLS_AUTO=true | ||||||
|  | # Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert', see http://api.rubyonrails.org/classes/ActionMailer/Base.html | ||||||
|  | SMTP_OPENSSL_VERIFY_MODE=peer | ||||||
|  |  | ||||||
| # Mail Incoming | # Mail Incoming | ||||||
| # This is the domain set for the reply emails when conversation continuity is enabled | # This is the domain set for the reply emails when conversation continuity is enabled | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| class ConversationReplyMailer < ApplicationMailer | class ConversationReplyMailer < ApplicationMailer | ||||||
|   default from: ENV.fetch('MAILER_SENDER_EMAIL', 'accounts@chatwoot.com') |   default from: ENV.fetch('MAILER_SENDER_EMAIL', 'Chatwoot <accounts@chatwoot.com>') | ||||||
|   layout :choose_layout |   layout :choose_layout | ||||||
|  |  | ||||||
|   def reply_with_summary(conversation, message_queued_time) |   def reply_with_summary(conversation, message_queued_time) | ||||||
| @@ -99,7 +99,7 @@ class ConversationReplyMailer < ApplicationMailer | |||||||
|  |  | ||||||
|   def reply_email |   def reply_email | ||||||
|     if should_use_conversation_email_address? |     if should_use_conversation_email_address? | ||||||
|       "#{assignee_name} <reply+#{@conversation.uuid}@#{current_domain}>" |       "#{assignee_name} <reply+#{@conversation.uuid}@#{@account.inbound_email_domain}>" | ||||||
|     else |     else | ||||||
|       @inbox.email_address || @agent&.email |       @inbox.email_address || @agent&.email | ||||||
|     end |     end | ||||||
| @@ -107,24 +107,28 @@ class ConversationReplyMailer < ApplicationMailer | |||||||
|  |  | ||||||
|   def from_email_with_name |   def from_email_with_name | ||||||
|     if should_use_conversation_email_address? |     if should_use_conversation_email_address? | ||||||
|       "#{assignee_name} <#{account_support_email}>" |       "#{assignee_name} from #{@inbox.name} <#{parse_email(@account.support_email)}>" | ||||||
|     else |     else | ||||||
|       "#{assignee_name} <#{from_email_address}>" |       "#{assignee_name} from #{@inbox.name} <#{parse_email(inbox_from_email_address)}>" | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def from_email_address |   def parse_email(email_string) | ||||||
|  |     Mail::Address.new(email_string).address | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def inbox_from_email_address | ||||||
|     return @inbox.email_address if @inbox.email_address |     return @inbox.email_address if @inbox.email_address | ||||||
|  |  | ||||||
|     ENV.fetch('MAILER_SENDER_EMAIL', 'accounts@chatwoot.com') |     @account.support_email | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def custom_message_id |   def custom_message_id | ||||||
|     "<conversation/#{@conversation.uuid}/messages/#{@messages&.last&.id}@#{current_domain}>" |     "<conversation/#{@conversation.uuid}/messages/#{@messages&.last&.id}@#{@account.inbound_email_domain}>" | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def in_reply_to_email |   def in_reply_to_email | ||||||
|     conversation_reply_email_id || "<account/#{@account.id}/conversation/#{@conversation.uuid}@#{current_domain}>" |     conversation_reply_email_id || "<account/#{@account.id}/conversation/#{@conversation.uuid}@#{@account.inbound_email_domain}>" | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def conversation_reply_email_id |   def conversation_reply_email_id | ||||||
| @@ -138,19 +142,8 @@ class ConversationReplyMailer < ApplicationMailer | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   def inbound_email_enabled? |   def inbound_email_enabled? | ||||||
|     @inbound_email_enabled ||= @account.feature_enabled?('inbound_emails') && current_domain.present? && account_support_email.present? |     @inbound_email_enabled ||= @account.feature_enabled?('inbound_emails') && @account.inbound_email_domain | ||||||
|   end |                                                                                       .present? && @account.support_email.present? | ||||||
|  |  | ||||||
|   def current_domain |  | ||||||
|     @current_domain ||= @account.inbound_email_domain |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   def account_support_email |  | ||||||
|     @account_support_email ||= begin |  | ||||||
|       @account.support_email || |  | ||||||
|         GlobalConfig.get('MAILER_SUPPORT_EMAIL')['MAILER_SUPPORT_EMAIL'] || |  | ||||||
|         ENV.fetch('MAILER_SENDER_EMAIL', 'accounts@chatwoot.com') |  | ||||||
|     end |  | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def choose_layout |   def choose_layout | ||||||
|   | |||||||
| @@ -92,7 +92,7 @@ class Account < ApplicationRecord | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   def support_email |   def support_email | ||||||
|     super || GlobalConfig.get('MAILER_SUPPORT_EMAIL')['MAILER_SUPPORT_EMAIL'] || ENV.fetch('MAILER_SENDER_EMAIL', nil) |     super || GlobalConfig.get('MAILER_SUPPORT_EMAIL')['MAILER_SUPPORT_EMAIL'] || ENV.fetch('MAILER_SENDER_EMAIL', 'Chatwoot <accounts@chatwoot.com>') | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   private |   private | ||||||
|   | |||||||
| @@ -34,40 +34,6 @@ Rails.application.configure do | |||||||
|  |  | ||||||
|   config.active_job.queue_adapter = :sidekiq |   config.active_job.queue_adapter = :sidekiq | ||||||
|  |  | ||||||
|   # Email related config |  | ||||||
|   config.action_mailer.perform_caching = false |  | ||||||
|   config.action_mailer.perform_deliveries = true |  | ||||||
|   config.action_mailer.raise_delivery_errors = true |  | ||||||
|   config.action_mailer.default_url_options = { host: ENV['FRONTEND_URL'] } |  | ||||||
|  |  | ||||||
|   smtp_settings = { |  | ||||||
|     port: ENV['SMTP_PORT'] || 25, |  | ||||||
|     domain: ENV['SMTP_DOMAIN'] || 'localhost', |  | ||||||
|     address: ENV['SMTP_ADDRESS'] || 'chatwoot.com' |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   if ENV['SMTP_AUTHENTICATION'].present? |  | ||||||
|     smtp_settings[:user_name] = ENV['SMTP_USERNAME'] |  | ||||||
|     smtp_settings[:password] = ENV['SMTP_PASSWORD'] |  | ||||||
|     smtp_settings[:authentication] = ENV['SMTP_AUTHENTICATION'] |  | ||||||
|     smtp_settings[:enable_starttls_auto] = ENV['SMTP_ENABLE_STARTTLS_AUTO'] if ENV['SMTP_ENABLE_STARTTLS_AUTO'].present? |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   if ENV['LETTER_OPENER'] |  | ||||||
|     config.action_mailer.delivery_method = :letter_opener |  | ||||||
|   else |  | ||||||
|     config.action_mailer.delivery_method = :smtp |  | ||||||
|     config.action_mailer.smtp_settings = smtp_settings |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   # Set this to appropriate ingress service for which the options are : |  | ||||||
|   # :relay for Exim, Postfix, Qmail |  | ||||||
|   # :mailgun for Mailgun |  | ||||||
|   # :mandrill for Mandrill |  | ||||||
|   # :postmark for Postmark |  | ||||||
|   # :sendgrid for Sendgrid |  | ||||||
|   config.action_mailbox.ingress = ENV.fetch('RAILS_INBOUND_EMAIL_SERVICE', 'relay').to_sym |  | ||||||
|  |  | ||||||
|   Rails.application.routes.default_url_options = { host: ENV['FRONTEND_URL'] } |   Rails.application.routes.default_url_options = { host: ENV['FRONTEND_URL'] } | ||||||
|  |  | ||||||
|   # Print deprecation notices to the Rails logger. |   # Print deprecation notices to the Rails logger. | ||||||
|   | |||||||
| @@ -76,7 +76,7 @@ Rails.application.configure do | |||||||
|   # Use a different logger for distributed setups. |   # Use a different logger for distributed setups. | ||||||
|   # require 'syslog/logger' |   # require 'syslog/logger' | ||||||
|   # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') |   # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') | ||||||
|    |  | ||||||
|   if ActiveModel::Type::Boolean.new.cast(ENV.fetch('RAILS_LOG_TO_STDOUT', true)) |   if ActiveModel::Type::Boolean.new.cast(ENV.fetch('RAILS_LOG_TO_STDOUT', true)) | ||||||
|     logger           = ActiveSupport::Logger.new($stdout) |     logger           = ActiveSupport::Logger.new($stdout) | ||||||
|     logger.formatter = config.log_formatter |     logger.formatter = config.log_formatter | ||||||
| @@ -98,17 +98,6 @@ Rails.application.configure do | |||||||
|   # Set this to true and configure the email server for immediate delivery to raise delivery errors. |   # Set this to true and configure the email server for immediate delivery to raise delivery errors. | ||||||
|   # config.action_mailer.raise_delivery_errors = false |   # config.action_mailer.raise_delivery_errors = false | ||||||
|  |  | ||||||
|   # Chatwoot production settings |  | ||||||
|   config.action_mailer.default_url_options = { host: ENV['FRONTEND_URL'] } |  | ||||||
|   config.action_mailer.smtp_settings = { |  | ||||||
|     address: ENV['SMTP_ADDRESS'], |  | ||||||
|     port: ENV['SMTP_PORT'] || 587, |  | ||||||
|     user_name: ENV['SMTP_USERNAME'], |  | ||||||
|     password: ENV['SMTP_PASSWORD'], |  | ||||||
|     authentication: :login, |  | ||||||
|     enable_starttls_auto: true |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   # Set this to appropriate ingress service for which the options are : |   # Set this to appropriate ingress service for which the options are : | ||||||
|   # :relay for Exim, Postfix, Qmail |   # :relay for Exim, Postfix, Qmail | ||||||
|   # :mailgun for Mailgun |   # :mailgun for Mailgun | ||||||
|   | |||||||
| @@ -54,31 +54,9 @@ Rails.application.configure do | |||||||
|   # Use a real queuing backend for Active Job (and separate queues per environment) |   # Use a real queuing backend for Active Job (and separate queues per environment) | ||||||
|   # config.active_job.queue_adapter     = :resque |   # config.active_job.queue_adapter     = :resque | ||||||
|   # config.active_job.queue_name_prefix = "chatwoot_#{Rails.env}" |   # config.active_job.queue_name_prefix = "chatwoot_#{Rails.env}" | ||||||
|   config.action_mailer.perform_caching = false |  | ||||||
|   config.action_mailer.default_url_options = { host: ENV['FRONTEND_URL'] } |  | ||||||
|   config.action_mailer.smtp_settings = { |  | ||||||
|     address: ENV['SMTP_ADDRESS'], |  | ||||||
|     port: 587, |  | ||||||
|     user_name: ENV['SMTP_USERNAME'], # Your SMTP user |  | ||||||
|     password: ENV['SMTP_PASSWORD'], # Your SMTP password |  | ||||||
|     authentication: :login, |  | ||||||
|     enable_starttls_auto: true |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   Rails.application.routes.default_url_options = { host: ENV['FRONTEND_URL'] } |   Rails.application.routes.default_url_options = { host: ENV['FRONTEND_URL'] } | ||||||
|  |  | ||||||
|   # Ignore bad email addresses and do not raise email delivery errors. |  | ||||||
|   # Set this to true and configure the email server for immediate delivery to raise delivery errors. |  | ||||||
|   # config.action_mailer.raise_delivery_errors = false |  | ||||||
|  |  | ||||||
|   # Set this to appropriate ingress service for which the options are : |  | ||||||
|   # :relay for Exim, Postfix, Qmail |  | ||||||
|   # :mailgun for Mailgun |  | ||||||
|   # :mandrill for Mandrill |  | ||||||
|   # :postmark for Postmark |  | ||||||
|   # :sendgrid for Sendgrid |  | ||||||
|   config.action_mailbox.ingress = ENV.fetch('RAILS_INBOUND_EMAIL_SERVICE', 'relay').to_sym |  | ||||||
|  |  | ||||||
|   # Enable locale fallbacks for I18n (makes lookups for any locale fall back to |   # Enable locale fallbacks for I18n (makes lookups for any locale fall back to | ||||||
|   # the I18n.default_locale when a translation cannot be found). |   # the I18n.default_locale when a translation cannot be found). | ||||||
|   config.i18n.fallbacks = [I18n.default_locale] |   config.i18n.fallbacks = [I18n.default_locale] | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ Devise.setup do |config| | |||||||
|   # Configure the e-mail address which will be shown in Devise::Mailer, |   # Configure the e-mail address which will be shown in Devise::Mailer, | ||||||
|   # note that it will be overwritten if you use your own mailer class |   # note that it will be overwritten if you use your own mailer class | ||||||
|   # with default "from" parameter. |   # with default "from" parameter. | ||||||
|   config.mailer_sender = ENV.fetch('MAILER_SENDER_EMAIL', 'accounts@chatwoot.com') |   config.mailer_sender = ENV.fetch('MAILER_SENDER_EMAIL', 'Chatwoot <accounts@chatwoot.com>') | ||||||
|  |  | ||||||
|   # Configure the class responsible to send e-mails. |   # Configure the class responsible to send e-mails. | ||||||
|   # config.mailer = 'Devise::Mailer' |   # config.mailer = 'Devise::Mailer' | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								config/initializers/mailer.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								config/initializers/mailer.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | Rails.application.configure do | ||||||
|  |   ######################################### | ||||||
|  |   # Configuration Related to Action Mailer | ||||||
|  |   ######################################### | ||||||
|  |  | ||||||
|  |   config.action_mailer.delivery_method = :smtp | ||||||
|  |   # We need the application frontend url to be used in our emails | ||||||
|  |   config.action_mailer.default_url_options = { host: ENV['FRONTEND_URL'] } if ENV['FRONTEND_URL'].present? | ||||||
|  |   # We load certain mailer templates from our database. This ensures changes to it is reflected immediately | ||||||
|  |   config.action_mailer.perform_caching = false | ||||||
|  |   config.action_mailer.perform_deliveries = true | ||||||
|  |   config.action_mailer.raise_delivery_errors = true | ||||||
|  |  | ||||||
|  |   # Config related to smtp | ||||||
|  |   smtp_settings = { | ||||||
|  |     domain: ENV.fetch('SMTP_DOMAIN', ''), | ||||||
|  |     address: ENV.fetch('SMTP_ADDRESS', 'localhost'), | ||||||
|  |     port: ENV.fetch('SMTP_PORT', 587) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   smtp_settings[:authentication] = ENV.fetch('SMTP_AUTHENTICATION', 'login').to_sym if ENV.fetch('SMTP_AUTHENTICATION', '').present? | ||||||
|  |   smtp_settings[:user_name] = ENV.fetch('SMTP_USERNAME', '') | ||||||
|  |   smtp_settings[:password] = ENV.fetch('SMTP_PASSWORD', '') | ||||||
|  |   smtp_settings[:enable_starttls_auto] = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SMTP_ENABLE_STARTTLS_AUTO', true)) | ||||||
|  |   smtp_settings[:openssl_verify_mode] = ENV.fetch('SMTP_OPENSSL_VERIFY_MODE', 'peer') | ||||||
|  |   smtp_settings[:ssl] = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SMTP_SSL', true)) if ENV['SMTP_SSL'] | ||||||
|  |   smtp_settings[:tls] = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SMTP_TLS', true)) if ENV['SMTP_TLS'] | ||||||
|  |  | ||||||
|  |   config.action_mailer.delivery_method = :smtp | ||||||
|  |   config.action_mailer.smtp_settings = smtp_settings | ||||||
|  |   # You can use letter opener for your local development by setting the environment variable | ||||||
|  |   config.action_mailer.delivery_method = :letter_opener if Rails.env.development? && ENV['LETTER_OPENER'] | ||||||
|  |  | ||||||
|  |   ######################################### | ||||||
|  |   # Configuration Related to Action MailBox | ||||||
|  |   ######################################### | ||||||
|  |  | ||||||
|  |   # Set this to appropriate ingress service for which the options are : | ||||||
|  |   # :relay for Exim, Postfix, Qmail | ||||||
|  |   # :mailgun for Mailgun | ||||||
|  |   # :mandrill for Mandrill | ||||||
|  |   # :postmark for Postmark | ||||||
|  |   # :sendgrid for Sendgrid | ||||||
|  |   config.action_mailbox.ingress = ENV.fetch('RAILS_INBOUND_EMAIL_SERVICE', 'relay').to_sym | ||||||
|  | end | ||||||
| @@ -45,7 +45,7 @@ RSpec.describe ConversationReplyMailer, type: :mailer do | |||||||
|       let(:mail) { described_class.reply_with_summary(message.conversation, Time.zone.now).deliver_now } |       let(:mail) { described_class.reply_with_summary(message.conversation, Time.zone.now).deliver_now } | ||||||
|  |  | ||||||
|       it 'has correct name' do |       it 'has correct name' do | ||||||
|         expect(mail[:from].display_names).to eq(['Notifications']) |         expect(mail[:from].display_names).to eq(['Notifications from Inbox']) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
| @@ -148,7 +148,7 @@ RSpec.describe ConversationReplyMailer, type: :mailer do | |||||||
|       end |       end | ||||||
|  |  | ||||||
|       it 'sets the from email to be the support email' do |       it 'sets the from email to be the support email' do | ||||||
|         expect(mail['FROM'].value).to eq("#{agent.available_name} <#{conversation.account.support_email}>") |         expect(mail['FROM'].value).to eq("#{agent.available_name} from Inbox <#{conversation.account.support_email}>") | ||||||
|         expect(mail.from).to eq([conversation.account.support_email]) |         expect(mail.from).to eq([conversation.account.support_email]) | ||||||
|       end |       end | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sojan Jose
					Sojan Jose