InfoGrab Docs

수신 이메일

요약

GitLab에는 수신 이메일 메시지를 기반으로 하는 여러 기능이 있습니다: GitLab 인스턴스 전용으로 오직 해당 메시지만 수신하는 이메일 주소를 사용해야 합니다. 수신 이메일 메시지를 처리하려면 IMAP을 지원하는 이메일 계정이 필요합니다.

GitLab에는 수신 이메일 메시지를 기반으로 하는 여러 기능이 있습니다:

  • 이메일로 답글: GitLab 사용자가 알림 이메일에 답장하여 이슈 및 머지 리퀘스트에 댓글을 달 수 있습니다.
  • 이메일로 새 이슈 생성: GitLab 사용자가 사용자별 이메일 주소로 이메일을 보내 새 이슈를 생성할 수 있습니다.
  • 이메일로 새 머지 리퀘스트 생성: GitLab 사용자가 사용자별 이메일 주소로 이메일을 보내 새 머지 리퀘스트를 생성할 수 있습니다.
  • Service Desk: GitLab을 통해 고객에게 이메일 지원을 제공합니다.

요구사항#

GitLab 인스턴스 전용으로 오직 해당 메시지만 수신하는 이메일 주소를 사용해야 합니다. GitLab을 위한 것이 아닌 수신 이메일 메시지는 거부 알림을 받습니다.

수신 이메일 메시지를 처리하려면 IMAP을 지원하는 이메일 계정이 필요합니다. GitLab은 다음 세 가지 전략 중 하나를 필요로 합니다:

  • 이메일 서브 주소 지정(권장)
  • Catch-all 메일박스
  • 전용 이메일 주소(이메일로 답글만 지원)

이 각 옵션을 살펴보겠습니다.

이메일 서브 주소 지정#

서브 주소 지정user+arbitrary_tag@example.com으로 보내는 이메일이 user@example.com의 메일박스로 전달되는 메일 서버 기능입니다. Gmail, Google Apps, Yahoo! Mail, Outlook.com, iCloud와 같은 공급자와 직접 운영할 수 있는 Postfix 메일 서버에서 지원됩니다. Microsoft Exchange Server는 서브 주소 지정을 지원하지 않으며, Microsoft Office 365는 기본적으로 서브 주소 지정을 지원하지 않습니다.

Note

공급자나 서버가 이메일 서브 주소 지정을 지원하는 경우 이를 사용해야 합니다. 전용 이메일 주소는 이메일로 답글 기능만 지원합니다. Catch-all 메일박스는 서브 주소 지정과 동일한 기능을 지원하지만, 하나의 이메일 주소만 사용하므로 GitLab 이외의 목적으로 Catch-all을 사용할 수 있기 때문에 서브 주소 지정이 여전히 선호됩니다.

Catch-all 메일박스#

도메인의 Catch-all 메일박스는 메일 서버에 존재하는 어떤 주소와도 일치하지 않는 도메인으로 주소가 지정된 모든 이메일 메시지를 수신합니다.

Catch-all 메일박스는 이메일 서브 주소 지정과 동일한 기능을 지원하지만, Catch-all 메일박스를 다른 목적으로 사용할 수 있도록 이메일 서브 주소 지정이 여전히 권장됩니다.

전용 이메일 주소#

이 솔루션을 설정하려면 GitLab 알림에 대한 사용자의 답장을 받기 위한 전용 이메일 주소를 생성해야 합니다. 그러나 이 방법은 답장만 지원하며 수신 이메일의 다른 기능은 지원하지 않습니다.

허용되는 헤더#

히스토리
  • GitLab 16.5에서 Cc 헤더 허용이 도입됨.
  • GitLab 17.0에서 X-Original-To 헤더 허용이 도입됨.
  • GitLab 17.6에서 X-Forwarded-To 헤더 허용이 도입됨.
  • GitLab 17.6에서 X-Delivered-To 헤더 허용이 도입됨.

구성된 이메일 주소가 다음 헤더 중 하나에 있을 때 이메일이 올바르게 처리됩니다 (확인되는 순서대로 정렬):

  • To
  • Delivered-To
  • X-Delivered-To
  • Envelope-To 또는 X-Envelope-To
  • Received
  • X-Original-To
  • X-Forwarded-To
  • Cc

References 헤더도 허용되지만, 기존 토론 스레드에 이메일 응답을 연결하는 데 특별히 사용됩니다. 이메일로 이슈를 생성하는 데는 사용되지 않습니다.

GitLab 14.6 이상에서 Service Desk도 허용되는 헤더를 확인합니다.

일반적으로 To 필드에는 기본 수신자의 이메일 주소가 포함됩니다. 그러나 다음 경우에는 구성된 GitLab 이메일 주소가 포함되지 않을 수 있습니다:

  • 주소가 BCC 필드에 있는 경우.
  • 이메일이 전달된 경우.

Received 헤더에는 여러 이메일 주소가 포함될 수 있습니다. 이는 나타나는 순서대로 확인됩니다. 첫 번째 일치 항목이 사용됩니다.

거부되는 헤더#

자동 이메일 시스템에서 원치 않는 이슈 생성을 방지하기 위해, GitLab은 다음 헤더를 포함하는 모든 수신 이메일을 무시합니다:

  • no 이외의 값을 가진 Auto-Submitted
  • yes 값을 가진 X-Autoreply

설정하기#

Gmail/Google Apps를 수신 이메일에 사용하려면 IMAP 접근이 활성화되어 있고 보안 수준이 낮은 앱이 계정에 접근 허용되어 있거나 2단계 인증을 켜고 앱 비밀번호를 사용하는지 확인하세요.

Office 365를 사용하고 2단계 인증이 활성화된 경우, 메일박스의 일반 비밀번호 대신 앱 비밀번호를 사용하고 있는지 확인하세요.

Ubuntu에서 IMAP 접근이 가능한 기본 Postfix 메일 서버를 설정하려면 Postfix 설정 문서를 따르세요.

보안 문제#

Warning

수신 이메일을 받는 데 사용되는 도메인을 선택할 때 주의하세요.

