Отправка писем в Rails по протоколу HTTP (MailGun API) - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь отправлять электронные письма, используя API пакетной отправки MailGun, используя MailGun ruby ​​sdk (https://github.com/mailgun/mailgun-ruby/blob/master/docs/MessageBuilder.md). На данный момент у меня есть этот метод внутри класса, который наследуется от ActionMailer.

class BatchMailer < ApplicationMailer
  def send_batch_email(mail, recipients)

    # First, instantiate the Mailgun Client with your API key
    mg_client = Mailgun::Client.new("your-api-key")

    # Create a Batch Message object, pass in the client and your domain.
    mb_obj = Mailgun::BatchMessage.new(mg_client, "example.com")

    # Define the from address.
    mb_obj.from("me@example.com", {"first" => "Ruby", "last" => "SDK"});

    # Define the subject.
    mb_obj.subject("A message from the Ruby SDK using Message Builder!");

    # Define the body of the message.
    mb_obj.body_text("This is the text body of the message!");


    # Loop through all of your recipients
    mb_obj.add_recipient(:to, "john.doe@example.com", {"first" => "John", "last" => "Doe"});
    mb_obj.add_recipient(:to, "jane.doe@example.com", {"first" => "Jane", "last" => "Doe"});
    mb_obj.add_recipient(:to, "bob.doe@example.com", {"first" => "Bob", "last" => "Doe"});
    ...
    mb_obj.add_recipient(:to, "sally.doe@example.com", {"first" => "Sally", "last" => "Doe"});

    # Call finalize to get a list of message ids and totals.
    message_ids = mb_obj.finalize
    # {'id1234@example.com' => 1000, 'id5678@example.com' => 15}
  end
end

Isправильный способ сохранить метод, который не использует actionmailer для отправки писем внутри почтовой программы?

Метод ActionMailer возвращает почтовый объект, но при попытке написать спецификацию для метода, который использует API для отправки электронных писем, я не могувозможность получить ответ, так как не будет почтового объекта (объекта сообщения ActionMailer). Где хранить этот метод и как его можно проверить?

1 Ответ

0 голосов
/ 30 ноября 2018

Это правильный способ сохранить метод, который не использует actionmailer для отправки электронных писем внутри почтовой программы?

Нет смысла использовать Mailer в этом случае.Просто используйте сервисный объект (обычный старый объект ruby ​​или PORO).Это может выглядеть примерно так:

class BatchMailerService

  attr_accessor *%w(
    mail 
    recipients
    recipient
  ).freeze

  delegate *%w(
    from
    subject
    body_text
    add_recipient
    finalize
  ), to: :mb_obj

  delegate *%w(
    address 
    first_name 
    last_name
  ), to: :recipient, prefix: true

    class << self 

      def call(mail, recipients)
        new(mail, recipients).call
      end

    end # Class Methods

  #==============================================================================================
  # Instance Methods
  #==============================================================================================

    def initialize(mail, recipients)
      @mail, @recipients = mail, recipients
    end

    def call
      setup_mail
      add_recipients
      message_ids = finalize
    end

  private 

    def mg_client
      @mg_client ||= Mailgun::Client.new(ENV["your-api-key"])
    end

    def mb_obj
      @mb_obj ||= Mailgun::BatchMessage.new(mg_client, "example.com")
    end

    def setup_mail
      from("me@example.com", {"first" => "Ruby", "last" => "SDK"})
      subject("A message from the Ruby SDK using Message Builder!")
      body_text("This is the text body of the message!")
    end

    def add_recipients
      recipients.each do |recipient|
        @recipient = recipient
        add_recipient(
          :to, 
          recipient_address, 
          {
            first:  recipient_first_name,
            last:   recipient_last_name
          }
        )
      end
    end

end

Что бы вы использовали что-то вроде:

BatchMailerService.call(mail, recipients)

(при условии, естественно, что у вас есть переменные с именами mail и recipients).

Где хранить этот метод?

Вы можете поместить этот файл в app/services/batch_mailer_service.rb.

Как его можно проверить?

Что вы имеете в виду?То, как вы тестируете услугу, зависит от ваших критериев успеха.Вы можете проверить, что mb_obj получает вызов finalize (возможно, используя что-то вроде expect().to receive).Вы можете проверить message_ids содержит правильную информацию (возможно, используя что-то вроде expect().to include).Это отчасти зависит.

...