수신 이메일

Tier: Free, Premium, Ultimate Offering: Self-managed

GitLab은 수신된 이메일 메시지를 기반으로한 여러 기능을 갖고 있습니다.

  • 이메일로 회신: GitLab 사용자가 알림 이메일에 답장하여 이슈 및 병합 요청에 댓글을 남길 수 있게 합니다.
  • 이메일로 새 이슈 작성: GitLab 사용자가 사용자별 이메일 주소로 이메일을 보내어 새 이슈를 생성할 수 있게 합니다.
  • 이메일로 새 병합 요청 작성: GitLab 사용자가 사용자별 이메일 주소로 이메일을 보내어 새 병합 요청을 생성할 수 있게 합니다.
  • 서비스 데스크: GitLab을 통해 고객에게 이메일 지원을 제공합니다.

요구 사항

GitLab 인스턴스를 위한 의도된 메시지만 수신하는 이메일 주소를 사용하는 것을 권장합니다. GitLab을 위해 의도되지 않은 수신된 이메일은 거부 통지가 전달됩니다.

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

  • 이메일 서브 주소(권장)
  • 캐치-올 메일함
  • 전용 이메일 주소(회신 전용)

각 옵션에 대해 설명해보겠습니다.

이메일 서브 주소

서브 주소user+arbitrary_tag@example.com로 보내는 모든 이메일이 user@example.com 메일함으로 전송되는 메일 서버 기능입니다. Gmail, Google Apps, Yahoo! Mail, Outlook.com 및 온프레미스에서 실행할 수 있는 Postfix 메일 서버와 같은 공급업체에서 지원됩니다. Microsoft Exchange Server는 서브 주소를 지원하지 않습니다 그리고 Microsoft Office 365는 기본적으로 서브 주소를 지원하지 않습니다.

참고: 서브 주소를 지원하는 공급업체 또는 서버가 있는 경우 사용하는 것을 권장합니다. 전용 이메일 주소는 회신 전용 기능만 지원합니다. 캐치-올 메일함은 GitLab 11.7 이후로 서브 주소와 동일한 기능을 지원하지만, 여러 용도로 사용 가능한 캐치-올 메일함을 남겨두기 위해 여전히 서브 주소가 우선됩니다.

캐치-올 메일함

도메인의 캐치-올 메일함은 메일 서버에 있는 주소와 일치하지 않는 도메인으로 보내진 모든 이메일을 수신합니다.

GitLab 11.7 이후로 캐치-올 메일함은 이메일 서브 주소와 동일한 기능을 지원하지만, 이메일 서브 주소를 사용하여 캐치-올 메일함을 다른 용도로 예약할 수 있도록 하는 것이 여전히 권장됩니다.

전용 이메일 주소

이 방법을 설정하려면 사용자의 회신을 받을 전용 이메일 주소를 만들어야 합니다. 그러나 이 방법은 회신 기능만 지원하며 수신된 이메일의 다른 기능을 지원하지 않습니다.

허용된 헤더

  • GitLab 14.9에서 추가된 Received 헤더 허용
  • GitLab 16.5에서 추가된 Cc 헤더 허용

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

  • To
  • Delivered-To
  • Envelope-To 혹은 X-Envelope-To
  • Received
  • Cc

References 헤더도 허용되지만, 기존 토론 스레드와 관련된 이메일 응답을 지정하는 데 사용됩니다. 이는 이메일로 이슈를 생성하는 데 사용되지 않습니다.

GitLab 14.6 이후로 서비스 데스크도 허용된 헤더를 확인합니다.

보통 “To” 필드에는 주 이베이트 주소가 포함됩니다. 그러나 다음과 같은 경우 구성된 GitLab 이메일 주소가 포함되지 않을 수 있습니다:

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

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

거부된 헤더

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

  • 값이 no가 아닌 Auto-Submitted
  • 값이 yesX-Autoreply

설정하기

수신된 이메일에 Gmail / Google Apps을 사용하려면 IMAP 액세스를 사용하고 보안 수준이 낮은 앱의 액세스를 허용하거나 2단계 인증을 사용하고 애플리케이션 암호를 사용하십시오.

Office 365를 사용하려면, 이중 인증이 활성화된 경우, 일반 비밀번호 대신 앱 암호를 사용하십시오.

Ubuntu에서 기본적인 Postfix 메일 서버를 IMAP 액세스와 함께 설정하려면 Postfix 설치 설명서를 따르십시오.

보안 문제

경고: 수신 이메일을 받기 위해 사용되는 도메인을 선택할 때 주의하십시오.

예를 들어, 회사의 최상위 도메인이 hooli.com이라고 가정해 보겠습니다. 회사의 모든 직원은 구글 앱스를 통해 해당 도메인의 이메일 주소를 가지고 있으며, 회사의 사설 Slack 인스턴스는 유효한 @hooli.com 이메일 주소로 회원 가입이 필요합니다.

만약 당신이 hooli.com에서 공개 GitLab 인스턴스를 호스팅하고, 수신 이메일 도메인을 hooli.com으로 설정하면, 공격자는 프로젝트의 고유 주소를 사용하여 Slack 회원 가입 시 이메일로 악용할 수 있습니다. 이는 확인 이메일을 보내고, 이로 인해 공격자가 보유한 프로젝트에 새 이슈나 합병 요청을 생성하게 하여 그들이 회사의 사설 Slack 인스턴스에서 계정을 활성화할 수 있게 합니다.

우리는 수신 이메일을 incoming.hooli.com과 같은 서브도메인에서 받고, *.hooli.com과 같이 이메일 도메인에만 의존하는 서비스를 사용하지 않도록 권장합니다. 또는 hooli-gitlab.com과 같은 전용 도메인을 GitLab 이메일 통신에 사용하세요.

이 문제의 실제 예시는 GitLab 이슈 #30366에서 확인할 수 있습니다.

경고: 스팸을 줄이기 위해 설정된 메일 서버를 사용하세요. 예를 들어 기본 구성에서 실행 중인 포스트픽스 메일 서버는 남용될 수 있습니다. 구성된 메일함에서 받은 모든 메시지는 처리되고, 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
    

    참고: 스레드 데드락을 피하고 최신 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의 초기 스크립트에 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
    

이제 이메일에 의한 회신이 작동해야 합니다.

구성 예시

포스트픽스

포스트픽스 메일 서버의 예시 구성. 메일함은 incoming@gitlab.example.com을 가정합니다.

리눅스 패키지 설치를 위한 예시:

gitlab_rails['incoming_email_enabled'] = true

# %{key} 플레이스홀더를 포함한 이메일 주소로, 이는 회신할 대상을 참조하기 위해 대체될 것입니다. 
# 이 %{key}는 이메일 주소 내 "사용자" 부분(‘@’ 앞)에 완전히 포함되어야 하며, 다른 값으로 대체되어서는 안 됩니다.
# 예시: emailaddress+%{key}@gitlab.example.com.
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}는 이메일 주소 내 "사용자" 부분(‘@’ 앞)에 완전히 포함되어야 하며, 다른 값으로 대체되어서는 안 됩니다.
    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을 가정합니다.

참고: incoming_email_email은 Gmail 별칭 계정일 수 없습니다.

리눅스 패키지 설치를 위한 예시:

gitlab_rails['incoming_email_enabled'] = true

# %{key} 플레이스홀더를 포함한 이메일 주소로, 이는 회신할 대상을 참조하기 위해 대체될 것입니다. 
# 이 %{key}는 이메일 주소 내 "사용자" 부분(‘@’ 앞)에 완전히 포함되어야 하며, 다른 값으로 대체되어서는 안 됩니다.
# 예시: emailaddress+%{key}@gmail.com.
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}는 이메일 주소 내 "사용자" 부분(‘@’ 앞)에 완전히 포함되어야 하며, 다른 값으로 대체되어서는 안 됩니다.
    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

Microsoft Exchange Server의 IMAP가 활성화된 예제 구성입니다. Exchange는 서브 주소 지원을 지원하지 않기 때문에 두 가지 옵션이 존재합니다.

Catch-all mailbox

catch-all 메일함 incoming@exchange.example.com을 전제로 합니다.

Linux 패키지 설치 예시:

gitlab_rails['incoming_email_enabled'] = true

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

# 이메일 계정 사용자 이름
# 일반적으로 이는 사용자 주체 이름(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.
    # 이 플레이스 홀더는 주소의 "사용자" 부분( `@` 앞)에 나타나야 합니다.
    # Exchange는 서브 주소 지원을 지원하지 않으므로 catch-all 메일함을 사용해야 합니다.
    address: "incoming-%{key}@exchange.example.com"

    # 이메일 계정 사용자 이름
    # 일반적으로 이는 사용자 주체 이름(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
Dedicated email address

참고: Email로 답장만 지원됩니다. Service Desk는 지원할 수 없습니다.

dedicated 이메일 주소 incoming@exchange.example.com을 전제로 합니다.

Linux 패키지 설치 예시:

gitlab_rails['incoming_email_enabled'] = true

# Exchange는 서브 주소를 지원하지 않으며, 우리는 catch-all 메일함을 사용하지 않기 때문에 %{key}는 여기에 사용되지 않습니다
gitlab_rails['incoming_email_address'] = "incoming@exchange.example.com"

# 이메일 계정 사용자 이름
# 일반적으로 이는 사용자 주체 이름(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"

    # 이메일 계정 사용자 이름
    # 일반적으로 이는 사용자 주체 이름(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

Microsoft Office 365의 IMAP를 활성화한 예시 구성.

서브 주소함

참고: 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

# %{key} 플레이스홀더를 참조하기 위해 대체될 이메일 주소 포함(깞 이메일 참조를 위해 %{key}가 이메일 주소 내에서 완전히 포함되어 있어야 함).
# 예: emailaddress+%{key}@office365.example.com.
# 플레이스홀더는 주소의 "사용자" 부분( `@` 이전)에 나타나야 합니다.
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

이 Self-Compiled 설치 예시는 incoming@office365.example.com 메일함을 가정합니다:

incoming_email:
    enabled: true

    # %{key} 플레이스홀더를 참조하기 위해 대체될 이메일 주소 포함(깞 이메일 참조를 위해 %{key}가 이메일 주소 내에서 완전히 포함되어 있어야 함).
    # 예: emailaddress+%{key}@office365.example.com.
    # 플레이스홀더는 주소의 "사용자" 부분( `@` 이전)에 나타나야 합니다.
    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
캐치-올 메일함

이 Linux 패키지 설치 예시는 캐치-올 메일함이 incoming@office365.example.com인 것을 가정합니다:

gitlab_rails['incoming_email_enabled'] = true

# %{key} 플레이스홀더를 참조하기 위해 대체될 이메일 주소 포함(깞 이메일 참조를 위해 %{key}가 이메일 주소 내에서 완전히 포함되어 있어야 함).
# 예: emailaddress-%{key}@office365.example.com.
# 플레이스홀더는 주소의 "사용자" 부분( `@` 이전)에 나타나야 합니다.
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

이 Self-Compiled 설치 예시는 캐치-올 메일함이 incoming@office365.example.com인 것을 가정합니다:

incoming_email:
    enabled: true

    # %{key} 플레이스홀더를 참조하기 위해 대체될 이메일 주소 포함(깞 이메일 참조를 위해 %{key}가 이메일 주소 내에서 완전히 포함되어 있어야 함).
    # 예: emailaddress+%{key}@office365.example.com.
    # 플레이스홀더는 주소의 "사용자" 부분( `@` 이전)에 나타나야 합니다.
    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
전용 이메일 주소

참고: 이메일로 답장만 지원됩니다. 서비스 데스크는 지원되지 않습니다.

이 예제는 Linux 패키지 설치를 위한 것으로, 전용 이메일 주소 incoming@office365.example.com을 가정합니다:

gitlab_rails['incoming_email_enabled'] = true

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

# 이메일 계정 사용자 이름
# 일반적으로 이는 사용자 주요 명 (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"

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

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

    # 메시지가 전달된 후 삭제되었을 때 메일함에서 영구적으로 제거 (삭제)할지 여부
    expunge_deleted: true

마이크로소프트 그래프

GitLab은 IMAP 대신에 Microsoft Graph API를 사용하여 수신 이메일을 읽을 수 있습니다. 왜냐하면 마이크로소프트가 기본 인증과 함께의 IMAP 사용을 폐지하기 때문에, 새 마이크로소프트 Exchange Online 메일함에는 Microsoft Graph API가 필요합니다.

Microsoft Graph를 위해 GitLab을 구성하려면, Mail.ReadWrite 권한을 모든 메일함에 대해 갖는 Azure Active Directory에서 OAuth 2.0 애플리케이션을 등록해야 합니다. 더 많은 세부 정보는 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

마이크로소프트 그래프 구성
gitlab_rails['incoming_email_enabled'] = true

# %{key} 플레이스홀더를 참조하는 데 사용될 이메일 주소(placeholder 포함)입니다.
# 예를 들어: emailaddress+%{key}@example.onmicrosoft.com.
# 플레이스홀더는 주소의 "사용자" 부분( `@` 앞의 부분)에 나타나야 합니다.
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': '<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
}

마이크로소프트 그래프 API는 아직 직접 컴파일한 설치에서는 지원되지 않습니다. 자세한 내용은 이 이슈를 참조하세요.

암호화된 자격 증명 사용

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

전제 조건:

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

암호화된 파일에 대한 지원되는 구성 항목은 다음과 같습니다:

  • user
  • password
Linux 패키지 (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를 편집하고 emailpassword에 대한 incoming_email 설정을 제거합니다.
  5. 파일을 저장하고 GitLab을 다시 구성합니다:

    sudo gitlab-ctl reconfigure
    
Helm 차트 (Kubernetes)

수신 이메일 비밀번호를 저장하기 위해 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을 편집하고 userpassword에 대한 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
    

문제 해결

Email ingestion doesn’t work in 16.6.0

GitLab Self-Managed 16.6.0의 리그레이션으로 인해 mail_room (이메일 수신)의 시작이 방해되는 문제가 있습니다. 서비스 데스크 및 기타 이메일 답장 기능이 작동하지 않습니다. 이 문제를 수정하는 데 기여하는 Issue 432257를 확인하세요.

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

Linux 패키지 (Omnibus)
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