[Rails] Whenever에서 대량 처리(알림을 읽지 않은 경우 Action Mailer를 통해 3개 이상)

Whenever에서 정기적으로 일괄 처리를 하고'3개 이상의 읽지 않은 알림이 있으면 Action Mailr를 통해 메일을 보낸다'는 실시 방법을 기재한다.대상은 매일 아침 8시에 아래의 메일을 발송한다.

전제 조건

  • 알림 기능 구현

  • 나의 상황은 이미 상술한 통지 기능을 만들었다.

    대략적인 절차

  • Action Mailer를 통한 메시지 생성
  • 동작 메일 정의'3개 이상 읽지 않은 사용자 발견 및 메일 발송'처리
  • 메일 내용 제작
  • whenever 가져오기
  • 1일 1회, whenever에서 2(메일 발송)
  • 실행

    설치 방법


    1. Action Mailer를 통한 메시지 생성

  • Action Mailer의 기본 내용은 아래 글에 상세하게 기재되어 있다
  • [Rails 입문 설명서] Action Mailer에 대한 해설.
    [초보자용] Rubi on Rails 애플리케이션을 통해 메일 발송 기능을 실현하는 방법
  • 메일 생성
  • rails g mailer ScheduledProcessing
    
    다음 파일을 만들 수 있습니다
    폴더 파일 이름
    app/meilers/application_mailer.rb    
    controller 같은 인상.
    app/meilers/scheduled_processing_mailer.rb     
    controller 같은 인상.
    app/views/scheduled_processing_e-메일(폴더)
    비주얼

    2. 동작 이미지에서 "읽지 않은 사용자 3개 이상 찾아서 메일 보내기" 처리 정의

  • app/meilers/application_mailer.rb
  • class ApplicationMailer < ActionMailer::Base
      default from: "ノミジョイ!チーム(ここは送り先。任意の名前を入力) <[email protected]>"
      layout 'mailer'
    end
    
  • app/meilers/scheduled_processing_mailer
  • class ScheduledProcessingMailer < ApplicationMailer
      def check_notice_mail
        @url = "https://nomi-joy.com/users/sign_in"
    
        users_with_unckecked_notices = User.all.select do |user|
          user.passive_notifications.where(visited_id: user.id, checked: false).count >= 3
        end
    
        users_with_unckecked_notices_mails = users_with_unckecked_notices.pluck(:email)
    
        mail(subject: "未読の通知が3件以上あります", bcc: users_with_unckecked_notices_mails)
      end
    end
    
    방법명check_notice_mail이지만 여기는 임의로 되어 있어 문제없습니다.@url = "https://nomi-joy.com/users/sign_in" 발송한 메일에 앱의 로그인 화면에 URL을 표시하고 싶어 기재했고, 필요하지 않으면 기재하지 않아도 된다.
    select는 반환값이 실제 요소의 배열을 수집하는 방법으로 users_with_unckecked_notices 읽지 않은 알림은 3건 이상의 User들의 배열이다.
    "지금의 모든 User를 한 명씩 조사합니다. user에게 연락한 (수신) 알림에 읽지 않은 알림이 3개 이상 있는지 확인합니다. 만약 사실이라면 해당 User를 배열하세요. users with unckecked notices가 배열되어 있습니다."이런 느낌이야.
    'user.passive_notifications.where(visited id:user.id,checked:가짜)'는 알림 기능의 디자인에 따라 달라질 수 있으니 자신의 설치에 따라 변경하십시오.
    pluck은 매개 변수에 설정된 열 (여기는 이메일) 의 데이터만 수집하여 배열하는 방법입니다.따라서 users_with_unckecked_notices_mails는 다음과 같다.
    users_with_unckecked_notices_mails
    => ["[email protected]","[email protected]"]
    
    메일(subject: "3개 이상의 읽지 않은 알림이 있음", bcc:users with unckecked notices mails)을 통해 메일을 보냅니다.bcc를 to로 바꿔도 돼요.

    3. 메일 내용 작성

  • app/views/scheduled_processing_메일러 (폴더) 에서 다음 파일을 새로 만듭니다

  • 파일 이름
    check_notice_mail.html.erb    
    html    
    check_notice_mail.text.erb     
    text
  • check_notice_mail.html.erb
  • <!doctype html>
    <html lang="ja">
    <head>
    <meta content="text/html; charset=UTF-8" />
    <style>
    /* h2,p{
    color:#215c89;
    } */
    </style>
    </head>
    <body> 
    <hr>
    <h3>未読の通知が3件以上あります</h3>
    <hr>
    <p>通知は【フォローされたとき】、【ダイレクトメッセージが届いたとき】、【新規ノミカイに招待されたとき】、【カンジから何かしらの連絡を受けたとき】に届きます。</p>
    <p>◆詳細は下記よりログインして【Notice(通知)】からご確認いただけます。</p>
    <p>&ensp;ノミジョイ!ログインページ:<br>&ensp;<%= @url %></p>
    <br>
    <p>※このメールは送信専用です。</p>
    <hr>
    <h3>ノミジョイ!チーム</h3>
    <hr>
    </body>
    </html>
    
  • check_notice_mail.text.erb
  • ===============================
     未読の通知が3件以上あります
    ===============================
    通知は【フォローされたとき】、【ダイレクトメッセージが届いたとき】、【新規ノミカイに招待されたとき】、【カンジから何かしらの連絡を受けたとき】に届きます。
    
    ◆詳細は下記よりログインして【Notice(通知)】からご確認いただけます。
      ノミジョイ!ログインページ:
      <%= @url %>
    
    ※このメールは送信専用です。
    ===============================
     ノミジョイ!チーム
    ===============================
    

    4. whenever 가져오기

  • 본고 설정 참조
  • Action Mailer 및 whenever를 사용한 Rails 메일 자동 배포

    5.1일 1회 2회, whenever 실행(메일 발송)

  • schedule.rb를 이하로 변경(이하 개발 환경을 전제로 한 기술)
  • # 絶対パスから相対パス指定
    env :PATH, ENV['PATH']
    
    # ログファイルの出力先
    set :output, 'log/cron.log'
    
    # ジョブの実行環境の指定(実行環境はprodaction環境がデフォルト設定)
    set :environment, :development
    
    # 日本時間の午前8:00にメール送信される(JSTは+9:00なので-9:00の時間を記述)
    # 未読通知が3件以上たまっているユーザーにメール通知
    every 1.days, at: '11:00 pm' do
      runner "ScheduledProcessingMailer.check_notice_mail.deliver_now"
    end
    
    이번에는 일본시간 오전 8시로 설정해 이메일을 보냈다.처음에는 디버깅을 위해 다음과 같이 확인할 수 있을 것 같습니다.
    every 1.minutes do
       runner "ScheduledProcessingMailer.check_notice_mail.deliver_now"
    end
    
  • schedule.rb의 변경을cron
  • 에 등록하기
    bundle exec whenever --update-crontab
    
  • 반영 여부 확인
  • crontab  -l 
    
    ScheduledProcessingMailer.check_notice_메일에 기재가 되면 등록을 하겠습니다.
    로그는log/cron입니다.로그 확인 가능

    =>이러면 메일을 보내야지!!


  • 일괄 처리를 멈추고 싶을 때(cron을 비워 두기)
  • bundle exec whenever --clear-crontab
    
  • 반영 여부 확인
  • crontab  -l 
    
    비우면 오케이.

    좋은 웹페이지 즐겨찾기