예를 들어, 최상위 회사 도메인이 hooli.com이라고 가정합니다. 회사의 모든 직원은 Google Workspace를 통해 해당 도메인의 이메일 주소를 갖고 있으며, 회사의 프라이빗 Slack 인스턴스에 가입하려면 유효한 @hooli.com 이메일 주소가 필요합니다.

hooli.com에서 공개 GitLab 인스턴스도 호스팅하고 수신 이메일 도메인을 hooli.com으로 설정하면, 공격자가 이메일로 새 이슈 생성 또는 이메일로 새 머지 리퀘스트 생성 기능을 악용하여 공격자가 소유한 프로젝트의 고유 주소를 Slack에 가입할 때의 이메일로 사용할 수 있습니다. 이렇게 하면 확인 이메일이 전송되어 프로젝트에서 새 이슈 또는 머지 리퀘스트가 생성되어 공격자가 확인 링크를 선택하여 회사의 프라이빗 Slack 인스턴스에서 계정을 검증할 수 있게 됩니다.

incoming.hooli.com과 같은 서브 도메인에서 수신 이메일을 받고 *.hooli.com.과 같은 이메일 도메인에 대한 접근에만 기반하여 인증하는 서비스를 사용하지 않는 것을 권장합니다. 또는 hooli-gitlab.com과 같은 GitLab 이메일 통신에 전용 도메인을 사용하세요.

이 취약점의 실제 사례는 GitLab 이슈 #30366을 참조하세요.

Warning

스팸을 줄이도록 구성된 메일 서버를 사용하세요. 예를 들어 기본 구성으로 실행되는 Postfix 메일 서버는 악용될 수 있습니다. 구성된 메일박스에서 수신된 모든 메시지가 처리되며 GitLab 인스턴스를 위한 것이 아닌 메시지는 거부 알림을 받습니다. 발신자 주소가 스푸핑된 경우 거부 알림이 스푸핑된 FROM 주소로 전달되어 메일 서버의 IP 또는 도메인이 차단 목록에 표시될 수 있습니다.

사용자는 수신 이메일 기능을 먼저 2단계 인증(2FA)을 사용하지 않고도 사용할 수 있습니다. 인스턴스에서 2단계 인증을 강제하더라도 마찬가지입니다.

Linux 패키지 설치#

  1. /etc/gitlab/gitlab.rb에서 incoming_email 섹션을 찾아 기능을 활성화하고 특정 IMAP 서버 및 이메일 계정에 대한 세부 정보를 입력합니다 (아래 예제를 참조하세요).

  2. 변경 사항을 적용하려면 GitLab을 재구성합니다:

    sudo gitlab-ctl reconfigure
    
    # 처음 활성화하거나 비활성화할 때는 필요하지만 비밀번호 변경에는 필요하지 않습니다.
    # 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 install gitlab-mail_room
    

    [!note] 이 단계는 스레드 교착 상태를 방지하고 최신 MailRoom 기능을 지원하기 위해 필요합니다.

  3. config/gitlab.yml에서 incoming_email 섹션을 찾아 기능을 활성화하고 특정 IMAP 서버 및 이메일 계정에 대한 세부 정보를 입력합니다 (아래 예제를 참조하세요).

systemd 유닛을 사용하여 GitLab을 관리하는 경우:

  1. gitlab-mailroom.servicegitlab.target의 의존성으로 추가합니다:

    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#

Postfix 메일 서버 구성 예제. 메일박스 incoming@gitlab.example.com을 가정합니다.

Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress+%{key}@gitlab.example.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
gitlab_rails['incoming_email_address'] = "incoming+%{key}@gitlab.example.com"

# 이메일 계정 사용자 이름
# 서드파티 공급자의 경우 일반적으로 전체 이메일 주소입니다.
# 셀프 호스팅 이메일 서버의 경우 일반적으로 이메일 주소의 사용자 부분입니다.
gitlab_rails['incoming_email_email'] = "incoming"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "gitlab.example.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 143
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = false
# IMAP 서버가 StartTLS를 사용하는지 여부
gitlab_rails['incoming_email_start_tls'] = false

# 수신 메일이 저장될 메일박스. 일반적으로 "inbox".
gitlab_rails['incoming_email_mailbox_name'] = "inbox"
# IDLE 명령 타임아웃.
gitlab_rails['incoming_email_idle_timeout'] = 60

# IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
# 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
gitlab_rails['incoming_email_delete_after_delivery'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
# IMAP에만 적용됩니다. Microsoft Graph는 삭제된 메시지를 자동으로 제거합니다.
gitlab_rails['incoming_email_expunge_deleted'] = true

소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
    # 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
    # 예: emailaddress+%{key}@gitlab.example.com.
    # 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
    address: "incoming+%{key}@gitlab.example.com"

    # 이메일 계정 사용자 이름
    # 서드파티 공급자의 경우 일반적으로 전체 이메일 주소입니다.
    # 셀프 호스팅 이메일 서버의 경우 일반적으로 이메일 주소의 사용자 부분입니다.
    user: "incoming"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "gitlab.example.com"
    # IMAP 서버 포트
    port: 143
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: false
    # IMAP 서버가 StartTLS를 사용하는지 여부
    start_tls: false

    # 수신 메일이 저장될 메일박스. 일반적으로 "inbox".
    mailbox: "inbox"
    # IDLE 명령 타임아웃.
    idle_timeout: 60

    # IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
    # 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
    delete_after_delivery: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    # IMAP에만 적용됩니다. Microsoft Graph는 삭제된 메시지를 자동으로 제거합니다.
    expunge_deleted: true

Gmail#

Gmail/Google Workspace 구성 예제. 메일박스 gitlab-incoming@gmail.com을 가정합니다.

Note

incoming_email_email은 Gmail 별칭 계정이 될 수 없습니다.

Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress+%{key}@gmail.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
gitlab_rails['incoming_email_address'] = "gitlab-incoming+%{key}@gmail.com"

# 이메일 계정 사용자 이름
# 서드파티 공급자의 경우 일반적으로 전체 이메일 주소입니다.
# 셀프 호스팅 이메일 서버의 경우 일반적으로 이메일 주소의 사용자 부분입니다.
gitlab_rails['incoming_email_email'] = "gitlab-incoming@gmail.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "imap.gmail.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true
# IMAP 서버가 StartTLS를 사용하는지 여부
gitlab_rails['incoming_email_start_tls'] = false

# 수신 메일이 저장될 메일박스. 일반적으로 "inbox".
gitlab_rails['incoming_email_mailbox_name'] = "inbox"
# IDLE 명령 타임아웃.
gitlab_rails['incoming_email_idle_timeout'] = 60

# IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
# 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
gitlab_rails['incoming_email_delete_after_delivery'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
# IMAP에만 적용됩니다. Microsoft Graph는 삭제된 메시지를 자동으로 제거합니다.
gitlab_rails['incoming_email_expunge_deleted'] = true

소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
    # 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
    # 예: emailaddress+%{key}@gmail.com.
    # 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
    address: "gitlab-incoming+%{key}@gmail.com"

    # 이메일 계정 사용자 이름
    # 서드파티 공급자의 경우 일반적으로 전체 이메일 주소입니다.
    # 셀프 호스팅 이메일 서버의 경우 일반적으로 이메일 주소의 사용자 부분입니다.
    user: "gitlab-incoming@gmail.com"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "imap.gmail.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true
    # IMAP 서버가 StartTLS를 사용하는지 여부
    start_tls: false

    # 수신 메일이 저장될 메일박스. 일반적으로 "inbox".
    mailbox: "inbox"
    # IDLE 명령 타임아웃.
    idle_timeout: 60

    # IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
    # 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
    delete_after_delivery: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    # IMAP에만 적용됩니다. Microsoft Graph는 삭제된 메시지를 자동으로 제거합니다.
    expunge_deleted: true

Microsoft Exchange Server#

IMAP이 활성화된 Microsoft Exchange Server 구성 예제. Exchange는 서브 주소 지정을 지원하지 않으므로 두 가지 옵션만 있습니다:

Catch-all 메일박스#

Catch-all 메일박스 incoming@exchange.example.com을 가정합니다.

Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress-%{key}@exchange.example.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
# Exchange는 서브 주소 지정을 지원하지 않으므로 Catch-all 메일박스를 사용해야 합니다.
gitlab_rails['incoming_email_address'] = "incoming-%{key}@exchange.example.com"

# 이메일 계정 사용자 이름
# 일반적으로 userPrincipalName(UPN)입니다.
gitlab_rails['incoming_email_email'] = "incoming@ad-domain.example.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "exchange.example.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
# IMAP에만 적용됩니다. Microsoft Graph는 삭제된 메시지를 자동으로 제거합니다.
gitlab_rails['incoming_email_expunge_deleted'] = true

소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
    # 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
    # 예: emailaddress-%{key}@exchange.example.com.
    # 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
    # Exchange는 서브 주소 지정을 지원하지 않으므로 Catch-all 메일박스를 사용해야 합니다.
    address: "incoming-%{key}@exchange.example.com"

    # 이메일 계정 사용자 이름
    # 일반적으로 userPrincipalName(UPN)입니다.
    user: "incoming@ad-domain.example.com"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "exchange.example.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true

    # IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
    # 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
    delete_after_delivery: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    expunge_deleted: true
전용 이메일 주소#
Note

이메일로 답글만 지원합니다. Service Desk를 지원할 수 없습니다.

전용 이메일 주소 incoming@exchange.example.com을 가정합니다.

Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# Exchange는 서브 주소 지정을 지원하지 않으며 Catch-all 메일박스를 사용하지 않으므로 %{key}가 사용되지 않습니다.
gitlab_rails['incoming_email_address'] = "incoming@exchange.example.com"

# 이메일 계정 사용자 이름
# 일반적으로 userPrincipalName(UPN)입니다.
gitlab_rails['incoming_email_email'] = "incoming@ad-domain.example.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "exchange.example.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
gitlab_rails['incoming_email_expunge_deleted'] = true

소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # Exchange는 서브 주소 지정을 지원하지 않으며
    # Catch-all 메일박스를 사용하지 않으므로 %{key}가 사용되지 않습니다.
    address: "incoming@exchange.example.com"

    # 이메일 계정 사용자 이름
    # 일반적으로 userPrincipalName(UPN)입니다.
    user: "incoming@ad-domain.example.com"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "exchange.example.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true

    # IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
    # 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
    delete_after_delivery: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    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 -DisablePlusAddressInRecipients $false
    Disconnect-ExchangeOnline
    

메일박스 incoming@office365.example.com을 가정하는 Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress+%{key}@office365.example.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
gitlab_rails['incoming_email_address'] = "incoming+%{key}@office365.example.com"

# 이메일 계정 사용자 이름
# 일반적으로 userPrincipalName(UPN)입니다.
gitlab_rails['incoming_email_email'] = "incoming@office365.example.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "outlook.office365.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
gitlab_rails['incoming_email_expunge_deleted'] = true

메일박스 incoming@office365.example.com을 가정하는 소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
    # 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
    # 예: emailaddress+%{key}@office365.example.com.
    # 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
    address: "incoming+%{key}@office365.example.comm"

    # 이메일 계정 사용자 이름
    # 일반적으로 userPrincipalName(UPN)입니다.
    user: "incoming@office365.example.comm"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "outlook.office365.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    expunge_deleted: true
Catch-all 메일박스#

Catch-all 메일박스 incoming@office365.example.com을 가정하는 Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress-%{key}@office365.example.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
gitlab_rails['incoming_email_address'] = "incoming-%{key}@office365.example.com"

# 이메일 계정 사용자 이름
# 일반적으로 userPrincipalName(UPN)입니다.
gitlab_rails['incoming_email_email'] = "incoming@office365.example.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "outlook.office365.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
gitlab_rails['incoming_email_expunge_deleted'] = true

Catch-all 메일박스 incoming@office365.example.com을 가정하는 소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
    # 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
    # 예: emailaddress+%{key}@office365.example.com.
    # 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
    address: "incoming-%{key}@office365.example.com"

    # 이메일 계정 사용자 이름
    # 일반적으로 userPrincipalName(UPN)입니다.
    user: "incoming@ad-domain.example.com"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "outlook.office365.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    expunge_deleted: true
전용 이메일 주소#
Note

이메일로 답글만 지원합니다. Service Desk를 지원할 수 없습니다.

전용 이메일 주소 incoming@office365.example.com을 가정하는 Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

gitlab_rails['incoming_email_address'] = "incoming@office365.example.com"

# 이메일 계정 사용자 이름
# 일반적으로 userPrincipalName(UPN)입니다.
gitlab_rails['incoming_email_email'] = "incoming@office365.example.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "outlook.office365.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
gitlab_rails['incoming_email_expunge_deleted'] = true

전용 이메일 주소 incoming@office365.example.com을 가정하는 소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    address: "incoming@office365.example.com"

    # 이메일 계정 사용자 이름
    # 일반적으로 userPrincipalName(UPN)입니다.
    user: "incoming@office365.example.com"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "outlook.office365.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    expunge_deleted: true

Microsoft Graph#

GitLab은 IMAP 대신 Microsoft Graph API를 사용하여 수신 이메일을 읽을 수 있습니다. Microsoft가 기본 인증을 사용한 IMAP 사용을 더 이상 지원하지 않기 때문에, Microsoft Graph API는 새 Microsoft Exchange Online 메일박스에 필요합니다.

Microsoft Graph용 GitLab을 구성하려면, 모든 메일박스에 대해 Mail.ReadWrite 권한을 가진 OAuth 2.0 애플리케이션을 Azure Active Directory에 등록해야 합니다. 자세한 내용은 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

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress+%{key}@example.onmicrosoft.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
gitlab_rails['incoming_email_address'] = "incoming+%{key}@example.onmicrosoft.com"

# 이메일 계정 사용자 이름
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': '',
   'client_id': '',
   'client_secret': '',
   'poll_interval': 60  # 선택 사항
}

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': '',
   'client_id': '',
   'client_secret': '',
   'poll_interval': 60  # 선택 사항
}

