동적 SendGrid 이메일 템플릿을 사용하여 Ruby on Rails용 SendGrid SDK를 사용하여 이메일 보내기

13206 단어 rubyrails
이전 기사에서  ‘Mail Sending API perks over SMTP in Ruby on Rails using MailGun or SendGrid,’  SMTP를 통한 API 사용의 많은 이점에 대해 설명했습니다.

이 기사에서는 Ruby on Rails에서 SendGrid SDK를 사용하여 SendGrid의 동적 템플릿을 포함하고 이메일에 첨부 파일을 포함하여 이메일을 보내는 방법에 대해 자세히 설명합니다.

Rails에 SendGrid SDK 추가



Gemfile에서 공식 SendGrid gem을 추가합니다.

gem 'sendgrid-ruby', '~> 6.6', '>= 6.6.2'


그리고 bundle install를 실행합니다.

SendGrid용 동적 템플릿



SendGrid의 더 강력한 기능은 동적 템플릿을 추가하는 기능이라고 생각합니다. 비주얼 빌더 또는 HTML을 사용하여 템플릿을 만들 수 있습니다. 두 경우 모두 멋진 템플릿을 쉽게 만들 수 있도록 멋진 반응형 이메일 미리보기를 제공합니다.

이러한 템플릿은 대체 옵션도 제공합니다. 예를 들어 트랜잭션 이메일을 작성하고 수신자의 이름은 해당 이메일을 보내는 사람에 따라 다릅니다. 그래서 {{name}} 와 같이 템플릿에 변수를 언급하고 SDK를 통해 이메일을 보낼 때 아래와 같이 대체 값에 대한 JSON 객체를 보냅니다.

{
  "name": "Sulman Baig"
}


템플릿 생성을 완료하면 template_id 가 표시됩니다. 나중에 사용할 수 있도록 해당 ID를 저장하십시오.

SendGrid의 API 키 받기:



공식 문서에 언급된 단계에 따라 SendGrid의 API 키를 얻을 수 있습니다. https://docs.sendgrid.com/ui/account-and-settings/api-keys#creating-an-api-key

이메일 작업:



이제 template_idAPI Key 가 있으므로 동적 템플릿과 첨부 파일을 사용하여 데이터베이스의 사용자에게 이메일을 보내는 이메일 작업을 생성해 보겠습니다.

아래 코드 스니펫을 가정합니다.
  • EXPORT_TEMPLATE ENV에 생성한 템플릿 ID가 포함됨
  • SENDGRID_API_KEY ENV에는 SendGrid의 API 키가 포함되어 있습니다.
  • @tempfile는 첨부 파일로 보내기 위해 로컬에 저장된 파일입니다.
  • user_idnameemail와 같은 속성으로 데이터베이스에 저장된 사용자입니다.

  • 이제 파일app/jobs/email_job.rb을 만들고 다음 코드를 추가합니다.

    You can include the sidekiq gem and call this job asynchronously.



    # frozen_string_literal: true
    
    require 'sendgrid-ruby'
    
    #### Example Call
    # EmailJob.new.perform(
    #         @user.id,
    #         { name: @user.name },
    #         ENV.fetch('EXPORT_TEMPLATE', nil),
    #         [
    #           {
    #             file: @tempfile.path,
    #             type: 'application/csv',
    #             name: @tempfile.path.split('/').last,
    #             content_id: 'export_file'
    #           }
    #         ]
    #       )
    
    # This is the email job that will be sent to the user
    class EmailJob
      include SendGrid
    
      # From Email and Name
      NOREPLY_FROM_EMAIL = '[email protected]'
      NOREPLY_FROM_NAME = 'All Wallet'
    
      # include sidekiq to call perform as perform_async
      def perform(user_id, subsitutions, template_id, attachments = nil) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
        # initialize sendgrid api
        sg = SendGrid::API.new(api_key: ENV.fetch('SENDGRID_API_KEY', nil))
        # we will get to_email from user object saved in db
        user = User.kept.find_by(id: user_id)
        return unless user
    
        # initialize mail object of sendgrid
        mail = Mail.new
        # fill 'from' data from the constants mentioned above
        mail.from = Email.new(email: NOREPLY_FROM_EMAIL, name: NOREPLY_FROM_NAME)
        # personalization is object for email to data and templates
        personalization = Personalization.new
        # add user data to which email to be sent
        personalization.add_to(Email.new(email: user.email, name: user.name))
        # add substitutions to template created in sendgrid to replace the variable in template like `{{name}}`
        # {
        #   "name": "Sulman Baig"
        # }
        personalization.add_dynamic_template_data(subsitutions)
        mail.add_personalization(personalization)
        mail.template_id = template_id
    
        # If attachments are sent as arguments
        if attachments.present? && attachments.is_a?(Array) && attachments.size.positive?
          attachments.each do |attachment_input|
            attachment = Attachment.new
            # attachment has to be sent as base64 encoded string
            attachment.content = Base64.strict_encode64(File.read(attachment_input[:file])) # file: path of file saved in local or remote
            attachment.type = attachment_input[:type] # type of file e.g. application/csv
            attachment.filename = attachment_input[:name] # filename
            attachment.disposition = 'attachment'
            attachment.content_id = attachment_input[:content_id] # e.g. export_file
            mail.add_attachment(attachment)
          end
        end
    
        begin
          # Send Email
          sg.client.mail._('send').post(request_body: mail.to_json)
        rescue StandardError => e
          # TODO: capture exception
        end
      end
    end
    


    GitHub Gist

    위 작업에 대한 예제 호출은 다음과 같습니다.

    EmailJob.new.perform(
            @user.id,
            { name: @user.name },
            ENV.fetch('EXPORT_TEMPLATE', nil),
            [
              {
                file: @tempfile.path,
                type: 'application/csv',
                name: @tempfile.path.split('/').last,
                content_id: 'export_file'
              }
            ]
          )
    



    행복한 코딩!

    좋은 웹페이지 즐겨찾기