2020-06-23 00:09:42 +05:30
---
stage: Plan
group: Project Management
2022-11-25 23:54:43 +05:30
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
2020-06-23 00:09:42 +05:30
---
2021-06-08 01:23:25 +05:30
# Incoming email **(FREE SELF)**
2018-03-27 19:54:05 +05:30
2021-09-30 23:02:18 +05:30
GitLab has several features based on receiving incoming email messages:
2018-03-27 19:54:05 +05:30
- [Reply by Email ](reply_by_email.md ): allow GitLab users to comment on issues
2021-09-30 23:02:18 +05:30
and merge requests by replying to notification email.
2023-03-04 22:38:38 +05:30
- [New issue by email ](../user/project/issues/create_issues.md#by-sending-an-email ):
2018-03-27 19:54:05 +05:30
allow GitLab users to create a new issue by sending an email to a
user-specific email address.
2021-09-30 23:02:18 +05:30
- [New merge request by email ](../user/project/merge_requests/creating_merge_requests.md#by-sending-an-email ):
2018-03-27 19:54:05 +05:30
allow GitLab users to create a new merge request by sending an email to a
user-specific email address.
2021-09-30 23:02:18 +05:30
- [Service Desk ](../user/project/service_desk.md ): provide email support to
2020-07-28 23:09:34 +05:30
your customers through GitLab.
2018-03-27 19:54:05 +05:30
## Requirements
2021-09-04 01:27:46 +05:30
We recommend using an email address that receives **only** messages that are intended for
2021-09-30 23:02:18 +05:30
the GitLab instance. Any incoming email messages not intended for GitLab receive a reject notice.
2020-07-28 23:09:34 +05:30
2021-09-30 23:02:18 +05:30
Handling incoming email messages requires an [IMAP ](https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol )-enabled
2019-02-15 15:39:39 +05:30
email account. GitLab requires one of the following three strategies:
2018-03-27 19:54:05 +05:30
2019-02-15 15:39:39 +05:30
- Email sub-addressing (recommended)
2018-03-27 19:54:05 +05:30
- Catch-all mailbox
2019-02-15 15:39:39 +05:30
- Dedicated email address (supports Reply by Email only)
2018-03-27 19:54:05 +05:30
Let's walk through each of these options.
### Email sub-addressing
[Sub-addressing ](https://en.wikipedia.org/wiki/Email_address#Sub-addressing ) is
2021-02-22 17:27:13 +05:30
a mail server feature where any email to `user+arbitrary_tag@example.com` ends up
2019-02-15 15:39:39 +05:30
in the mailbox for `user@example.com` . It is supported by providers such as
Gmail, Google Apps, Yahoo! Mail, Outlook.com, and iCloud, as well as the
[Postfix mail server ](reply_by_email_postfix_setup.md ), which you can run on-premises.
2021-01-29 00:20:46 +05:30
Microsoft Exchange Server [does not support sub-addressing ](#microsoft-exchange-server ),
2023-01-13 00:05:48 +05:30
and Microsoft Office 365 [does not support sub-addressing by default ](#microsoft-office-365 ).
2019-02-15 15:39:39 +05:30
2021-02-22 17:27:13 +05:30
NOTE:
2019-02-15 15:39:39 +05:30
If your provider or server supports email sub-addressing, we recommend using it.
A dedicated email address only supports Reply by Email functionality.
A catch-all mailbox supports the same features as sub-addressing as of GitLab 11.7,
but sub-addressing is still preferred because only one email address is used,
leaving a catch-all available for other purposes beyond GitLab.
2018-03-27 19:54:05 +05:30
2019-02-15 15:39:39 +05:30
### Catch-all mailbox
2018-03-27 19:54:05 +05:30
2019-02-15 15:39:39 +05:30
A [catch-all mailbox ](https://en.wikipedia.org/wiki/Catch-all ) for a domain
2021-09-30 23:02:18 +05:30
receives all email messages addressed to the domain that do not match any addresses that
2019-02-15 15:39:39 +05:30
exist on the mail server.
2018-03-27 19:54:05 +05:30
2019-02-15 15:39:39 +05:30
As of GitLab 11.7, catch-all mailboxes support the same features as
email sub-addressing, but email sub-addressing remains our recommendation so that you
can reserve your catch-all mailbox for other purposes.
2018-03-27 19:54:05 +05:30
2019-02-15 15:39:39 +05:30
### Dedicated email address
2018-03-27 19:54:05 +05:30
2022-04-04 11:22:00 +05:30
To set up this solution, you must create a dedicated email
address to receive your users' replies to GitLab notifications. However,
2019-02-15 15:39:39 +05:30
this method only supports replies, and not the other features of [incoming email ](#incoming-email ).
2018-03-27 19:54:05 +05:30
2022-01-26 12:08:38 +05:30
## Accepted headers
2023-06-20 00:43:36 +05:30
> Accepting `Received` headers [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81489) in GitLab 14.9.
2022-05-07 20:08:51 +05:30
Email is processed correctly when a configured email address is present in one of the following headers
(sorted in the order they are checked):
2022-01-26 12:08:38 +05:30
- `To`
- `Delivered-To`
- `Envelope-To` or `X-Envelope-To`
2022-05-07 20:08:51 +05:30
- `Received`
2022-01-26 12:08:38 +05:30
2022-08-27 11:52:29 +05:30
The `References` header is also accepted, however it is used specifically to relate email responses to existing discussion threads. It is not used for creating issues by email.
2022-01-26 12:08:38 +05:30
In GitLab 14.6 and later, [Service Desk ](../user/project/service_desk.md )
2022-04-04 11:22:00 +05:30
also checks accepted headers.
2022-01-26 12:08:38 +05:30
Usually, the "To" field contains the email address of the primary receiver.
However, it might not include the configured GitLab email address if:
- The address is in the "CC" field.
- The address was included when using "Reply all".
- The email was forwarded.
2022-05-07 20:08:51 +05:30
The `Received` header can contain multiple email addresses. These are checked in the order that they appear.
The first match is used.
2022-04-04 11:22:00 +05:30
## Rejected headers
To prevent unwanted issue creation from automatic email systems, GitLab ignores all incoming email
containing the following headers:
- `Auto-Submitted` with a value other than `no`
- `X-Autoreply` with a value of `yes`
2018-03-27 19:54:05 +05:30
## Set it up
2021-09-30 23:02:18 +05:30
If you want to use Gmail / Google Apps for incoming email, make sure you have
2019-12-21 20:55:43 +05:30
[IMAP access enabled ](https://support.google.com/mail/answer/7126229 )
2018-03-27 19:54:05 +05:30
and [allowed less secure apps to access the account ](https://support.google.com/accounts/answer/6010255 )
or [turn-on 2-step validation ](https://support.google.com/accounts/answer/185839 )
and use [an application password ](https://support.google.com/mail/answer/185833 ).
2020-07-28 23:09:34 +05:30
If you want to use Office 365, and two-factor authentication is enabled, make sure
you're using an
2021-11-11 11:23:49 +05:30
[app password ](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9 )
2020-07-28 23:09:34 +05:30
instead of the regular password for the mailbox.
2018-03-27 19:54:05 +05:30
To set up a basic Postfix mail server with IMAP access on Ubuntu, follow the
[Postfix setup documentation ](reply_by_email_postfix_setup.md ).
2021-01-03 14:25:43 +05:30
### Security concerns
2018-03-27 19:54:05 +05:30
2021-02-22 17:27:13 +05:30
WARNING:
2020-11-24 15:15:51 +05:30
Be careful when choosing the domain used for receiving incoming email.
2018-03-27 19:54:05 +05:30
2021-01-03 14:25:43 +05:30
For example, suppose your top-level company domain is `hooli.com` .
2018-03-27 19:54:05 +05:30
All employees in your company have an email address at that domain via Google
Apps, and your company's private Slack instance requires a valid `@hooli.com`
2021-01-03 14:25:43 +05:30
email address to sign up.
2018-03-27 19:54:05 +05:30
If you also host a public-facing GitLab instance at `hooli.com` and set your
incoming email domain to `hooli.com` , an attacker could abuse the "Create new
issue by email" or
2021-09-30 23:02:18 +05:30
"[Create new merge request by email](../user/project/merge_requests/creating_merge_requests.md#by-sending-an-email)"
2018-03-27 19:54:05 +05:30
features by using a project's unique address as the email when signing up for
2020-04-08 14:13:33 +05:30
Slack. This would send a confirmation email, which would create a new issue or
2022-07-23 23:45:48 +05:30
merge request on the project owned by the attacker, allowing them to select the
2018-03-27 19:54:05 +05:30
confirmation link and validate their account on your company's private Slack
instance.
We recommend receiving incoming email on a subdomain, such as
`incoming.hooli.com` , and ensuring that you do not employ any services that
authenticate solely based on access to an email domain such as `*.hooli.com.`
Alternatively, use a dedicated domain for GitLab email communications such as
`hooli-gitlab.com` .
2020-06-23 00:09:42 +05:30
See GitLab issue [#30366 ](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30366 )
2018-03-27 19:54:05 +05:30
for a real-world example of this exploit.
2021-02-22 17:27:13 +05:30
WARNING:
2021-01-03 14:25:43 +05:30
Use a mail server that has been configured to reduce
2020-07-28 23:09:34 +05:30
spam.
A Postfix mail server that is running on a default configuration, for example,
2021-02-22 17:27:13 +05:30
can result in abuse. All messages received on the configured mailbox are processed
and messages that are not intended for the GitLab instance receive a reject notice.
If the sender's address is spoofed, the reject notice is delivered to the spoofed
2020-07-28 23:09:34 +05:30
`FROM` address, which can cause the mail server's IP or domain to appear on a block
list.
2018-03-27 19:54:05 +05:30
### Omnibus package installations
2019-07-07 11:18:12 +05:30
1. Find the `incoming_email` section in `/etc/gitlab/gitlab.rb` , enable the feature
2020-06-23 00:09:42 +05:30
and fill in the details for your specific IMAP server and email account (see [examples ](#configuration-examples ) below).
2018-03-27 19:54:05 +05:30
2019-07-07 11:18:12 +05:30
1. Reconfigure GitLab for the changes to take effect:
2019-05-18 00:54:41 +05:30
2020-03-13 15:44:24 +05:30
```shell
2019-09-30 21:07:59 +05:30
sudo gitlab-ctl reconfigure
2021-09-04 01:27:46 +05:30
# Needed when enabling or disabling for the first time but not for password changes.
# See https://gitlab.com/gitlab-org/gitlab-foss/-/issues/23560#note_61966788
2019-09-30 21:07:59 +05:30
sudo gitlab-ctl restart
```
2018-03-27 19:54:05 +05:30
2019-07-07 11:18:12 +05:30
1. Verify that everything is configured correctly:
2018-03-27 19:54:05 +05:30
2020-03-13 15:44:24 +05:30
```shell
2019-09-30 21:07:59 +05:30
sudo gitlab-rake gitlab:incoming_email:check
```
2018-03-27 19:54:05 +05:30
2019-07-07 11:18:12 +05:30
Reply by email should now be working.
2018-03-27 19:54:05 +05:30
2019-07-07 11:18:12 +05:30
### Installations from source
1. Go to the GitLab installation directory:
2020-03-13 15:44:24 +05:30
```shell
2019-09-30 21:07:59 +05:30
cd /home/git/gitlab
```
2019-05-18 00:54:41 +05:30
2022-03-02 08:16:31 +05:30
1. Install the `gitlab-mail_room` gem manually:
```shell
gem install gitlab-mail_room
```
NOTE: This step is necessary to avoid thread deadlocks and to support the latest MailRoom features. See
[this explanation ](../development/emails.md#mailroom-gem-updates ) for more details.
2019-07-07 11:18:12 +05:30
1. Find the `incoming_email` section in `config/gitlab.yml` , enable the feature
2020-06-23 00:09:42 +05:30
and fill in the details for your specific IMAP server and email account (see [examples ](#configuration-examples ) below).
2019-05-18 00:54:41 +05:30
2021-12-11 22:18:48 +05:30
If you use systemd units to manage GitLab:
1. Add `gitlab-mailroom.service` as a dependency to `gitlab.target` :
```shell
sudo systemctl edit gitlab.target
```
In the editor that opens, add the following and save the file:
```plaintext
[Unit]
Wants=gitlab-mailroom.service
```
1. If you run Redis and PostgreSQL on the same machine, you should add a
dependency on Redis. Run:
```shell
sudo systemctl edit gitlab-mailroom.service
```
In the editor that opens, add the following and save the file:
```plaintext
[Unit]
Wants=redis-server.service
After=redis-server.service
```
1. Start `gitlab-mailroom.service` :
```shell
sudo systemctl start gitlab-mailroom.service
```
1. Verify that everything is configured correctly:
```shell
sudo -u git -H bundle exec rake gitlab:incoming_email:check RAILS_ENV=production
```
If you use the SysV init script to manage GitLab:
2019-07-07 11:18:12 +05:30
1. Enable `mail_room` in the init script at `/etc/default/gitlab` :
2020-03-13 15:44:24 +05:30
```shell
2019-09-30 21:07:59 +05:30
sudo mkdir -p /etc/default
echo 'mail_room_enabled=true' | sudo tee -a /etc/default/gitlab
```
2019-07-07 11:18:12 +05:30
1. Restart GitLab:
2020-03-13 15:44:24 +05:30
```shell
2019-09-30 21:07:59 +05:30
sudo service gitlab restart
```
2019-07-07 11:18:12 +05:30
1. Verify that everything is configured correctly:
2020-03-13 15:44:24 +05:30
```shell
2019-09-30 21:07:59 +05:30
sudo -u git -H bundle exec rake gitlab:incoming_email:check RAILS_ENV=production
```
2019-07-07 11:18:12 +05:30
Reply by email should now be working.
2020-06-23 00:09:42 +05:30
### Configuration examples
2019-07-07 11:18:12 +05:30
#### Postfix
2019-12-04 20:38:33 +05:30
Example configuration for Postfix mail server. Assumes mailbox `incoming@gitlab.example.com` .
2019-07-07 11:18:12 +05:30
Example for Omnibus installs:
```ruby
gitlab_rails['incoming_email_enabled'] = true
2021-06-08 01:23:25 +05:30
# The email address including the %{key} placeholder that will be replaced to reference the
# item being replied to. This %{key} should be included in its entirety within the email
# address and not replaced by another value.
# For example: emailaddress+%{key}@gitlab.example.com.
# The placeholder must appear in the "user" part of the address (before the `@`).
2019-07-07 11:18:12 +05:30
gitlab_rails['incoming_email_address'] = "incoming+%{key}@gitlab.example.com"
# Email account username
# With third party providers, this is usually the full email address.
# With self-hosted email servers, this is usually the user part of the email address.
gitlab_rails['incoming_email_email'] = "incoming"
# Email account password
gitlab_rails['incoming_email_password'] = "[REDACTED]"
# IMAP server host
gitlab_rails['incoming_email_host'] = "gitlab.example.com"
# IMAP server port
gitlab_rails['incoming_email_port'] = 143
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = false
# Whether the IMAP server uses StartTLS
gitlab_rails['incoming_email_start_tls'] = false
# The mailbox where incoming mail will end up. Usually "inbox".
gitlab_rails['incoming_email_mailbox_name'] = "inbox"
# The IDLE command timeout.
gitlab_rails['incoming_email_idle_timeout'] = 60
2020-05-24 23:13:21 +05:30
2023-03-17 16:20:25 +05:30
# If you are using Microsoft Graph instead of IMAP, set this to false to retain
# messages in the inbox because deleted messages are auto-expunged after some time.
gitlab_rails['incoming_email_delete_after_delivery'] = true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
2023-03-17 16:20:25 +05:30
# Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
2020-05-24 23:13:21 +05:30
gitlab_rails['incoming_email_expunge_deleted'] = true
2019-07-07 11:18:12 +05:30
```
Example for source installs:
```yaml
incoming_email:
enabled: true
2018-03-27 19:54:05 +05:30
2021-04-29 21:17:54 +05:30
# The email address including the %{key} placeholder that will be replaced to reference the
# item being replied to. This %{key} should be included in its entirety within the email
# address and not replaced by another value.
2021-06-08 01:23:25 +05:30
# For example: emailaddress+%{key}@gitlab.example.com.
2021-04-29 21:17:54 +05:30
# The placeholder must appear in the "user" part of the address (before the `@` ).
2019-07-07 11:18:12 +05:30
address: "incoming+%{key}@gitlab.example.com"
2018-03-27 19:54:05 +05:30
# Email account username
2019-05-18 00:54:41 +05:30
# With third party providers, this is usually the full email address.
# With self-hosted email servers, this is usually the user part of the email address.
2019-07-07 11:18:12 +05:30
user: "incoming"
2018-03-27 19:54:05 +05:30
# Email account password
2019-07-07 11:18:12 +05:30
password: "[REDACTED]"
2018-03-27 19:54:05 +05:30
# IMAP server host
2019-07-07 11:18:12 +05:30
host: "gitlab.example.com"
2018-03-27 19:54:05 +05:30
# IMAP server port
2019-07-07 11:18:12 +05:30
port: 143
2018-03-27 19:54:05 +05:30
# Whether the IMAP server uses SSL
2019-07-07 11:18:12 +05:30
ssl: false
2019-05-18 00:54:41 +05:30
# Whether the IMAP server uses StartTLS
2019-07-07 11:18:12 +05:30
start_tls: false
2018-03-27 19:54:05 +05:30
2019-05-18 00:54:41 +05:30
# The mailbox where incoming mail will end up. Usually "inbox".
2019-07-07 11:18:12 +05:30
mailbox: "inbox"
2019-05-18 00:54:41 +05:30
# The IDLE command timeout.
2019-07-07 11:18:12 +05:30
idle_timeout: 60
2020-05-24 23:13:21 +05:30
2023-03-17 16:20:25 +05:30
# If you are using Microsoft Graph instead of IMAP, set this to false to retain
# messages in the inbox because deleted messages are auto-expunged after some time.
delete_after_delivery: true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
2023-03-17 16:20:25 +05:30
# Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
2020-05-24 23:13:21 +05:30
expunge_deleted: true
2019-07-07 11:18:12 +05:30
```
#### Gmail
2021-03-08 18:12:59 +05:30
Example configuration for Gmail/Google Workspace. Assumes mailbox `gitlab-incoming@gmail.com` .
2019-07-07 11:18:12 +05:30
2021-02-22 17:27:13 +05:30
NOTE:
2020-05-24 23:13:21 +05:30
`incoming_email_email` cannot be a Gmail alias account.
2019-07-07 11:18:12 +05:30
Example for Omnibus installs:
```ruby
gitlab_rails['incoming_email_enabled'] = true
2018-03-27 19:54:05 +05:30
2021-06-08 01:23:25 +05:30
# The email address including the %{key} placeholder that will be replaced to reference the
# item being replied to. This %{key} should be included in its entirety within the email
# address and not replaced by another value.
# For example: emailaddress+%{key}@gmail.com.
# The placeholder must appear in the "user" part of the address (before the `@`).
2019-07-07 11:18:12 +05:30
gitlab_rails['incoming_email_address'] = "gitlab-incoming+%{key}@gmail.com"
2018-03-27 19:54:05 +05:30
2019-07-07 11:18:12 +05:30
# Email account username
# With third party providers, this is usually the full email address.
# With self-hosted email servers, this is usually the user part of the email address.
gitlab_rails['incoming_email_email'] = "gitlab-incoming@gmail.com"
# Email account password
gitlab_rails['incoming_email_password'] = "[REDACTED]"
# IMAP server host
gitlab_rails['incoming_email_host'] = "imap.gmail.com"
# IMAP server port
gitlab_rails['incoming_email_port'] = 993
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = true
# Whether the IMAP server uses StartTLS
gitlab_rails['incoming_email_start_tls'] = false
# The mailbox where incoming mail will end up. Usually "inbox".
gitlab_rails['incoming_email_mailbox_name'] = "inbox"
# The IDLE command timeout.
gitlab_rails['incoming_email_idle_timeout'] = 60
2020-05-24 23:13:21 +05:30
2023-03-17 16:20:25 +05:30
# If you are using Microsoft Graph instead of IMAP, set this to false if you want to retain
# messages in the inbox because deleted messages are auto-expunged after some time.
gitlab_rails['incoming_email_delete_after_delivery'] = true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
2023-03-17 16:20:25 +05:30
# Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
2020-05-24 23:13:21 +05:30
gitlab_rails['incoming_email_expunge_deleted'] = true
2019-07-07 11:18:12 +05:30
```
Example for source installs:
```yaml
incoming_email:
enabled: true
2018-03-27 19:54:05 +05:30
2021-06-08 01:23:25 +05:30
# The email address including the %{key} placeholder that will be replaced to reference the
# item being replied to. This %{key} should be included in its entirety within the email
# address and not replaced by another value.
# For example: emailaddress+%{key}@gmail.com.
# The placeholder must appear in the "user" part of the address (before the `@` ).
2019-07-07 11:18:12 +05:30
address: "gitlab-incoming+%{key}@gmail.com"
2018-03-27 19:54:05 +05:30
2019-05-18 00:54:41 +05:30
# Email account username
2019-07-07 11:18:12 +05:30
# With third party providers, this is usually the full email address.
# With self-hosted email servers, this is usually the user part of the email address.
user: "gitlab-incoming@gmail.com"
2019-05-18 00:54:41 +05:30
# Email account password
2019-07-07 11:18:12 +05:30
password: "[REDACTED]"
2018-03-27 19:54:05 +05:30
2019-05-18 00:54:41 +05:30
# IMAP server host
2019-07-07 11:18:12 +05:30
host: "imap.gmail.com"
2019-05-18 00:54:41 +05:30
# IMAP server port
2019-07-07 11:18:12 +05:30
port: 993
2019-05-18 00:54:41 +05:30
# Whether the IMAP server uses SSL
2019-07-07 11:18:12 +05:30
ssl: true
# Whether the IMAP server uses StartTLS
start_tls: false
2019-05-30 16:15:17 +05:30
2019-07-07 11:18:12 +05:30
# The mailbox where incoming mail will end up. Usually "inbox".
mailbox: "inbox"
# The IDLE command timeout.
idle_timeout: 60
2020-05-24 23:13:21 +05:30
2023-03-17 16:20:25 +05:30
# If you are using Microsoft Graph instead of IMAP, set this to falseto retain
# messages in the inbox because deleted messages are auto-expunged after some time.
delete_after_delivery: true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
2023-03-17 16:20:25 +05:30
# Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
2020-05-24 23:13:21 +05:30
expunge_deleted: true
2019-07-07 11:18:12 +05:30
```
2019-05-30 16:15:17 +05:30
2020-04-08 14:13:33 +05:30
#### Microsoft Exchange Server
2019-05-30 16:15:17 +05:30
2021-01-29 00:20:46 +05:30
Example configurations for Microsoft Exchange Server with IMAP enabled. Because
2020-04-08 14:13:33 +05:30
Exchange does not support sub-addressing, only two options exist:
2021-01-29 00:20:46 +05:30
- [Catch-all mailbox ](#catch-all-mailbox ) (recommended for Exchange-only)
- [Dedicated email address ](#dedicated-email-address ) (supports Reply by Email only)
2020-04-08 14:13:33 +05:30
##### Catch-all mailbox
Assumes the catch-all mailbox `incoming@exchange.example.com` .
2019-05-30 16:15:17 +05:30
2019-07-07 11:18:12 +05:30
Example for Omnibus installs:
2019-05-30 16:15:17 +05:30
2019-07-07 11:18:12 +05:30
```ruby
gitlab_rails['incoming_email_enabled'] = true
2019-05-30 16:15:17 +05:30
2021-06-08 01:23:25 +05:30
# The email address including the %{key} placeholder that will be replaced to reference the
# item being replied to. This %{key} should be included in its entirety within the email
# address and not replaced by another value.
# For example: emailaddress-%{key}@exchange.example.com.
# The placeholder must appear in the "user" part of the address (before the `@`).
2019-07-07 11:18:12 +05:30
# Exchange does not support sub-addressing, so a catch-all mailbox must be used.
gitlab_rails['incoming_email_address'] = "incoming-%{key}@exchange.example.com"
2019-05-30 16:15:17 +05:30
2019-07-07 11:18:12 +05:30
# Email account username
# Typically this is the userPrincipalName (UPN)
gitlab_rails['incoming_email_email'] = "incoming@ad-domain.example.com"
# Email account password
gitlab_rails['incoming_email_password'] = "[REDACTED]"
2019-05-30 16:15:17 +05:30
2019-07-07 11:18:12 +05:30
# IMAP server host
gitlab_rails['incoming_email_host'] = "exchange.example.com"
# IMAP server port
gitlab_rails['incoming_email_port'] = 993
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
2023-03-17 16:20:25 +05:30
# Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
2022-07-16 23:28:13 +05:30
gitlab_rails['incoming_email_expunge_deleted'] = true
2019-07-07 11:18:12 +05:30
```
2019-05-30 16:15:17 +05:30
2019-07-07 11:18:12 +05:30
Example for source installs:
2019-05-30 16:15:17 +05:30
2019-07-07 11:18:12 +05:30
```yaml
incoming_email:
enabled: true
2019-05-30 16:15:17 +05:30
2021-06-08 01:23:25 +05:30
# The email address including the %{key} placeholder that will be replaced to reference the
# item being replied to. This %{key} should be included in its entirety within the email
# address and not replaced by another value.
# For example: emailaddress-%{key}@exchange.example.com.
# The placeholder must appear in the "user" part of the address (before the `@` ).
2019-07-07 11:18:12 +05:30
# Exchange does not support sub-addressing, so a catch-all mailbox must be used.
address: "incoming-%{key}@exchange.example.com"
2019-05-30 16:15:17 +05:30
2019-07-07 11:18:12 +05:30
# Email account username
# Typically this is the userPrincipalName (UPN)
user: "incoming@ad-domain.example.com"
# Email account password
password: "[REDACTED]"
2019-05-30 16:15:17 +05:30
2019-07-07 11:18:12 +05:30
# IMAP server host
host: "exchange.example.com"
# IMAP server port
port: 993
# Whether the IMAP server uses SSL
ssl: true
2022-07-16 23:28:13 +05:30
2023-03-17 16:20:25 +05:30
# If you are using Microsoft Graph instead of IMAP, set this to false to retain
# messages in the inbox since deleted messages are auto-expunged after some time.
delete_after_delivery: true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
expunge_deleted: true
2020-04-08 14:13:33 +05:30
```
2019-05-30 16:15:17 +05:30
2020-04-08 14:13:33 +05:30
##### Dedicated email address
2022-03-02 08:16:31 +05:30
NOTE:
Supports [Reply by Email ](reply_by_email.md ) only.
Cannot support [Service Desk ](../user/project/service_desk.md ).
2020-04-08 14:13:33 +05:30
Assumes the dedicated email address `incoming@exchange.example.com` .
Example for Omnibus installs:
```ruby
gitlab_rails['incoming_email_enabled'] = true
# Exchange does not support sub-addressing, and we're not using a catch-all mailbox so %{key} is not used here
gitlab_rails['incoming_email_address'] = "incoming@exchange.example.com"
# Email account username
# Typically this is the userPrincipalName (UPN)
gitlab_rails['incoming_email_email'] = "incoming@ad-domain.example.com"
# Email account password
gitlab_rails['incoming_email_password'] = "[REDACTED]"
# IMAP server host
gitlab_rails['incoming_email_host'] = "exchange.example.com"
# IMAP server port
gitlab_rails['incoming_email_port'] = 993
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
gitlab_rails['incoming_email_expunge_deleted'] = true
2020-04-08 14:13:33 +05:30
```
Example for source installs:
```yaml
incoming_email:
enabled: true
2021-01-29 00:20:46 +05:30
# Exchange does not support sub-addressing,
# and we're not using a catch-all mailbox so %{key} is not used here
2020-04-08 14:13:33 +05:30
address: "incoming@exchange.example.com"
# Email account username
# Typically this is the userPrincipalName (UPN)
user: "incoming@ad-domain.example.com"
# Email account password
password: "[REDACTED]"
# IMAP server host
host: "exchange.example.com"
# IMAP server port
port: 993
# Whether the IMAP server uses SSL
ssl: true
2022-07-16 23:28:13 +05:30
2023-03-17 16:20:25 +05:30
# If you are using Microsoft Graph instead of IMAP, set this to false to retain
# messages in the inbox since deleted messages are auto-expunged after some time.
delete_after_delivery: true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
expunge_deleted: true
2019-07-07 11:18:12 +05:30
```
2021-01-29 00:20:46 +05:30
#### Microsoft Office 365
Example configurations for Microsoft Office 365 with IMAP enabled.
##### Sub-addressing mailbox
2021-02-22 17:27:13 +05:30
NOTE:
2021-01-29 00:20:46 +05:30
As of September 2020 sub-addressing support
2021-11-11 11:23:49 +05:30
[has been added to Office 365 ](https://support.microsoft.com/en-us/office/uservoice-pages-430e1a78-e016-472a-a10f-dc2a3df3450a ). This feature is not
2021-01-29 00:20:46 +05:30
enabled by default, and must be enabled through PowerShell.
This series of PowerShell commands enables [sub-addressing ](#email-sub-addressing )
at the organization level in Office 365. This allows all mailboxes in the organization
2022-03-02 08:16:31 +05:30
to receive sub-addressed mail.
2021-01-29 00:20:46 +05:30
2022-03-02 08:16:31 +05:30
To enable sub-addressing:
2021-01-29 00:20:46 +05:30
2022-06-21 17:19:12 +05:30
1. Download and install the `ExchangeOnlineManagement` module from the [PowerShell gallery ](https://www.powershellgallery.com/packages/ExchangeOnlineManagement/2.0.5 ).
2022-03-02 08:16:31 +05:30
1. In PowerShell, run the following commands:
2021-01-29 00:20:46 +05:30
2022-03-02 08:16:31 +05:30
```powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline
Set-OrganizationConfig -AllowPlusAddressInRecipients $true
Disconnect-ExchangeOnline
```
2021-01-29 00:20:46 +05:30
This example for Omnibus GitLab assumes the mailbox `incoming@office365.example.com` :
```ruby
gitlab_rails['incoming_email_enabled'] = true
2021-06-08 01:23:25 +05:30
# The email address including the %{key} placeholder that will be replaced to reference the
# item being replied to. This %{key} should be included in its entirety within the email
# address and not replaced by another value.
# For example: emailaddress+%{key}@office365.example.com.
# The placeholder must appear in the "user" part of the address (before the `@`).
2021-01-29 00:20:46 +05:30
gitlab_rails['incoming_email_address'] = "incoming+%{key}@office365.example.com"
# Email account username
# Typically this is the userPrincipalName (UPN)
gitlab_rails['incoming_email_email'] = "incoming@office365.example.com"
# Email account password
gitlab_rails['incoming_email_password'] = "[REDACTED]"
# IMAP server host
gitlab_rails['incoming_email_host'] = "outlook.office365.com"
# IMAP server port
gitlab_rails['incoming_email_port'] = 993
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
gitlab_rails['incoming_email_expunge_deleted'] = true
2021-01-29 00:20:46 +05:30
```
This example for source installs assumes the mailbox `incoming@office365.example.com` :
```yaml
incoming_email:
enabled: true
2021-06-08 01:23:25 +05:30
# The email address including the %{key} placeholder that will be replaced to reference the
# item being replied to. This %{key} should be included in its entirety within the email
# address and not replaced by another value.
# For example: emailaddress+%{key}@office365.example.com.
# The placeholder must appear in the "user" part of the address (before the `@` ).
2021-01-29 00:20:46 +05:30
address: "incoming+%{key}@office365.example.comm"
# Email account username
# Typically this is the userPrincipalName (UPN)
user: "incoming@office365.example.comm"
# Email account password
password: "[REDACTED]"
# IMAP server host
host: "outlook.office365.com"
# IMAP server port
port: 993
# Whether the IMAP server uses SSL
ssl: true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
expunge_deleted: true
2021-01-29 00:20:46 +05:30
```
##### Catch-all mailbox
This example for Omnibus installs assumes the catch-all mailbox `incoming@office365.example.com` :
```ruby
gitlab_rails['incoming_email_enabled'] = true
2021-06-08 01:23:25 +05:30
# The email address including the %{key} placeholder that will be replaced to reference the
# item being replied to. This %{key} should be included in its entirety within the email
# address and not replaced by another value.
# For example: emailaddress-%{key}@office365.example.com.
# The placeholder must appear in the "user" part of the address (before the `@`).
2021-01-29 00:20:46 +05:30
gitlab_rails['incoming_email_address'] = "incoming-%{key}@office365.example.com"
# Email account username
# Typically this is the userPrincipalName (UPN)
gitlab_rails['incoming_email_email'] = "incoming@office365.example.com"
# Email account password
gitlab_rails['incoming_email_password'] = "[REDACTED]"
# IMAP server host
gitlab_rails['incoming_email_host'] = "outlook.office365.com"
# IMAP server port
gitlab_rails['incoming_email_port'] = 993
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
gitlab_rails['incoming_email_expunge_deleted'] = true
2021-01-29 00:20:46 +05:30
```
This example for source installs assumes the catch-all mailbox `incoming@office365.example.com` :
```yaml
incoming_email:
enabled: true
2021-06-08 01:23:25 +05:30
# The email address including the %{key} placeholder that will be replaced to reference the
# item being replied to. This %{key} should be included in its entirety within the email
# address and not replaced by another value.
# For example: emailaddress+%{key}@office365.example.com.
# The placeholder must appear in the "user" part of the address (before the `@` ).
2021-01-29 00:20:46 +05:30
address: "incoming-%{key}@office365.example.com"
# Email account username
# Typically this is the userPrincipalName (UPN)
user: "incoming@ad-domain.example.com"
# Email account password
password: "[REDACTED]"
# IMAP server host
host: "outlook.office365.com"
# IMAP server port
port: 993
# Whether the IMAP server uses SSL
ssl: true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
expunge_deleted: true
2021-01-29 00:20:46 +05:30
```
##### Dedicated email address
2022-03-02 08:16:31 +05:30
NOTE:
Supports [Reply by Email ](reply_by_email.md ) only.
Cannot support [Service Desk ](../user/project/service_desk.md ).
2021-01-29 00:20:46 +05:30
This example for Omnibus installs assumes the dedicated email address `incoming@office365.example.com` :
```ruby
gitlab_rails['incoming_email_enabled'] = true
gitlab_rails['incoming_email_address'] = "incoming@office365.example.com"
# Email account username
# Typically this is the userPrincipalName (UPN)
gitlab_rails['incoming_email_email'] = "incoming@office365.example.com"
# Email account password
gitlab_rails['incoming_email_password'] = "[REDACTED]"
# IMAP server host
gitlab_rails['incoming_email_host'] = "outlook.office365.com"
# IMAP server port
gitlab_rails['incoming_email_port'] = 993
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
gitlab_rails['incoming_email_expunge_deleted'] = true
2021-01-29 00:20:46 +05:30
```
This example for source installs assumes the dedicated email address `incoming@office365.example.com` :
```yaml
incoming_email:
enabled: true
address: "incoming@office365.example.com"
# Email account username
# Typically this is the userPrincipalName (UPN)
user: "incoming@office365.example.com"
# Email account password
password: "[REDACTED]"
# IMAP server host
host: "outlook.office365.com"
# IMAP server port
port: 993
# Whether the IMAP server uses SSL
ssl: true
2022-07-16 23:28:13 +05:30
# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
expunge_deleted: true
2021-01-29 00:20:46 +05:30
```
2021-04-29 21:17:54 +05:30
#### Microsoft Graph
2021-11-11 11:23:49 +05:30
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214900) in GitLab 13.11.
2021-04-29 21:17:54 +05:30
GitLab can read incoming email using the Microsoft Graph API instead of
2023-04-23 21:23:45 +05:30
IMAP. Because [Microsoft is deprecating IMAP usage with Basic Authentication ](https://techcommunity.microsoft.com/t5/exchange-team-blog/announcing-oauth-2-0-support-for-imap-and-smtp-auth-protocols-in/ba-p/1330432 ), the Microsoft Graph API is be required for new Microsoft Exchange Online mailboxes.
2021-04-29 21:17:54 +05:30
2023-04-23 21:23:45 +05:30
To configure GitLab for Microsoft Graph, you need to register an
OAuth 2.0 application in your Azure Active Directory that has the
2021-04-29 21:17:54 +05:30
`Mail.ReadWrite` permission for all mailboxes. See the [MailRoom step-by-step guide ](https://github.com/tpitale/mail_room/#microsoft-graph-configuration )
2022-11-25 23:54:43 +05:30
and [Microsoft instructions ](https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app )
2021-04-29 21:17:54 +05:30
for more details.
2023-04-23 21:23:45 +05:30
Record the following when you configure your OAuth 2.0 application:
2021-04-29 21:17:54 +05:30
- Tenant ID for your Azure Active Directory
2023-04-23 21:23:45 +05:30
- Client ID for your OAuth 2.0 application
- Client secret your OAuth 2.0 application
2021-04-29 21:17:54 +05:30
##### Restrict mailbox access
For MailRoom to work as a service account, the application you create
in Azure Active Directory requires that you set the `Mail.ReadWrite` property
to read/write mail in *all* mailboxes.
To mitigate security concerns, we recommend configuring an application access
policy which limits the mailbox access for all accounts, as described in
2022-11-25 23:54:43 +05:30
[Microsoft documentation ](https://learn.microsoft.com/en-us/graph/auth-limit-mailbox-access ).
2021-04-29 21:17:54 +05:30
This example for Omnibus GitLab assumes you're using the following mailbox: `incoming@example.onmicrosoft.com` :
##### Configure Microsoft Graph
2022-06-21 17:19:12 +05:30
> Alternative Azure deployments [introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5978) in GitLab 14.9.
2021-04-29 21:17:54 +05:30
```ruby
gitlab_rails['incoming_email_enabled'] = true
2021-06-08 01:23:25 +05:30
# The email address including the %{key} placeholder that will be replaced to reference the
# item being replied to. This %{key} should be included in its entirety within the email
# address and not replaced by another value.
# For example: emailaddress+%{key}@example.onmicrosoft.com.
# The placeholder must appear in the "user" part of the address (before the `@`).
2021-04-29 21:17:54 +05:30
gitlab_rails['incoming_email_address'] = "incoming+%{key}@example.onmicrosoft.com"
# Email account username
gitlab_rails['incoming_email_email'] = "incoming@example.onmicrosoft.com"
2023-03-17 16:20:25 +05:30
gitlab_rails['incoming_email_delete_after_delivery'] = false
2021-04-29 21:17:54 +05:30
gitlab_rails['incoming_email_inbox_method'] = 'microsoft_graph'
gitlab_rails['incoming_email_inbox_options'] = {
'tenant_id': '< YOUR-TENANT-ID > ',
'client_id': '< YOUR-CLIENT-ID > ',
'client_secret': '< YOUR-CLIENT-SECRET > ',
'poll_interval': 60 # Optional
}
```
2022-11-25 23:54:43 +05:30
For Microsoft Cloud for US Government or [other Azure deployments ](https://learn.microsoft.com/en-us/graph/deployments ), configure the `azure_ad_endpoint` and `graph_endpoint` settings.
2022-06-21 17:19:12 +05:30
- Example for Microsoft Cloud for US Government:
```ruby
gitlab_rails['incoming_email_inbox_options'] = {
'azure_ad_endpoint': 'https://login.microsoftonline.us',
'graph_endpoint': 'https://graph.microsoft.us',
'tenant_id': '< YOUR-TENANT-ID > ',
'client_id': '< YOUR-CLIENT-ID > ',
'client_secret': '< YOUR-CLIENT-SECRET > ',
'poll_interval': 60 # Optional
}
```
2021-04-29 21:17:54 +05:30
The Microsoft Graph API is not yet supported in source installations. See [this issue ](https://gitlab.com/gitlab-org/gitlab/-/issues/326169 ) for more details.
2023-04-23 21:23:45 +05:30
### Use encrypted credentials
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108279) in GitLab 15.9.
Instead of having the incoming email credentials stored in plaintext in the configuration files, you can optionally
use an encrypted file for the incoming email credentials.
Prerequisites:
- To use encrypted credentials, you must first enable the
[encrypted configuration ](encrypted_configuration.md ).
The supported configuration items for the encrypted file are:
- `user`
- `password`
::Tabs
:::TabTitle Linux package (Omnibus)
1. If initially your incoming email configuration in `/etc/gitlab/gitlab.rb` looked like:
```ruby
gitlab_rails['incoming_email_email'] = "incoming-email@mail.example.com"
gitlab_rails['incoming_email_password'] = "examplepassword"
```
1. Edit the encrypted secret:
```shell
sudo gitlab-rake gitlab:incoming_email:secret:edit EDITOR=vim
```
1. Enter the unencrypted contents of the incoming email secret:
```yaml
user: 'incoming-email@mail.example.com'
password: 'examplepassword'
```
1. Edit `/etc/gitlab/gitlab.rb` and remove the `incoming_email` settings for `email` and `password` .
1. Save the file and reconfigure GitLab:
```shell
sudo gitlab-ctl reconfigure
```
:::TabTitle Helm chart (Kubernetes)
Use a Kubernetes secret to store the incoming email password. For more information,
read about [Helm IMAP secrets ](https://docs.gitlab.com/charts/installation/secrets.html#imap-password-for-incoming-emails ).
:::TabTitle Docker
1. If initially your incoming email configuration in `docker-compose.yml` looked like:
```yaml
version: "3.6"
services:
gitlab:
image: 'gitlab/gitlab-ee:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
gitlab_rails['incoming_email_email'] = "incoming-email@mail.example.com"
gitlab_rails['incoming_email_password'] = "examplepassword"
```
1. Get inside the container, and edit the encrypted secret:
```shell
sudo docker exec -t < container_name > bash
gitlab-rake gitlab:incoming_email:secret:edit EDITOR=editor
```
1. Enter the unencrypted contents of the incoming email secret:
```yaml
user: 'incoming-email@mail.example.com'
password: 'examplepassword'
```
1. Edit `docker-compose.yml` and remove the `incoming_email` settings for `email` and `password` .
1. Save the file and restart GitLab:
```shell
docker compose up -d
```
:::TabTitle Self-compiled (source)
1. If initially your incoming email configuration in `/home/git/gitlab/config/gitlab.yml` looked like:
```yaml
production:
incoming_email:
user: 'incoming-email@mail.example.com'
password: 'examplepassword'
```
1. Edit the encrypted secret:
```shell
bundle exec rake gitlab:incoming_email:secret:edit EDITOR=vim RAILS_ENVIRONMENT=production
```
1. Enter the unencrypted contents of the incoming email secret:
```yaml
user: 'incoming-email@mail.example.com'
password: 'examplepassword'
```
1. Edit `/home/git/gitlab/config/gitlab.yml` and remove the `incoming_email:` settings for `user` and `password` .
1. Save the file and restart GitLab and Mailroom
```shell
# For systems running systemd
sudo systemctl restart gitlab.target
# For systems running SysV init
sudo service gitlab restart
```
::EndTabs