Microsoft Graph API는 소스 컴파일 설치에서 아직 지원되지 않습니다. 자세한 내용은 이슈 326169를 참조하세요.

암호화된 자격증명 사용#

히스토리

구성 파일에 수신 이메일 자격증명을 일반 텍스트로 저장하는 대신, 수신 이메일 자격증명에 암호화된 파일을 선택적으로 사용할 수 있습니다.

전제 조건:

  • 암호화된 자격증명을 사용하려면 먼저 암호화된 구성을 활성화해야 합니다.

암호화된 파일에 지원되는 구성 항목:

  • user
  • password
  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를 편집하고 emailpassword에 대한 incoming_email 설정을 제거합니다.

  5. 파일을 저장하고 GitLab을 재구성합니다:

    sudo gitlab-ctl reconfigure
    

수신 이메일 비밀번호를 저장하려면 Kubernetes 시크릿을 사용합니다. 자세한 내용은 Helm IMAP 시크릿을 참조하세요.

  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을 편집하고 emailpassword에 대한 incoming_email 설정을 제거합니다.

  5. 파일을 저장하고 GitLab을 재시작합니다:

    docker compose up -d
    
  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을 편집하고 userpassword에 대한 incoming_email: 설정을 제거합니다.

  5. 파일을 저장하고 GitLab 및 Mailroom을 재시작합니다.

    # systemd를 실행하는 시스템
    sudo systemctl restart gitlab.target
    
    # SysV init을 실행하는 시스템
    sudo service gitlab restart
    

문제 해결#

16.6.0에서 이메일 수집이 작동하지 않음#

GitLab 16.6에서 회귀로 인해 mail_room(이메일 수집)이 시작되지 않습니다. Service Desk 및 기타 이메일 답글 기능이 작동하지 않습니다. 이 문제는 16.6.1에서 수정되었습니다. 자세한 내용은 이슈 432257을 참조하세요.

해결 방법은 GitLab 설치에서 다음 명령을 실행하여 영향받는 파일을 패치하는 것입니다:

curl --output /tmp/mailroom.patch --url "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/137279.diff"
patch -p1 -d /opt/gitlab/embedded/service/gitlab-rails < /tmp/mailroom.patch
gitlab-ctl restart mailroom
curl --output /tmp/mailroom.patch --url "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/137279.diff"
cd /opt/gitlab/embedded/service/gitlab-rails
patch -p1 < /tmp/mailroom.patch
gitlab-ctl restart mailroom

이메일 주소 제한이 있는 공급자에 의해 수신 이메일이 거부됨#

일부 이메일 공급자가 이메일 주소의 로컬 부분(@ 앞)에 64자 제한을 적용하기 때문에 GitLab 인스턴스가 수신 이메일을 받지 못할 수 있습니다. 이 제한을 초과하는 주소의 모든 이메일은 거부됩니다.

해결 방법으로 더 짧은 경로를 유지합니다:

  • incoming_email_address에서 %{key} 앞에 구성된 로컬 부분이 가능한 짧게, 31자를 넘지 않도록 유지합니다.
  • 지정된 프로젝트를 더 높은 그룹 계층에 배치합니다.
  • 그룹프로젝트를 더 짧은 이름으로 변경합니다.

이슈 460206에서 이 기능을 추적합니다.

수신 이메일

Tier: Free, Premium, Ultimate
Offering: GitLab Self-Managed
원문 보기
요약

GitLab에는 수신 이메일 메시지를 기반으로 하는 여러 기능이 있습니다: GitLab 인스턴스 전용으로 오직 해당 메시지만 수신하는 이메일 주소를 사용해야 합니다. 수신 이메일 메시지를 처리하려면 IMAP을 지원하는 이메일 계정이 필요합니다.

