開発者向けEメールサービス

メーラーSidekiqジョブとの互換性の確保

Sidekiqジョブは、deliver_laterActionMailer で呼び出されるたびにエンキューされます。メーラーの引数を追加または削除する必要がある場合、後方互換性と前方互換性の両方を確保することが重要です。ワーカーの引数を変更する場合は、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.ymlincoming_email セクションを見つけ、機能を有効にし、特定のIMAPサーバーとメールアカウントの詳細を記入してください:

    Gmail / Googleアプリの設定、メールボックスを想定gitlab-incoming@gmail.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}@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の正しいバージョンがインストールされていることを確認するため、先に進む前にMailRoom Gemのアップデートのセクションを読んで詳細を確認してください。要約すると、Gemfilegitlab-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 11.7から、メールハンドラーアドレスの新しいフォーマットに対応しました。これはキャッチオールメールボックスをサポートするためです。

新しいメールハンドラを必要とする機能を実装する必要がある場合は、メールキーのフォーマットについて以下の規則に従ってください:

  • アクションは常に最後に、- で区切ります。例えば、-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 (会話に返信)

アクション-issue- は GitLab 内でサービスデスク機能のハンドラとして使用されています。

レガシーフォーマット

古いレガシーフォーマットも引き続きサポートしていますが、新しい機能ではレガシーフォーマットを使用しないでください。メールハンドラとして有効なレガシーフォーマットはこれだけです:

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

GitLab では、サービスデスク機能のハンドラーはpath/to/project です。

MailRoom Gem の更新

私たちはMailRoomのフォークであるgitlab-mail_room を使用しています。できるだけ早く変更をアップストリームし、2つのプロジェクトの同期を保つようにしています。

MailRoomを更新するには

  1. GitLab RailsのGemfileマージリクエストの例を参照)を更新してください。
  2. Helm Chart の設定を更新しました (マージリクエストの例を参照)。

開発者向けドキュメントに戻る