diff --git a/app/mailers/previews/notify_preview.rb b/app/mailers/previews/notify_preview.rb
index be8d96012cc54cf53b395070952f5cef3f74863d..c5e60ecaaddbc376f98e2be910faa04d51824e3b 100644
--- a/app/mailers/previews/notify_preview.rb
+++ b/app/mailers/previews/notify_preview.rb
@@ -61,7 +61,7 @@ def note_merge_request_email_for_diff_discussion
   end
 
   def new_mention_in_merge_request_email
-    Notify.new_mention_in_merge_request_email(user.id, issue.id, user.id).message
+    Notify.new_mention_in_merge_request_email(user.id, merge_request.id, user.id).message
   end
 
   def closed_issue_email
@@ -97,7 +97,7 @@ def new_merge_request_email
   end
 
   def closed_merge_request_email
-    Notify.closed_merge_request_email(user.id, issue.id, user.id).message
+    Notify.closed_merge_request_email(user.id, merge_request.id, user.id).message
   end
 
   def merge_request_status_email
@@ -205,14 +205,6 @@ def inactive_project_deletion_warning
     Notify.inactive_project_deletion_warning_email(project, user, '2022-04-22').message
   end
 
-  def user_auto_banned_instance_email
-    ::Notify.user_auto_banned_email(user.id, user.id, max_project_downloads: 5, within_seconds: 600).message
-  end
-
-  def user_auto_banned_namespace_email
-    ::Notify.user_auto_banned_email(user.id, user.id, max_project_downloads: 5, within_seconds: 600, group: group).message
-  end
-
   def verification_instructions_email
     Notify.verification_instructions_email(user.id, token: '123456', expires_in: 60).message
   end
@@ -220,7 +212,7 @@ def verification_instructions_email
   private
 
   def project
-    @project ||= Project.find_by_full_path('gitlab-org/gitlab-test')
+    @project ||= Project.first
   end
 
   def issue
diff --git a/config/environments/development.rb b/config/environments/development.rb
index d475a2a664228f61168ddfdb403a745307488d29..2412b09df5e67597e2a666bab66bd976ebb66b0e 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -61,7 +61,7 @@
   config.action_mailer.raise_delivery_errors = true
   # Don't make a mess when bootstrapping a development environment
   config.action_mailer.perform_deliveries = (ENV['BOOTSTRAP'] != '1')
-  config.action_mailer.preview_path = "#{Rails.root}{/ee,}/app/mailers/previews"
+  config.action_mailer.preview_path = GitlabEdition.path_glob('app/mailers/previews')
 
   config.eager_load = false
 
diff --git a/config/environments/test.rb b/config/environments/test.rb
index f4d3d2ddfdaf130aea4a86cad338c7e3763f5273..41413c55ba45fd3983b3ca1ff2621b173adf3456 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -48,6 +48,8 @@
   # ActionMailer::Base.deliveries array.
   config.action_mailer.delivery_method = :test
 
+  config.action_mailer.preview_path = GitlabEdition.path_glob('app/mailers/previews')
+
   # Print deprecation notices to the stderr
   config.active_support.deprecation = :stderr
 
diff --git a/ee/app/mailers/ee/preview/notify_preview.rb b/ee/app/mailers/ee/preview/notify_preview.rb
index a24a6fad955bb2a76364a70ac1d9fb5ea1b4dce7..50c03110b47b9020c4f99c90874885dd2e4be66d 100644
--- a/ee/app/mailers/ee/preview/notify_preview.rb
+++ b/ee/app/mailers/ee/preview/notify_preview.rb
@@ -67,6 +67,14 @@ def merge_commits_csv_email
             'filename.csv'
           ).message
         end
+
+        def user_auto_banned_instance_email
+          ::Notify.user_auto_banned_email(user.id, user.id, max_project_downloads: 5, within_seconds: 600).message
+        end
+
+        def user_auto_banned_namespace_email
+          ::Notify.user_auto_banned_email(user.id, user.id, max_project_downloads: 5, within_seconds: 600, group: group).message
+        end
       end
 
       private
diff --git a/lib/gitlab_edition.rb b/lib/gitlab_edition.rb
index 02006148a3494f7dce9c0749754645967678ded0..5e3ed35ace4d13433c2665ba85e9c6c04fa0eb96 100644
--- a/lib/gitlab_edition.rb
+++ b/lib/gitlab_edition.rb
@@ -7,6 +7,21 @@ def self.root
     Pathname.new(File.expand_path('..', __dir__))
   end
 
+  def self.path_glob(path)
+    "#{root}/#{extension_path_prefixes}#{path}"
+  end
+
+  def self.extension_path_prefixes
+    path_prefixes = extensions
+    return '' if path_prefixes.empty?
+
+    path_prefixes.map! { "#{_1}/" }
+    path_prefixes.unshift ''
+
+    # For example `{,ee/,jh/}`
+    "{#{path_prefixes.join(',')}}"
+  end
+
   def self.extensions
     if jh?
       %w[ee jh]