GitLab에는 수신 이메일 메시지를 기반으로 하는 여러 기능이 있습니다:

  • 이메일로 답글: GitLab 사용자가 알림 이메일에 답장하여 이슈 및 머지 리퀘스트에 댓글을 달 수 있습니다.
  • 이메일로 새 이슈 생성: GitLab 사용자가 사용자별 이메일 주소로 이메일을 보내 새 이슈를 생성할 수 있습니다.
  • 이메일로 새 머지 리퀘스트 생성: GitLab 사용자가 사용자별 이메일 주소로 이메일을 보내 새 머지 리퀘스트를 생성할 수 있습니다.
  • Service Desk: GitLab을 통해 고객에게 이메일 지원을 제공합니다.

요구사항#

GitLab 인스턴스 전용으로 오직 해당 메시지만 수신하는 이메일 주소를 사용해야 합니다. GitLab을 위한 것이 아닌 수신 이메일 메시지는 거부 알림을 받습니다.

수신 이메일 메시지를 처리하려면 IMAP을 지원하는 이메일 계정이 필요합니다. GitLab은 다음 세 가지 전략 중 하나를 필요로 합니다:

  • 이메일 서브 주소 지정(권장)
  • Catch-all 메일박스
  • 전용 이메일 주소(이메일로 답글만 지원)

이 각 옵션을 살펴보겠습니다.

이메일 서브 주소 지정#

서브 주소 지정user+arbitrary_tag@example.com으로 보내는 이메일이 user@example.com의 메일박스로 전달되는 메일 서버 기능입니다. Gmail, Google Apps, Yahoo! Mail, Outlook.com, iCloud와 같은 공급자와 직접 운영할 수 있는 Postfix 메일 서버에서 지원됩니다. Microsoft Exchange Server는 서브 주소 지정을 지원하지 않으며, Microsoft Office 365는 기본적으로 서브 주소 지정을 지원하지 않습니다.

Note

공급자나 서버가 이메일 서브 주소 지정을 지원하는 경우 이를 사용해야 합니다. 전용 이메일 주소는 이메일로 답글 기능만 지원합니다. Catch-all 메일박스는 서브 주소 지정과 동일한 기능을 지원하지만, 하나의 이메일 주소만 사용하므로 GitLab 이외의 목적으로 Catch-all을 사용할 수 있기 때문에 서브 주소 지정이 여전히 선호됩니다.

Catch-all 메일박스#

도메인의 Catch-all 메일박스는 메일 서버에 존재하는 어떤 주소와도 일치하지 않는 도메인으로 주소가 지정된 모든 이메일 메시지를 수신합니다.

Catch-all 메일박스는 이메일 서브 주소 지정과 동일한 기능을 지원하지만, Catch-all 메일박스를 다른 목적으로 사용할 수 있도록 이메일 서브 주소 지정이 여전히 권장됩니다.

전용 이메일 주소#

이 솔루션을 설정하려면 GitLab 알림에 대한 사용자의 답장을 받기 위한 전용 이메일 주소를 생성해야 합니다. 그러나 이 방법은 답장만 지원하며 수신 이메일의 다른 기능은 지원하지 않습니다.

허용되는 헤더#

히스토리
  • GitLab 16.5에서 Cc 헤더 허용이 도입됨.
  • GitLab 17.0에서 X-Original-To 헤더 허용이 도입됨.
  • GitLab 17.6에서 X-Forwarded-To 헤더 허용이 도입됨.
  • GitLab 17.6에서 X-Delivered-To 헤더 허용이 도입됨.

구성된 이메일 주소가 다음 헤더 중 하나에 있을 때 이메일이 올바르게 처리됩니다 (확인되는 순서대로 정렬):

  • To
  • Delivered-To
  • X-Delivered-To
  • Envelope-To 또는 X-Envelope-To
  • Received
  • X-Original-To
  • X-Forwarded-To
  • Cc

References 헤더도 허용되지만, 기존 토론 스레드에 이메일 응답을 연결하는 데 특별히 사용됩니다. 이메일로 이슈를 생성하는 데는 사용되지 않습니다.

GitLab 14.6 이상에서 Service Desk도 허용되는 헤더를 확인합니다.

일반적으로 To 필드에는 기본 수신자의 이메일 주소가 포함됩니다. 그러나 다음 경우에는 구성된 GitLab 이메일 주소가 포함되지 않을 수 있습니다:

  • 주소가 BCC 필드에 있는 경우.
  • 이메일이 전달된 경우.

Received 헤더에는 여러 이메일 주소가 포함될 수 있습니다. 이는 나타나는 순서대로 확인됩니다. 첫 번째 일치 항목이 사용됩니다.

거부되는 헤더#

자동 이메일 시스템에서 원치 않는 이슈 생성을 방지하기 위해, GitLab은 다음 헤더를 포함하는 모든 수신 이메일을 무시합니다:

  • no 이외의 값을 가진 Auto-Submitted
  • yes 값을 가진 X-Autoreply

설정하기#

Gmail/Google Apps를 수신 이메일에 사용하려면 IMAP 접근이 활성화되어 있고 보안 수준이 낮은 앱이 계정에 접근 허용되어 있거나 2단계 인증을 켜고 앱 비밀번호를 사용하는지 확인하세요.

Office 365를 사용하고 2단계 인증이 활성화된 경우, 메일박스의 일반 비밀번호 대신 앱 비밀번호를 사용하고 있는지 확인하세요.

Ubuntu에서 IMAP 접근이 가능한 기본 Postfix 메일 서버를 설정하려면 Postfix 설정 문서를 따르세요.

보안 문제#

Warning

수신 이메일을 받는 데 사용되는 도메인을 선택할 때 주의하세요.

예를 들어, 최상위 회사 도메인이 hooli.com이라고 가정합니다. 회사의 모든 직원은 Google Workspace를 통해 해당 도메인의 이메일 주소를 갖고 있으며, 회사의 프라이빗 Slack 인스턴스에 가입하려면 유효한 @hooli.com 이메일 주소가 필요합니다.

hooli.com에서 공개 GitLab 인스턴스도 호스팅하고 수신 이메일 도메인을 hooli.com으로 설정하면, 공격자가 이메일로 새 이슈 생성 또는 이메일로 새 머지 리퀘스트 생성 기능을 악용하여 공격자가 소유한 프로젝트의 고유 주소를 Slack에 가입할 때의 이메일로 사용할 수 있습니다. 이렇게 하면 확인 이메일이 전송되어 프로젝트에서 새 이슈 또는 머지 리퀘스트가 생성되어 공격자가 확인 링크를 선택하여 회사의 프라이빗 Slack 인스턴스에서 계정을 검증할 수 있게 됩니다.

