受信メール

GitLabには受信メールに基づくいくつかの機能があります:

  • メールで返信:GitLabユーザーが通知メールに返信することで、イシューやマージリクエストにコメントできるようになります。
  • メールによる新規イシュー: GitLabユーザーがユーザー固有のメールアドレスにメールを送信することで、新規イシューを作成できるようにします。
  • メールによる新しいマージリクエスト: GitLabユーザーがユーザー指定のメールアドレスにメールを送信することで、新しいマージリクエストを作成できます。
  • サービスデスク:GitLabを通じて顧客にメールサポートを提供します。

要件

GitLabインスタンス宛のメッセージのみを受信できるメールアドレスの使用をお勧めします。GitLab用でない受信メールは拒否通知を受け取ります。

受信メールを処理するには、IMAP対応のメールアカウントが必要です。GitLabは以下の3つのストラテジーのいずれかを必要とします:

  • 電子メールのサブアドレス(推奨)
  • キャッチオールメールボックス
  • 専用メールアドレス(メールでの返信のみ対応)

それぞれのオプションについて説明します。

電子メールのサブアドレス

サブアドレスはuser+arbitrary_tag@example.com 宛のメールがuser@example.com のメールボックスに届くメールサーバーの機能です。Gmail、Googleアプリ、Yahoo!メール、Outlook.com、iCloudなどのプロバイダーや、オンプレミスで実行できるPostfixメールサーバーでサポートされています。Microsoft Exchange Server はサブアドレスをサポートしておらず、Microsoft Office 365 もデフォルトではサブアドレスをサポートしていません。

note
プロバイダーやサーバーがサブアドレスをサポートしている場合は、サブアドレスを使用することをお勧めします。専用メールアドレスは、メールによる返信機能のみをサポートしています。キャッチオールメールボックスは、GitLab 11.7の時点でサブアドレスと同じ機能をサポートしていますが、サブアドレスの方が、使用するメールアドレスが1つだけであるため、GitLab以外の目的でキャッチオールを使用することができます。

キャッチオールメールボックス

ドメイン用のキャッチオールメールボックスは、メールサーバー上に存在するどのアドレスにも一致しないドメイン宛のすべてのメールメッセージを受信します。

GitLab 11.7では、キャッチオールメールボックスはメールサブアドレスと同じ機能をサポートしていますが、メールサブアドレスは引き続き推奨しています。

専用メールアドレス

このソリューションを設定するには、GitLab通知に対するユーザーの返信を受け取るための専用メールアドレスを作成する必要があります。しかし、この方法は返信のみをサポートし、受信メールの他の機能はサポートしません。

受け取れるヘッダ

GitLab 14.9 で導入された Received ヘッダを受け入れます。

設定されたメールアドレスが以下のヘッダのいずれかに存在する場合、メールは正しく処理されます(チェックされた順にソートされます):

  • To
  • Delivered-To
  • Envelope-To またはX-Envelope-To
  • Received

References ヘッダも受け付けられますが、これは特に電子メールの応答を既存のディスカッションスレッドに関連付けるために使用されます。メールによるイシューの作成には使用されません。

GitLab 14.6以降では、サービスデスクは受け入れられたヘッダもチェックします。

通常、”To “フィールドには主な受信者のメールアドレスが含まれます。しかし、以下の場合、設定されたGitLabのメールアドレスが含まれないことがあります:

  • アドレスが “CC” フィールドに入っている場合。
  • すべて返信」の場合、アドレスが含まれています。
  • メールは転送されました。

Received ヘッダーには複数のメールアドレスを含めることができます。これらは表示された順にチェックされます。最初に一致したものが使用されます。

拒否されたヘッダ

自動メールシステムからの不要なイシュー作成を防ぐため、GitLabは以下のヘッダーを含むすべての受信メールを無視します:

  • Auto-Submitted を含むメールを無視します。no
  • X-Autoreply 以外の値でyes

