Rails – MailChimp APIのまとめ

Before You Start

API Resources

APIのURLは以下の通り。


https://.api.mailchimp.com/3.0

の部分には、自分が保有するアカウントのデータセンタを指定する。
API keyの最後の部分を見れば、どのデータセンタを指定すべきか知ることができる(例えば、”us5″ や “us6″)。

Authentication

認証は HTTP Basic authentication により行う。
UsernameはStringであれば何でもOK。PasswordはアカウントのAPI key。


Username: anystring
Password: your_apikey

Railsでの実装例

MailChimp APIコールを呼ぶ処理を Service として実装する。

APIコール共通部分

まずはinitializeを定義。


class MailChimpService
  attr_reader :user

  def initialize(user)
    @user = user
    @base_url = "https://us6.api.mailchimp.com/3.0"
    @api_username = "anystring"
    # 以下、secrets.yml から参照
    @api_key = Rails.application.secrets.mail_chimp_api_key
    @list_id = Rails.application.secrets.mail_chimp_list_id
  end

end

次にprivateメソッドとして、API コールを呼ぶ call_api メソッドを定義する。


class MailChimpService
  # (省略)
  require 'open-uri' 
  require 'openssl'
  require 'net/http' 
  require 'json' 
 
  private
  # http_method: "Get", "Post", "Patch", "Delete"
  def call_api(http_method, url, params=nil)
    uri = Addressable::URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.inferred_port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    if params.present?
      req = Net::HTTP.const_get(http_method).new(uri.path, 'Content-Type' => 'application/json')
      req.body = params.to_json  
    else
      req = Net::HTTP.const_get(http_method).new(uri.path)
    end
    req.basic_auth @api_username, @api_key
    res = http.request(req)
    res.body.present? ? JSON.parse(res.body) : nil
  end

end

注意点としては、単純に、


uri = URI.parse(url)

としていると、メアドのハッシュ値をURLに含める場合(後述)に以下のエラーが出てしまう。


URI::InvalidURIError

このエラーに対応するために、”gem addressable” を用い、以下のように書く。


uri = Addressable::URI.parse(url)

なお、Addressable::URIを用いた場合、


http = Net::HTTP.new(uri.host, uri.port)

ではなく、


 http = Net::HTTP.new(uri.host, uri.inferred_port)

としておかないと、以下のエラーが出てしまう。


OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol

メンバーの追加

新しいメールアドレス(メンバー)をリストに追加する場合は、以下のAPIを用いる。


POST /lists/{list_id}/members

必須パラメータは以下の通り。

  • email_address
  • status (subscribed, unsubscribed, cleaned or pending)

先ほどの共通部分のServiceを継承させた新しいServiceにより実装を行う。


module MailChimp
  class CreateListMemberService < ::MailChimpService

    def execute
      url = @base_url + "/lists/#{@list_id}/members"
      params = {
        email_address: @user.email,
        status: "subscribed",
        merge_fields: set_merge_fields
      }
      call_api("Post", url, params)
    end
  
    private
    def set_merge_fields
      {
          "NAME":        @user.name,
          "CUSTOM":   "CUSTOM PARAM"
      }
    end
    
  end
end

カスタムで設定したパラメータは "merge_fields" の値(ハッシュ)で渡すことができる。

このサービスをコントローラ等から呼び出すことで、新しいメールアドレスをリストに追加できる。


service = MailChimp::CreateListMemberService.new(current_user)
service.execute

メンバーの更新

メンバーの情報を更新する場合は、以下のAPIを用いる。


PATCH /lists/{list_id}/members/{subscriber_hash}

subscriber_hashとは、メンバーのemail addressのMD5ハッシュ値である。
したがって、以下のようなハッシュ値を生成するメソッドが必要となる。


  def set_subscriber_hash
    Digest::MD5.hexdigest(@user.email)
  end

メンバーの追加と同様に、共通部分のServiceを継承させた新しいServiceにより実装を行う。
なぜかドキュメントにある "email_address" にパラメータを渡してもメアドが更新されない点に注意。
merge_fieldsに "EMAIL" もしくは "MERGE0" としてセットすれば更新することができた。


module MailChimp
  class UpdateListMemberService < ::MailChimpService

    def execute(new_email=nil)
      url = @base_url + "/lists/#{@list_id}/members/#{set_subscriber_hash}"
      params = { merge_fields: set_merge_fields(new_email) }
      call_api("Patch", url, params)
    end

    private
    def set_subscriber_hash
      Digest::MD5.hexdigest(@user.email)
    end

    def set_merge_fields(new_email)
      {
          "EMAIL":        new_email ||  @user.email,
          "NAME":        @user.name,
          "CUSTOM":   "CUSTOM PARAM"
      }
    end    

  end
end

このサービスをコントローラ等から呼び出すことで、メンバーの情報を更新できる。


service = MailChimp::UpdateListMemberService.new(current_user)
service.execute("new_address@example.com")

Sources

兵庫県西宮市生まれのフリーランスRailsエンジニア。海外を拠点にデジタルノマド生活中。/ 前職・資格:公認会計士 / プログラミング言語:Ruby, JavaScript, HTML, CSS / 日本語・英語
コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です