incoming.hooli.com과 같은 서브 도메인에서 수신 이메일을 받고 *.hooli.com.과 같은 이메일 도메인에 대한 접근에만 기반하여 인증하는 서비스를 사용하지 않는 것을 권장합니다. 또는 hooli-gitlab.com과 같은 GitLab 이메일 통신에 전용 도메인을 사용하세요.

이 취약점의 실제 사례는 GitLab 이슈 #30366을 참조하세요.

Warning

스팸을 줄이도록 구성된 메일 서버를 사용하세요. 예를 들어 기본 구성으로 실행되는 Postfix 메일 서버는 악용될 수 있습니다. 구성된 메일박스에서 수신된 모든 메시지가 처리되며 GitLab 인스턴스를 위한 것이 아닌 메시지는 거부 알림을 받습니다. 발신자 주소가 스푸핑된 경우 거부 알림이 스푸핑된 FROM 주소로 전달되어 메일 서버의 IP 또는 도메인이 차단 목록에 표시될 수 있습니다.

사용자는 수신 이메일 기능을 먼저 2단계 인증(2FA)을 사용하지 않고도 사용할 수 있습니다. 인스턴스에서 2단계 인증을 강제하더라도 마찬가지입니다.

Linux 패키지 설치#

  1. /etc/gitlab/gitlab.rb에서 incoming_email 섹션을 찾아 기능을 활성화하고 특정 IMAP 서버 및 이메일 계정에 대한 세부 정보를 입력합니다 (아래 예제를 참조하세요).

  2. 변경 사항을 적용하려면 GitLab을 재구성합니다:

    sudo gitlab-ctl reconfigure
    
    # 처음 활성화하거나 비활성화할 때는 필요하지만 비밀번호 변경에는 필요하지 않습니다.
    # 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 install gitlab-mail_room
    

    [!note] 이 단계는 스레드 교착 상태를 방지하고 최신 MailRoom 기능을 지원하기 위해 필요합니다.

  3. config/gitlab.yml에서 incoming_email 섹션을 찾아 기능을 활성화하고 특정 IMAP 서버 및 이메일 계정에 대한 세부 정보를 입력합니다 (아래 예제를 참조하세요).

systemd 유닛을 사용하여 GitLab을 관리하는 경우:

  1. gitlab-mailroom.servicegitlab.target의 의존성으로 추가합니다:

    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#

Postfix 메일 서버 구성 예제. 메일박스 incoming@gitlab.example.com을 가정합니다.

Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress+%{key}@gitlab.example.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
gitlab_rails['incoming_email_address'] = "incoming+%{key}@gitlab.example.com"

# 이메일 계정 사용자 이름
# 서드파티 공급자의 경우 일반적으로 전체 이메일 주소입니다.
# 셀프 호스팅 이메일 서버의 경우 일반적으로 이메일 주소의 사용자 부분입니다.
gitlab_rails['incoming_email_email'] = "incoming"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "gitlab.example.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 143
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = false
# IMAP 서버가 StartTLS를 사용하는지 여부
gitlab_rails['incoming_email_start_tls'] = false

# 수신 메일이 저장될 메일박스. 일반적으로 "inbox".
gitlab_rails['incoming_email_mailbox_name'] = "inbox"
# IDLE 명령 타임아웃.
gitlab_rails['incoming_email_idle_timeout'] = 60

# IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
# 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
gitlab_rails['incoming_email_delete_after_delivery'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
# IMAP에만 적용됩니다. Microsoft Graph는 삭제된 메시지를 자동으로 제거합니다.
gitlab_rails['incoming_email_expunge_deleted'] = true

소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
    # 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
    # 예: emailaddress+%{key}@gitlab.example.com.
    # 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
    address: "incoming+%{key}@gitlab.example.com"

    # 이메일 계정 사용자 이름
    # 서드파티 공급자의 경우 일반적으로 전체 이메일 주소입니다.
    # 셀프 호스팅 이메일 서버의 경우 일반적으로 이메일 주소의 사용자 부분입니다.
    user: "incoming"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "gitlab.example.com"
    # IMAP 서버 포트
    port: 143
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: false
    # IMAP 서버가 StartTLS를 사용하는지 여부
    start_tls: false

    # 수신 메일이 저장될 메일박스. 일반적으로 "inbox".
    mailbox: "inbox"
    # IDLE 명령 타임아웃.
    idle_timeout: 60

    # IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
    # 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
    delete_after_delivery: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    # IMAP에만 적용됩니다. Microsoft Graph는 삭제된 메시지를 자동으로 제거합니다.
    expunge_deleted: true

Gmail#

Gmail/Google Workspace 구성 예제. 메일박스 gitlab-incoming@gmail.com을 가정합니다.

Note

incoming_email_email은 Gmail 별칭 계정이 될 수 없습니다.

Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress+%{key}@gmail.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
gitlab_rails['incoming_email_address'] = "gitlab-incoming+%{key}@gmail.com"

# 이메일 계정 사용자 이름
# 서드파티 공급자의 경우 일반적으로 전체 이메일 주소입니다.
# 셀프 호스팅 이메일 서버의 경우 일반적으로 이메일 주소의 사용자 부분입니다.
gitlab_rails['incoming_email_email'] = "gitlab-incoming@gmail.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "imap.gmail.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true
# IMAP 서버가 StartTLS를 사용하는지 여부
gitlab_rails['incoming_email_start_tls'] = false

# 수신 메일이 저장될 메일박스. 일반적으로 "inbox".
gitlab_rails['incoming_email_mailbox_name'] = "inbox"
# IDLE 명령 타임아웃.
gitlab_rails['incoming_email_idle_timeout'] = 60

# IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
# 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
gitlab_rails['incoming_email_delete_after_delivery'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
# IMAP에만 적용됩니다. Microsoft Graph는 삭제된 메시지를 자동으로 제거합니다.
gitlab_rails['incoming_email_expunge_deleted'] = true

소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
    # 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
    # 예: emailaddress+%{key}@gmail.com.
    # 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
    address: "gitlab-incoming+%{key}@gmail.com"

    # 이메일 계정 사용자 이름
    # 서드파티 공급자의 경우 일반적으로 전체 이메일 주소입니다.
    # 셀프 호스팅 이메일 서버의 경우 일반적으로 이메일 주소의 사용자 부분입니다.
    user: "gitlab-incoming@gmail.com"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "imap.gmail.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true
    # IMAP 서버가 StartTLS를 사용하는지 여부
    start_tls: false

    # 수신 메일이 저장될 메일박스. 일반적으로 "inbox".
    mailbox: "inbox"
    # IDLE 명령 타임아웃.
    idle_timeout: 60

    # IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
    # 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
    delete_after_delivery: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    # IMAP에만 적용됩니다. Microsoft Graph는 삭제된 메시지를 자동으로 제거합니다.
    expunge_deleted: true

Microsoft Exchange Server#

IMAP이 활성화된 Microsoft Exchange Server 구성 예제. Exchange는 서브 주소 지정을 지원하지 않으므로 두 가지 옵션만 있습니다:

Catch-all 메일박스#

Catch-all 메일박스 incoming@exchange.example.com을 가정합니다.

Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress-%{key}@exchange.example.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
# Exchange는 서브 주소 지정을 지원하지 않으므로 Catch-all 메일박스를 사용해야 합니다.
gitlab_rails['incoming_email_address'] = "incoming-%{key}@exchange.example.com"

# 이메일 계정 사용자 이름
# 일반적으로 userPrincipalName(UPN)입니다.
gitlab_rails['incoming_email_email'] = "incoming@ad-domain.example.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "exchange.example.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
# IMAP에만 적용됩니다. Microsoft Graph는 삭제된 메시지를 자동으로 제거합니다.
gitlab_rails['incoming_email_expunge_deleted'] = true

소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
    # 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
    # 예: emailaddress-%{key}@exchange.example.com.
    # 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
    # Exchange는 서브 주소 지정을 지원하지 않으므로 Catch-all 메일박스를 사용해야 합니다.
    address: "incoming-%{key}@exchange.example.com"

    # 이메일 계정 사용자 이름
    # 일반적으로 userPrincipalName(UPN)입니다.
    user: "incoming@ad-domain.example.com"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "exchange.example.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true

    # IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
    # 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
    delete_after_delivery: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    expunge_deleted: true
전용 이메일 주소#
Note

이메일로 답글만 지원합니다. Service Desk를 지원할 수 없습니다.

전용 이메일 주소 incoming@exchange.example.com을 가정합니다.

Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# Exchange는 서브 주소 지정을 지원하지 않으며 Catch-all 메일박스를 사용하지 않으므로 %{key}가 사용되지 않습니다.
gitlab_rails['incoming_email_address'] = "incoming@exchange.example.com"

# 이메일 계정 사용자 이름
# 일반적으로 userPrincipalName(UPN)입니다.
gitlab_rails['incoming_email_email'] = "incoming@ad-domain.example.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "exchange.example.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
gitlab_rails['incoming_email_expunge_deleted'] = true

소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # Exchange는 서브 주소 지정을 지원하지 않으며
    # Catch-all 메일박스를 사용하지 않으므로 %{key}가 사용되지 않습니다.
    address: "incoming@exchange.example.com"

    # 이메일 계정 사용자 이름
    # 일반적으로 userPrincipalName(UPN)입니다.
    user: "incoming@ad-domain.example.com"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "exchange.example.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true

    # IMAP 대신 Microsoft Graph를 사용하는 경우, 삭제된 메시지가 일정 시간 후에
    # 자동으로 제거되므로 받은 편지함에 메시지를 유지하려면 false로 설정합니다.
    delete_after_delivery: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    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 -DisablePlusAddressInRecipients $false
    Disconnect-ExchangeOnline
    

메일박스 incoming@office365.example.com을 가정하는 Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress+%{key}@office365.example.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
gitlab_rails['incoming_email_address'] = "incoming+%{key}@office365.example.com"

# 이메일 계정 사용자 이름
# 일반적으로 userPrincipalName(UPN)입니다.
gitlab_rails['incoming_email_email'] = "incoming@office365.example.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "outlook.office365.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
gitlab_rails['incoming_email_expunge_deleted'] = true

메일박스 incoming@office365.example.com을 가정하는 소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
    # 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
    # 예: emailaddress+%{key}@office365.example.com.
    # 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
    address: "incoming+%{key}@office365.example.comm"

    # 이메일 계정 사용자 이름
    # 일반적으로 userPrincipalName(UPN)입니다.
    user: "incoming@office365.example.comm"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "outlook.office365.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    expunge_deleted: true
Catch-all 메일박스#

Catch-all 메일박스 incoming@office365.example.com을 가정하는 Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress-%{key}@office365.example.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
gitlab_rails['incoming_email_address'] = "incoming-%{key}@office365.example.com"

# 이메일 계정 사용자 이름
# 일반적으로 userPrincipalName(UPN)입니다.
gitlab_rails['incoming_email_email'] = "incoming@office365.example.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "outlook.office365.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
gitlab_rails['incoming_email_expunge_deleted'] = true

Catch-all 메일박스 incoming@office365.example.com을 가정하는 소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    # 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
    # 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
    # 예: emailaddress+%{key}@office365.example.com.
    # 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
    address: "incoming-%{key}@office365.example.com"

    # 이메일 계정 사용자 이름
    # 일반적으로 userPrincipalName(UPN)입니다.
    user: "incoming@ad-domain.example.com"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "outlook.office365.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    expunge_deleted: true
전용 이메일 주소#
Note

이메일로 답글만 지원합니다. Service Desk를 지원할 수 없습니다.

전용 이메일 주소 incoming@office365.example.com을 가정하는 Linux 패키지 설치 예제:

gitlab_rails['incoming_email_enabled'] = true

gitlab_rails['incoming_email_address'] = "incoming@office365.example.com"

# 이메일 계정 사용자 이름
# 일반적으로 userPrincipalName(UPN)입니다.
gitlab_rails['incoming_email_email'] = "incoming@office365.example.com"
# 이메일 계정 비밀번호
gitlab_rails['incoming_email_password'] = "[REDACTED]"

# IMAP 서버 호스트
gitlab_rails['incoming_email_host'] = "outlook.office365.com"
# IMAP 서버 포트
gitlab_rails['incoming_email_port'] = 993
# IMAP 서버가 SSL을 사용하는지 여부
gitlab_rails['incoming_email_ssl'] = true

# 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
gitlab_rails['incoming_email_expunge_deleted'] = true

전용 이메일 주소 incoming@office365.example.com을 가정하는 소스 컴파일 설치 예제:

incoming_email:
    enabled: true

    address: "incoming@office365.example.com"

    # 이메일 계정 사용자 이름
    # 일반적으로 userPrincipalName(UPN)입니다.
    user: "incoming@office365.example.com"
    # 이메일 계정 비밀번호
    password: "[REDACTED]"

    # IMAP 서버 호스트
    host: "outlook.office365.com"
    # IMAP 서버 포트
    port: 993
    # IMAP 서버가 SSL을 사용하는지 여부
    ssl: true

    # 배달 후 삭제로 표시된 메시지를 메일박스에서 지우기(영구 제거)할지 여부
    expunge_deleted: true

Microsoft Graph#

GitLab은 IMAP 대신 Microsoft Graph API를 사용하여 수신 이메일을 읽을 수 있습니다. Microsoft가 기본 인증을 사용한 IMAP 사용을 더 이상 지원하지 않기 때문에, Microsoft Graph API는 새 Microsoft Exchange Online 메일박스에 필요합니다.

Microsoft Graph용 GitLab을 구성하려면, 모든 메일박스에 대해 Mail.ReadWrite 권한을 가진 OAuth 2.0 애플리케이션을 Azure Active Directory에 등록해야 합니다. 자세한 내용은 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

# 응답 대상 항목을 참조하기 위해 대체될 %{key} 플레이스홀더를 포함한 이메일 주소.
# 이 %{key}는 이메일 주소 내에 완전히 포함되어야 하며 다른 값으로 대체되어서는 안 됩니다.
# 예: emailaddress+%{key}@example.onmicrosoft.com.
# 플레이스홀더는 주소의 "user" 부분(`@` 앞)에 있어야 합니다.
gitlab_rails['incoming_email_address'] = "incoming+%{key}@example.onmicrosoft.com"

# 이메일 계정 사용자 이름
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': '',
   'client_id': '',
   'client_secret': '',
   'poll_interval': 60  # 선택 사항
}

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': '',
   'client_id': '',
   'client_secret': '',
   'poll_interval': 60  # 선택 사항
}

Microsoft Graph API는 소스 컴파일 설치에서 아직 지원되지 않습니다. 자세한 내용은 이슈 326169를 참조하세요.

암호화된 자격증명 사용#

히스토리

구성 파일에 수신 이메일 자격증명을 일반 텍스트로 저장하는 대신, 수신 이메일 자격증명에 암호화된 파일을 선택적으로 사용할 수 있습니다.

전제 조건:

  • 암호화된 자격증명을 사용하려면 먼저 암호화된 구성을 활성화해야 합니다.

암호화된 파일에 지원되는 구성 항목:

  • user
  • password
  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를 편집하고 emailpassword에 대한 incoming_email 설정을 제거합니다.

  5. 파일을 저장하고 GitLab을 재구성합니다:

    sudo gitlab-ctl reconfigure
    

수신 이메일 비밀번호를 저장하려면 Kubernetes 시크릿을 사용합니다. 자세한 내용은 Helm IMAP 시크릿을 참조하세요.

  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을 편집하고 emailpassword에 대한 incoming_email 설정을 제거합니다.

  5. 파일을 저장하고 GitLab을 재시작합니다:

    docker compose up -d
    
  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을 편집하고 userpassword에 대한 incoming_email: 설정을 제거합니다.

  5. 파일을 저장하고 GitLab 및 Mailroom을 재시작합니다.

    # systemd를 실행하는 시스템
    sudo systemctl restart gitlab.target
    
    # SysV init을 실행하는 시스템
    sudo service gitlab restart
    

문제 해결#

16.6.0에서 이메일 수집이 작동하지 않음#

GitLab 16.6에서 회귀로 인해 mail_room(이메일 수집)이 시작되지 않습니다. Service Desk 및 기타 이메일 답글 기능이 작동하지 않습니다. 이 문제는 16.6.1에서 수정되었습니다. 자세한 내용은 이슈 432257을 참조하세요.

해결 방법은 GitLab 설치에서 다음 명령을 실행하여 영향받는 파일을 패치하는 것입니다:

curl --output /tmp/mailroom.patch --url "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/137279.diff"
patch -p1 -d /opt/gitlab/embedded/service/gitlab-rails < /tmp/mailroom.patch
gitlab-ctl restart mailroom
curl --output /tmp/mailroom.patch --url "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/137279.diff"
cd /opt/gitlab/embedded/service/gitlab-rails
patch -p1 < /tmp/mailroom.patch
gitlab-ctl restart mailroom

이메일 주소 제한이 있는 공급자에 의해 수신 이메일이 거부됨#

일부 이메일 공급자가 이메일 주소의 로컬 부분(@ 앞)에 64자 제한을 적용하기 때문에 GitLab 인스턴스가 수신 이메일을 받지 못할 수 있습니다. 이 제한을 초과하는 주소의 모든 이메일은 거부됩니다.

해결 방법으로 더 짧은 경로를 유지합니다:

  • incoming_email_address에서 %{key} 앞에 구성된 로컬 부분이 가능한 짧게, 31자를 넘지 않도록 유지합니다.
  • 지정된 프로젝트를 더 높은 그룹 계층에 배치합니다.
  • 그룹프로젝트를 더 짧은 이름으로 변경합니다.

이슈 460206에서 이 기능을 추적합니다.