設定

受信メールにGmail / Google Appsを使用する場合は、IMAPアクセスを有効にし、セキュリティの低いアプリがアカウントにアクセスできるようにするか、2段階認証をオンにして アプリのパスワードを使用するようにしてください。

Office 365を使用し、二要素認証が有効になっている場合は、メールボックスの通常のパスワードの代わりにアプリのパスワードを使用していることを確認してください。

UbuntuでIMAPアクセス付きの基本的なPostfixメールサーバーをセットアップするには、Postfixセットアップドキュメントに従ってください。

セキュリティ

caution
受信メールのドメイン指定にご注意ください。

たとえば、会社のトップレベルドメインがhooli.com だとします。社内の全従業員がGoogle Apps経由でこのドメインのメールアドレスを持っており、社内の非公開Slackインスタンスに登録するには有効な@hooli.com メールアドレスが必要です。

で公開GitLabインスタンスもhooli.com ホストしていて、受信メールのドメインを , に設定して hooli.comいる場合、攻撃者はSlackにサインアップするときのメールとしてプロジェクト固有のアドレスを使うことで、”Create new issue by email” や“Create new merge request by email” 機能を悪用することができます。この場合、確認メールが送信され、攻撃者が所有するプロジェクトに新しいイシューまたはマージリクエストが作成され、攻撃者は確認リンクを選択し、御社の非公開Slackインスタンスでアカウントを検証することができます。

incoming.hooli.com のようなサブドメインで受信メールを受け取り、*.hooli.com. のようなメールドメインへのアクセスのみに基づいて認証するようなサービスを採用しないようにすることをお勧めします。あるいは、hooli-gitlab.comのような GitLab のメール通信専用のドメインを使用します。

このエクスプロイトの実例については、GitLabイシュー#30366を参照してください。

caution
スパムを減らすように設定されたメールサーバーを使いましょう。例えばデフォルトの設定で動いているPostfixメールサーバーは悪用される可能性があります。設定されたメールボックスで受信されたメッセージはすべて処理され、GitLabインスタンス宛ではないメッセージは拒否通知を受け取ります。送信者のアドレスが詐称されている場合、拒否通知は詐称されたFROM アドレスに配信され、メールサーバーの IP やドメインがブロックリストに表示される可能性があります。

Linux パッケージのインストール

  1. /etc/gitlab/gitlab.rbincoming_email セクションを見つけ、機能を有効にし、特定の IMAP サーバーとメールアカウントの詳細を記入してください(以下の例を参照)。

  2. 変更を有効にするために GitLab を再設定します:

    sudo gitlab-ctl reconfigure
       
    # 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
    sudo gitlab-ctl restart
    
  3. すべてが正しく設定されていることを確認します:

    sudo gitlab-rake gitlab:incoming_email:check
    

これでメールでの返信が機能するはずです。

セルフコンパイルによるインストール

  1. GitLabのインストールディレクトリに移動します:

    cd /home/git/gitlab
    
  2. gitlab-mail_room gem を手動でインストールします:

    gem install gitlab-mail_room
    
    note
    スレッドデッドロックを回避し、MailRoomの最新機能をサポートするためにこのステップが必要です。詳しくはこちらの説明をご覧ください。
  3. config/gitlab.ymlincoming_email セクションを見つけ、機能を有効にし、特定の IMAP サーバーとメールアカウントの詳細を記入してください(以下の例を参照)。

systemdユニットを使ってGitLabを管理する場合:

  1. gitlab.targetgitlab-mailroom.service を依存関係として追加します:

    sudo systemctl edit gitlab.target
    

    開いたエディターで以下を追加し、ファイルを保存します:

    [Unit]
    Wants=gitlab-mailroom.service
    
  2. RedisとPostgreSQLを同じマシンで実行する場合は、Redisの依存関係を追加してください。実行します:

    sudo systemctl edit gitlab-mailroom.service
    

    開いたエディターで以下を追加し、ファイルを保存します:

    [Unit]
    Wants=redis-server.service
    After=redis-server.service
    
  3. 開始gitlab-mailroom.service

    sudo systemctl start gitlab-mailroom.service
    
  4. すべてが正しく設定されていることを確認します:

    sudo -u git -H bundle exec rake gitlab:incoming_email:check RAILS_ENV=production
    

