개발 환경에서 이메일 사용하기
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 가이드를 참고합니다.
수신 이메일#
-
GitLab 설치 디렉터리로 이동합니다.
-
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의 메일박스로 전달됩니다. -
진행하기 전에 MailRoom Gem 업데이트 섹션을 읽고 올바른 버전의 MailRoom 이 설치되어 있는지 확인합니다. 요약하면
Gemfile의gitlab-mail_room버전을 일시적으로 최신gitlab-mail_room으로 업데이트한 뒤bundle install을 실행합니다. 임시 조치이므로 이 변경은 커밋하지 않습니다. -
GitLab 루트 디렉터리에서 다음 명령을 실행해
mail_room을 시작합니다:bundle exec mail_room -q -c config/mail_room.yml -
모든 설정이 올바른지 확인합니다:
bundle exec rake gitlab:incoming_email:check RAILS_ENV=development -
이제 이메일 답장 기능이 동작합니다.
이메일 네임스페이스#
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+namespacepath/to/project+namespace+actionnamespacenamespace+action
GitLab에서 Service Desk 기능의 핸들러는 path/to/project 입니다.
MailRoom Gem 업데이트#
GitLab은 필요할 때 gem을 빠르게 업데이트할 수 있도록
MailRoom의 포크인
gitlab-mail_room을 사용합니다. 변경 사항은
가능한 한 빨리 업스트림에 반영해 두 프로젝트를 동기화된 상태로 유지합니다.
MailRoom을 업데이트하려면 다음과 같이 합니다.
- GitLab Rails의
Gemfile을 업데이트합니다(예시 머지 리퀘스트 참고). - Helm Chart 구성을 업데이트합니다(예시 머지 리퀘스트 참고).