diff --git a/spec/lib/gitlab_edition_spec.rb b/spec/lib/gitlab_edition_spec.rb
index 0ee63279984d438f34c074bdc00bccb49799225c..46be1471896d189dd85cc5cb8a7a76dd0fd00378 100644
--- a/spec/lib/gitlab_edition_spec.rb
+++ b/spec/lib/gitlab_edition_spec.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
 require 'fast_spec_helper'
+require 'rspec-parameterized'
 
 RSpec.describe GitlabEdition do
   def remove_instance_variable(ivar)
@@ -27,7 +28,57 @@ def remove_instance_variable(ivar)
     end
   end
 
-  describe 'extensions' do
+  describe '.path_glob' do
+    using RSpec::Parameterized::TableSyntax
+
+    let(:root) { described_class.root.to_s }
+
+    subject { described_class.path_glob(path) }
+
+    before do
+      allow(described_class).to receive(:jh?).and_return(jh)
+      allow(described_class).to receive(:ee?).and_return(ee)
+    end
+
+    where(:ee, :jh, :path, :expected) do
+      false | false | nil          | ''
+      true  | false | nil          | '{,ee/}'
+      true  | true  | nil          | '{,ee/,jh/}'
+      false | true  | nil          | '{,ee/,jh/}'
+      false | false | 'app/models' | 'app/models'
+      true  | false | 'app/models' | '{,ee/}app/models'
+      true  | true  | 'app/models' | '{,ee/,jh/}app/models'
+      false | true  | 'app/models' | '{,ee/,jh/}app/models'
+    end
+
+    with_them do
+      it { is_expected.to eq("#{root}/#{expected}") }
+    end
+  end
+
+  describe '.extension_path_prefixes' do
+    using RSpec::Parameterized::TableSyntax
+
+    subject { described_class.extension_path_prefixes }
+
+    before do
+      allow(described_class).to receive(:jh?).and_return(jh)
+      allow(described_class).to receive(:ee?).and_return(ee)
+    end
+
+    where(:ee, :jh, :expected) do
+      false | false | ''
+      true  | false | '{,ee/}'
+      true  | true  | '{,ee/,jh/}'
+      false | true  | '{,ee/,jh/}'
+    end
+
+    with_them do
+      it { is_expected.to eq(expected) }
+    end
+  end
+
+  describe '.extensions' do
     context 'when .jh? is true' do
       before do
         allow(described_class).to receive(:jh?).and_return(true)
diff --git a/spec/mailers/previews_spec.rb b/spec/mailers/previews_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..14bd56e5d40f24637eb082f41c3b8d47ab8560cd
--- /dev/null
+++ b/spec/mailers/previews_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Mailer previews' do
+  # Setup needed for email previews
+  let_it_be(:group) { create(:group) }
+  let_it_be(:project) { create(:project, :repository, :import_failed, group: group, import_last_error: 'some error') }
+  let_it_be(:user) { create(:user) }
+  let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
+  let_it_be(:merge_request) { create(:merge_request, source_project: project) }
+  let_it_be(:milestone) { create(:milestone, project: project) }
+  let_it_be(:issue) { create(:issue, project: project, milestone: milestone) }
+  let_it_be(:remote_mirror) { create(:remote_mirror, project: project) }
+  let_it_be(:member) { create(:project_member, :maintainer, project: project, created_by: user) }
+
+  Gitlab.ee do
+    let_it_be(:epic) { create(:epic, group: group) }
+  end
+
+  let(:expected_kind) { [Mail::Message, ActionMailer::MessageDelivery] }
+
+  let(:pending_failures) do
+    {
+      'NotifyPreview#note_merge_request_email_for_diff_discussion' =>
+        'https://gitlab.com/gitlab-org/gitlab/-/issues/372885'
+    }
+  end
+
+  subject { preview.call(email) }
+
+  where(:preview, :email) do
+    ActionMailer::Preview.all.flat_map { |preview| preview.emails.map { |email| [preview, email] } }
+  end
+
+  with_them do
+    it do
+      issue_link = pending_failures["#{preview.name}##{email}"]
+      pending "See #{issue_link}" if issue_link
+
+      is_expected.to be_kind_of(Mail::Message).or(be_kind_of(ActionMailer::MessageDelivery))
+    end
+  end
+end
diff --git a/tests.yml b/tests.yml
index d38b05af991258418c388739bf639fe19c6bbf2e..c530ec304163896a79108e89d4272a58bf4ca631 100644
--- a/tests.yml
+++ b/tests.yml
@@ -69,3 +69,9 @@ mapping:
   - source: lib/gitlab/usage_data_counters/known_events/.+\.yml
     test: spec/lib/gitlab/usage_data_spec.rb
 
+  # Mailer previews
+  - source: (ee/)?app/mailers/previews/.+\.rb
+    test: spec/mailers/previews_spec.rb
+  - source: ee/app/mailers/ee/preview/.+\.rb
+    test: spec/mailers/previews_spec.rb
+