SysVのinitスクリプトを使ってGitLabを管理している場合:

  1. /etc/default/gitlab の init スクリプトでmail_room を有効にしてください:

    sudo mkdir -p /etc/default
    echo 'mail_room_enabled=true' | sudo tee -a /etc/default/gitlab
    
  2. GitLabを再起動します:

    sudo service gitlab restart
    
  3. すべてが正しく設定されていることを確認します:

    sudo -u git -H bundle exec rake gitlab:incoming_email:check RAILS_ENV=production
    

これでメールでの返信が機能するはずです。

設定例

ポストフィックス

Postfix メールサーバの設定例です。メールボックスincoming@gitlab.example.com を想定しています。

Linuxパッケージインストールの例:

gitlab_rails['incoming_email_enabled'] = true

# 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 `@`).
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

# 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

# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
# Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
gitlab_rails['incoming_email_expunge_deleted'] = true

セルフコンパイルインストールの例:

incoming_email:
    enabled: true

    # 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 `@`).
    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.
    user: "incoming"
    # Email account password
    password: "[REDACTED]"

    # IMAP server host
    host: "gitlab.example.com"
    # IMAP server port
    port: 143
    # Whether the IMAP server uses SSL
    ssl: false
    # Whether the IMAP server uses StartTLS
    start_tls: false

    # The mailbox where incoming mail will end up. Usually "inbox".
    mailbox: "inbox"
    # The IDLE command timeout.
    idle_timeout: 60

    # 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

    # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
    # Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
    expunge_deleted: true

Gmail

Gmail/Google Workspaceの設定例。メールボックスgitlab-incoming@gmail.com を想定しています。

note
incoming_email_email をGmailエイリアスアカウントにすることはできません。

Linuxパッケージインストールの例:

gitlab_rails['incoming_email_enabled'] = true

# 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 `@`).
gitlab_rails['incoming_email_address'] = "gitlab-incoming+%{key}@gmail.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'] = "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

# 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

# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
# Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
gitlab_rails['incoming_email_expunge_deleted'] = true

セルフコンパイルインストールの例:

incoming_email:
    enabled: true

    # 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 `@`).
    address: "gitlab-incoming+%{key}@gmail.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.
    user: "gitlab-incoming@gmail.com"
    # Email account password
    password: "[REDACTED]"

    # IMAP server host
    host: "imap.gmail.com"
    # IMAP server port
    port: 993
    # Whether the IMAP server uses SSL
    ssl: true
    # Whether the IMAP server uses StartTLS
    start_tls: false

    # The mailbox where incoming mail will end up. Usually "inbox".
    mailbox: "inbox"
    # The IDLE command timeout.
    idle_timeout: 60

    # 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

    # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
    # Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
    expunge_deleted: true

Microsoft Exchange Server

Microsoft Exchange Server で IMAP を有効にした場合の設定例です。Exchange はサブアドレスをサポートしていないため、2 つのオプションしかありません:

キャッチオールメールボックス

キャッチオールメールボックスincoming@exchange.example.com を想定しています。

Linuxパッケージインストールの例:

gitlab_rails['incoming_email_enabled'] = true

# 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 `@`).
# Exchange does not support sub-addressing, so a catch-all mailbox must be used.
gitlab_rails['incoming_email_address'] = "incoming-%{key}@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

# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
# Only applies to IMAP. Microsoft Graph will auto-expunge any deleted messages.
gitlab_rails['incoming_email_expunge_deleted'] = true

セルフコンパイルインストールの例:

