diff --git a/app/mailers/emails/members.rb b/app/mailers/emails/members.rb
index 6dde2e9847db95e5b408e28b8859712334c40ca1..453116902937b23f9b191ab4b5d0f11adc2c6a6f 100644
--- a/app/mailers/emails/members.rb
+++ b/app/mailers/emails/members.rb
@@ -12,6 +12,11 @@ module Emails
       @member_id = member_id
 
       admins = member_source.members.owners_and_masters.includes(:user).pluck(:notification_email)
+      # A project in a group can have no explicit owners/masters, in that case
+      # we fallbacks to the group's owners/masters.
+      if admins.empty? && member_source.respond_to?(:group) && member_source.group
+        admins = member_source.group.members.owners_and_masters.includes(:user).pluck(:notification_email)
+      end
 
       mail(to: admins,
            subject: subject("Request to join the #{member_source.human_name} #{member_source.model_name.singular}"))
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
index 1e6eb20ab39259239f9d330bf45dc53a41c3e6b3..ae55a01ebea85a375351e8e98056af2a30b38da7 100644
--- a/spec/mailers/notify_spec.rb
+++ b/spec/mailers/notify_spec.rb
@@ -401,23 +401,56 @@ describe Notify do
     end
 
     describe 'project access requested' do
-      let(:project) { create(:project) }
-      let(:user) { create(:user) }
-      let(:project_member) do
-        project.request_access(user)
-        project.members.request.find_by(user_id: user.id)
+      context 'for a project in a user namespace' do
+        let(:project) { create(:project).tap { |p| p.team << [p.owner, :master, p.owner] } }
+        let(:user) { create(:user) }
+        let(:project_member) do
+          project.request_access(user)
+          project.members.request.find_by(user_id: user.id)
+        end
+        subject { Notify.member_access_requested_email('project', project_member.id) }
+
+        it_behaves_like 'an email sent from GitLab'
+        it_behaves_like 'it should not have Gmail Actions links'
+        it_behaves_like "a user cannot unsubscribe through footer link"
+
+        it 'contains all the useful information' do
+          to_emails = subject.header[:to].addrs
+          expect(to_emails.size).to eq(1)
+          expect(to_emails[0].address).to eq(project.members.owners_and_masters.first.user.notification_email)
+
+          is_expected.to have_subject "Request to join the #{project.name_with_namespace} project"
+          is_expected.to have_body_text /#{project.name_with_namespace}/
+          is_expected.to have_body_text /#{namespace_project_project_members_url(project.namespace, project)}/
+          is_expected.to have_body_text /#{project_member.human_access}/
+        end
       end
-      subject { Notify.member_access_requested_email('project', project_member.id) }
 
-      it_behaves_like 'an email sent from GitLab'
-      it_behaves_like 'it should not have Gmail Actions links'
-      it_behaves_like "a user cannot unsubscribe through footer link"
+      context 'for a project in a group' do
+        let(:group_owner) { create(:user) }
+        let(:group) { create(:group).tap { |g| g.add_owner(group_owner) } }
+        let(:project) { create(:project, namespace: group) }
+        let(:user) { create(:user) }
+        let(:project_member) do
+          project.request_access(user)
+          project.members.request.find_by(user_id: user.id)
+        end
+        subject { Notify.member_access_requested_email('project', project_member.id) }
 
-      it 'contains all the useful information' do
-        is_expected.to have_subject "Request to join the #{project.name_with_namespace} project"
-        is_expected.to have_body_text /#{project.name_with_namespace}/
-        is_expected.to have_body_text /#{namespace_project_project_members_url(project.namespace, project)}/
-        is_expected.to have_body_text /#{project_member.human_access}/
+        it_behaves_like 'an email sent from GitLab'
+        it_behaves_like 'it should not have Gmail Actions links'
+        it_behaves_like "a user cannot unsubscribe through footer link"
+
+        it 'contains all the useful information' do
+          to_emails = subject.header[:to].addrs
+          expect(to_emails.size).to eq(1)
+          expect(to_emails[0].address).to eq(group.members.owners_and_masters.first.user.notification_email)
+
+          is_expected.to have_subject "Request to join the #{project.name_with_namespace} project"
+          is_expected.to have_body_text /#{project.name_with_namespace}/
+          is_expected.to have_body_text /#{namespace_project_project_members_url(project.namespace, project)}/
+          is_expected.to have_body_text /#{project_member.human_access}/
+        end
       end
     end