InfoGrab DocsInfoGrab Docs

개발 환경에서 이메일 사용하기

요약

ActionMailer에서 deliver_later를 호출할 때마다 Sidekiq job 이 큐에 등록됩니다. 새 메일러 메서드나 새 메일러를 추가할 때도 마찬가지입니다. 다음은 NotificationService의 예시로, 이 메일러 정의에서 인자를 추가하거나 제거하면 모든 Rails와 Sidekiq 노드가 업데이트된 코드를 갖추기 전 배포 과정에서 문제가 생길 수 있습니다.

메일러 Sidekiq job과의 호환성 보장#

ActionMailer에서 deliver_later를 호출할 때마다 Sidekiq job 이 큐에 등록됩니다. 메일러 인자를 추가하거나 제거해야 한다면 하위 호환성과 상위 호환성을 모두 확보하는 것이 중요합니다. Sidekiq의 워커 인자 변경 절차를 따릅니다.

새 메일러 메서드나 새 메일러를 추가할 때도 마찬가지입니다. 둘 중 하나를 도입한다면 새 워커 추가 절차를 따릅니다. 여기에는 배포 후 문제가 생겼을 때 새 메일러를 비활성화할 수 있도록 새 메서드를 기능 플래그로 감싸는 작업이 포함됩니다.

다음은 NotificationService의 예시로, 이 메일러 정의에서 인자를 추가하거나 제거하면 모든 Rails와 Sidekiq 노드가 업데이트된 코드를 갖추기 전 배포 과정에서 문제가 생길 수 있습니다.

mailer.unknown_sign_in_email(user, ip, time).deliver_later

발송된 이메일#

개발 인스턴스에서 "발송된" 이메일의 렌더링 결과를 보려면 /rails/letter_opener에 접속합니다.

S/MIME 서명 이메일은 현재 letter_opener로 미리 볼 수 없습니다.

메일러 미리보기#

Rails는 샘플 데이터를 사용해 메일러 템플릿을 HTML과 일반 텍스트로 미리 보는 방법을 제공합니다.

미리보기는 app/mailers/previews에 있으며 /rails/mailers에서 확인할 수 있습니다.

자세한 내용은 Rails 가이드를 참고합니다.

수신 이메일#

  1. GitLab 설치 디렉터리로 이동합니다.

  2. config/gitlab.yml에서 incoming_email 섹션을 찾아 기능을 활성화하고 사용하는 IMAP 서버와 이메일 계정의 세부 정보를 입력합니다:

    메일박스가 gitlab-incoming@gmail.com 이라고 가정한 Gmail / Google Apps 구성은 다음과 같습니다:

    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 `@`). It can be omitted but some features,
      # including Service Desk, may not work properly.
      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
    
      # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
      expunge_deleted: false
    

    앞서 설명한 대로 + 뒤의 부분은 무시되며, 이 메시지는 gitlab-incoming@gmail.com의 메일박스로 전달됩니다.

  3. 진행하기 전에 MailRoom Gem 업데이트 섹션을 읽고 올바른 버전의 MailRoom 이 설치되어 있는지 확인합니다. 요약하면 Gemfile의 gitlab-mail_room 버전을 일시적으로 최신 gitlab-mail_room으로 업데이트한 뒤 bundle install을 실행합니다. 임시 조치이므로 이 변경은 커밋하지 않습니다.

  4. GitLab 루트 디렉터리에서 다음 명령을 실행해 mail_room을 시작합니다:

    bundle exec mail_room -q -c config/mail_room.yml
    
  5. 모든 설정이 올바른지 확인합니다:

    bundle exec rake gitlab:incoming_email:check RAILS_ENV=development
    
  6. 이제 이메일 답장 기능이 동작합니다.

이메일 네임스페이스#

GitLab은 이메일 핸들러 주소의 새 형식을 지원합니다. 이는 캐치올 메일박스를 지원하기 위한 것입니다.

새 이메일 핸들러가 필요한 기능을 구현해야 한다면 이메일 키 형식에 관해 다음 규칙을 따릅니다.

  • 액션은 항상 맨 끝에 오며 -로 구분합니다. 예를 들면 -issue 나 -merge-request 입니다
  • 기능이 프로젝트와 관련된다면 키는 프로젝트 식별자(프로젝트 경로 슬러그와 프로젝트 ID)로 시작하며 -로 구분합니다. 예를 들면 gitlab-org-gitlab-foss-20 입니다
  • 작성자 토큰 같은 추가 정보는 프로젝트 식별자와 액션 사이에 -로 구분해 넣을 수 있습니다. 예를 들면 gitlab-org-gitlab-foss-20-Author_Token12345678-issue 입니다
  • 핸들러는 lib/gitlab/email/handler.rb에 등록합니다

유효한 이메일 키 예시는 다음과 같습니다.

  • gitlab-org-gitlab-foss-20-Author_Token12345678-issue (새 이슈 생성)
  • gitlab-org-gitlab-foss-20-Author_Token12345678-merge-request (새 머지 리퀘스트 생성)
  • 1234567890abcdef1234567890abcdef-unsubscribe (대화 구독 취소)
  • 1234567890abcdef1234567890abcdef (대화에 답장)

GitLab에서는 -issue- 액션을 Service Desk 기능의 핸들러로 사용합니다.

레거시 형식#

기존 레거시 형식도 계속 지원하지만, 새 기능에는 레거시 형식을 사용하지 않습니다. 이메일 핸들러에 유효한 레거시 형식은 다음이 전부입니다.

  • path/to/project+namespace
  • path/to/project+namespace+action
  • namespace
  • namespace+action

GitLab에서 Service Desk 기능의 핸들러는 path/to/project 입니다.

MailRoom Gem 업데이트#

GitLab은 필요할 때 gem을 빠르게 업데이트할 수 있도록 MailRoom의 포크인 gitlab-mail_room을 사용합니다. 변경 사항은 가능한 한 빨리 업스트림에 반영해 두 프로젝트를 동기화된 상태로 유지합니다.

MailRoom을 업데이트하려면 다음과 같이 합니다.

  1. GitLab Rails의 Gemfile을 업데이트합니다(예시 머지 리퀘스트 참고).
  2. Helm Chart 구성을 업데이트합니다(예시 머지 리퀘스트 참고).

개발 문서로 돌아가기

개발 환경에서 이메일 사용하기

GitLab v19.4
원문 보기

요약

ActionMailer에서 deliver_later를 호출할 때마다 Sidekiq job 이 큐에 등록됩니다. 새 메일러 메서드나 새 메일러를 추가할 때도 마찬가지입니다. 다음은 NotificationService의 예시로, 이 메일러 정의에서 인자를 추가하거나 제거하면 모든 Rails와 Sidekiq 노드가 업데이트된 코드를 갖추기 전 배포 과정에서 문제가 생길 수 있습니다.

메일러 Sidekiq job과의 호환성 보장#

ActionMailer에서 deliver_later를 호출할 때마다 Sidekiq job 이 큐에 등록됩니다. 메일러 인자를 추가하거나 제거해야 한다면 하위 호환성과 상위 호환성을 모두 확보하는 것이 중요합니다. Sidekiq의 워커 인자 변경 절차를 따릅니다.

새 메일러 메서드나 새 메일러를 추가할 때도 마찬가지입니다. 둘 중 하나를 도입한다면 새 워커 추가 절차를 따릅니다. 여기에는 배포 후 문제가 생겼을 때 새 메일러를 비활성화할 수 있도록 새 메서드를 기능 플래그로 감싸는 작업이 포함됩니다.

다음은 NotificationService의 예시로, 이 메일러 정의에서 인자를 추가하거나 제거하면 모든 Rails와 Sidekiq 노드가 업데이트된 코드를 갖추기 전 배포 과정에서 문제가 생길 수 있습니다.

mailer.unknown_sign_in_email(user, ip, time).deliver_later

발송된 이메일#

개발 인스턴스에서 "발송된" 이메일의 렌더링 결과를 보려면 /rails/letter_opener에 접속합니다.

S/MIME 서명 이메일은 현재 letter_opener로 미리 볼 수 없습니다.

메일러 미리보기#

Rails는 샘플 데이터를 사용해 메일러 템플릿을 HTML과 일반 텍스트로 미리 보는 방법을 제공합니다.

미리보기는 app/mailers/previews에 있으며 /rails/mailers에서 확인할 수 있습니다.

자세한 내용은 Rails 가이드를 참고합니다.

수신 이메일#

  1. GitLab 설치 디렉터리로 이동합니다.

  2. config/gitlab.yml에서 incoming_email 섹션을 찾아 기능을 활성화하고 사용하는 IMAP 서버와 이메일 계정의 세부 정보를 입력합니다:

    메일박스가 gitlab-incoming@gmail.com 이라고 가정한 Gmail / Google Apps 구성은 다음과 같습니다:

    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 `@`). It can be omitted but some features,
      # including Service Desk, may not work properly.
      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
    
      # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
      expunge_deleted: false
    

    앞서 설명한 대로 + 뒤의 부분은 무시되며, 이 메시지는 gitlab-incoming@gmail.com의 메일박스로 전달됩니다.

  3. 진행하기 전에 MailRoom Gem 업데이트 섹션을 읽고 올바른 버전의 MailRoom 이 설치되어 있는지 확인합니다. 요약하면 Gemfile의 gitlab-mail_room 버전을 일시적으로 최신 gitlab-mail_room으로 업데이트한 뒤 bundle install을 실행합니다. 임시 조치이므로 이 변경은 커밋하지 않습니다.

  4. GitLab 루트 디렉터리에서 다음 명령을 실행해 mail_room을 시작합니다:

    bundle exec mail_room -q -c config/mail_room.yml
    
  5. 모든 설정이 올바른지 확인합니다:

    bundle exec rake gitlab:incoming_email:check RAILS_ENV=development
    
  6. 이제 이메일 답장 기능이 동작합니다.

이메일 네임스페이스#

GitLab은 이메일 핸들러 주소의 새 형식을 지원합니다. 이는 캐치올 메일박스를 지원하기 위한 것입니다.

새 이메일 핸들러가 필요한 기능을 구현해야 한다면 이메일 키 형식에 관해 다음 규칙을 따릅니다.

  • 액션은 항상 맨 끝에 오며 -로 구분합니다. 예를 들면 -issue 나 -merge-request 입니다
  • 기능이 프로젝트와 관련된다면 키는 프로젝트 식별자(프로젝트 경로 슬러그와 프로젝트 ID)로 시작하며 -로 구분합니다. 예를 들면 gitlab-org-gitlab-foss-20 입니다
  • 작성자 토큰 같은 추가 정보는 프로젝트 식별자와 액션 사이에 -로 구분해 넣을 수 있습니다. 예를 들면 gitlab-org-gitlab-foss-20-Author_Token12345678-issue 입니다
  • 핸들러는 lib/gitlab/email/handler.rb에 등록합니다

유효한 이메일 키 예시는 다음과 같습니다.

  • gitlab-org-gitlab-foss-20-Author_Token12345678-issue (새 이슈 생성)
  • gitlab-org-gitlab-foss-20-Author_Token12345678-merge-request (새 머지 리퀘스트 생성)
  • 1234567890abcdef1234567890abcdef-unsubscribe (대화 구독 취소)
  • 1234567890abcdef1234567890abcdef (대화에 답장)

GitLab에서는 -issue- 액션을 Service Desk 기능의 핸들러로 사용합니다.

레거시 형식#

기존 레거시 형식도 계속 지원하지만, 새 기능에는 레거시 형식을 사용하지 않습니다. 이메일 핸들러에 유효한 레거시 형식은 다음이 전부입니다.

  • path/to/project+namespace
  • path/to/project+namespace+action
  • namespace
  • namespace+action

GitLab에서 Service Desk 기능의 핸들러는 path/to/project 입니다.

MailRoom Gem 업데이트#

GitLab은 필요할 때 gem을 빠르게 업데이트할 수 있도록 MailRoom의 포크인 gitlab-mail_room을 사용합니다. 변경 사항은 가능한 한 빨리 업스트림에 반영해 두 프로젝트를 동기화된 상태로 유지합니다.

MailRoom을 업데이트하려면 다음과 같이 합니다.

  1. GitLab Rails의 Gemfile을 업데이트합니다(예시 머지 리퀘스트 참고).
  2. Helm Chart 구성을 업데이트합니다(예시 머지 리퀘스트 참고).

개발 문서로 돌아가기