incoming_email:
    enabled: true

    # 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 `@`).
    # Exchange does not support sub-addressing, so a catch-all mailbox must be used.
    address: "incoming-%{key}@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

    # 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

    # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
    expunge_deleted: true
専用メールアドレス
note
メールでの返信のみ対応。サービスデスクには対応しておりません。

専用メールアドレスincoming@exchange.example.comを想定しています。

Linuxパッケージインストールの例:

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

# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
gitlab_rails['incoming_email_expunge_deleted'] = true

セルフコンパイルインストールの例:

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
    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

    # 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

    # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
    expunge_deleted: true

Microsoft Office 365

IMAPを有効にしたMicrosoft Office 365の設定例です。

サブアドレスメールボックス
note
2020年9月より、Office 365にサブアドレスのサポートが追加されました。この機能はデフォルトでは有効になっておらず、PowerShellで有効にする必要があります。

この一連のPowerShellコマンドは、Office 365の組織レベルでサブアドレスを有効にします。これにより、組織内のすべてのメールボックスがサブアドレス付きメールを受信できるようになります。

サブアドレスを有効にするには

  1. PowerShell ギャラリーから ExchangeOnlineManagement モジュールをダウンロードしてインストールします。
  2. PowerShellで、以下のコマンドを実行します:

    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    Import-Module ExchangeOnlineManagement
    Connect-ExchangeOnline
    Set-OrganizationConfig -AllowPlusAddressInRecipients $true
    Disconnect-ExchangeOnline
    

この Linux パッケージ・インストールの例では、メールボックスincoming@office365.example.com を想定しています:

gitlab_rails['incoming_email_enabled'] = true

# 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 `@`).
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

# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
gitlab_rails['incoming_email_expunge_deleted'] = true

セルフコンパイルインストール用のこの例は、メールボックスincoming@office365.example.comを想定しています:

incoming_email:
    enabled: true

    # 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 `@`).
    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

    # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
    expunge_deleted: true
キャッチオールメールボックス

Linux パッケージインストール用のこの例は、キャッチオールメールボックスincoming@office365.example.com を想定しています:

gitlab_rails['incoming_email_enabled'] = true

# 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 `@`).
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

# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
gitlab_rails['incoming_email_expunge_deleted'] = true

セルフコンパイルインストール用のこの例は、キャッチオールメールボックスincoming@office365.example.comを想定しています:

incoming_email:
    enabled: true

    # 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 `@`).
    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

    # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
    expunge_deleted: true
専用メールアドレス
note
メールでの返信のみ対応。サービスデスクには対応しておりません。

Linux パッケージインストール用のこの例では、専用の電子メールアドレスincoming@office365.example.com を想定しています:

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

# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
gitlab_rails['incoming_email_expunge_deleted'] = true

セルフコンパイル・インストール用のこの例では、専用の電子メールアドレスincoming@office365.example.comを想定しています:

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

    # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
    expunge_deleted: true

Microsoft Graph

GitLab 13.11 で導入されました

GitLabはIMAPの代わりにMicrosoft Graph APIを使って受信メールを読み込むことができます。MicrosoftはBasic認証によるIMAPの使用を廃止するため、新しいMicrosoft Exchange OnlineメールボックスにはMicrosoft Graph APIが必要です。

GitLab for Microsoft Graphを設定するには、Azure Active DirectoryにOAuth 2.0アプリケーションを登録し、すべてのメールボックスに対してMail.ReadWrite の権限を与える必要があります。詳細については、MailRoomのステップバイステップガイドと Microsoftの説明を参照してください。

OAuth 2.0アプリケーションを設定する際に、以下を記録してください:

  • Azure Active Directory のテナント ID。
  • OAuth 2.0アプリケーションのクライアントID
  • OAuth 2.0アプリケーションのクライアントシークレット
メールボックスへのアクセス制限

MailRoom をサービスアカウントとして動作させるには、Azure Active Directory で作成するアプリケーションで、すべてのメールボックスでメールの読み取り/書き込みを行うようにMail.ReadWrite プロパティを設定する必要があります。

セキュリティ上の懸念を軽減するために、Microsoft のドキュメントに記載されているように、すべてのアカウントのメールボックスへのアクセスを制限するアプリケーションアクセスポリシーを設定することをお勧めします。

Linux パッケージインストール用のこの例では、以下のメールボックスを使用することを想定しています:incoming@example.onmicrosoft.com

Microsoft Graphの設定

GitLab 14.9で導入された代替Azureデプロイ。

gitlab_rails['incoming_email_enabled'] = true

# 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 `@`).
gitlab_rails['incoming_email_address'] = "incoming+%{key}@example.onmicrosoft.com"

# Email account username
gitlab_rails['incoming_email_email'] = "incoming@example.onmicrosoft.com"
gitlab_rails['incoming_email_delete_after_delivery'] = false

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
}

Microsoft Cloud for US Governmentやその他のAzureデプロイではazure_ad_endpointgraph_endpoint の設定を行います。

  • Microsoft Cloud for US Government の例:
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
}

Microsoft Graph APIは、セルフコンパイル・インストールではまだサポートされていません。詳細については、このイシューを参照してください。

暗号化された認証情報を使用

GitLab 15.9 で導入されました

受信メールの認証情報を設定ファイルにプレーンテキストで保存する代わりに、オプションで受信メールの認証情報に暗号化されたファイルを使うことができます。

前提条件:

  • 暗号化された認証情報を使用するには、まず暗号化設定を有効にする必要があります。

暗号化ファイルの設定項目は以下のとおりです:

  • user
  • password
Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb の受信メール設定が以下のようなものだった場合:

    gitlab_rails['incoming_email_email'] = "incoming-email@mail.example.com"
    gitlab_rails['incoming_email_password'] = "examplepassword"
    
  2. 暗号化されたシークレットを編集します:

    sudo gitlab-rake gitlab:incoming_email:secret:edit EDITOR=vim
    
  3. 受信メールの暗号化されていないシークレットの内容を入力します:

    user: 'incoming-email@mail.example.com'
    password: 'examplepassword'
    
  4. /etc/gitlab/gitlab.rb を編集し、emailpasswordincoming_email の設定を削除します。
  5. ファイルを保存して GitLab を再設定してください:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)

Kubernetesシークレットを使用して、受信メールのパスワードを保存します。詳細については、Helm IMAPシークレットをお読みください。

Docker
  1. docker-compose.yml の受信メール設定が以下のようなものだった場合:

    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"
    
  2. コンテナ内に入り、暗号化されたシークレットを編集します:

    sudo docker exec -t <container_name> bash
    gitlab-rake gitlab:incoming_email:secret:edit EDITOR=editor
    
  3. 受信メールの暗号化されていないシークレットの内容を入力します:

    user: 'incoming-email@mail.example.com'
    password: 'examplepassword'
    
  4. docker-compose.yml を編集し、emailpasswordincoming_email の設定を削除します。
  5. ファイルを保存して GitLab を再起動します:

    docker compose up -d
    
Self-compiled (source)
  1. /home/git/gitlab/config/gitlab.yml の受信メール設定が以下のようなものだった場合:

    production:
      incoming_email:
        user: 'incoming-email@mail.example.com'
        password: 'examplepassword'
    
  2. 暗号化されたシークレットを編集します:

    bundle exec rake gitlab:incoming_email:secret:edit EDITOR=vim RAILS_ENVIRONMENT=production
    
  3. 受信メールの暗号化されていないシークレットの内容を入力します:

    user: 'incoming-email@mail.example.com'
    password: 'examplepassword'
    
  4. /home/git/gitlab/config/gitlab.yml を編集し、userpasswordincoming_email: の設定を削除します。
  5. ファイルを保存して GitLab と Mailroom を再起動します。

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart