SakuraWi - BLog

WEBエンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

【Ruby on Rails】SendGridのAPIを使ってメールを送信する

Ruby on Railsでメールを飛ばすのを利用するときに SendGridを検討することは多いと思います。

結構本番環境で飛ばしたり、API使ってやるにあたってハマったところが多かったので残します。

smtpの設定で飛ばす方法の記事は多いのですが、APIを利用する記事が少なかったのもあり。

Ruby on RailsでSendGrid APIを使う概要

SendGridを利用してメールを飛ばす際に、SMTPを利用して設定してMailerからメールを送る方法が一般的(よく検索ヒットする)ですが、
SendGridには便利なAPIが提供されています。

Ruby on Railsを利用しつつ、SendGrid APIを利用するメリットとしては、以下がありますかね。

  • API Keyのみの設定で良い。 usernameやpasswordの設定が不要
  • イベントの設定ができる(API経由の方がイベントなどを設定できたりするぽい?です。)

まずはSendGridのAPIドキュメントを見よう

公式のドキュメントはこちら。
Rubyもちゃんとあります。

https://sendgrid.kke.co.jp/docs/API_Reference/Web_API_v3/index.html

ほぼメールのclassを利用する箇所をみれば、まぁなるほどとはなると思います。

事前設定をしてからrequestするってイメージですね。

README(github)
https://github.com/sendgrid/sendgrid-ruby

https://github.com/sendgrid/sendgrid-ruby#with-mail-helper-class

が、これをRailsのActionMailerと一緒に使おうと思うとちょっとうまく噛み合わせる必要がありそうです。

いい感じにSendGridのAPIをRuby on Railsで利用する

で、便利な記事がこちら。

https://techracho.bpsinc.jp/yamada/2018_12_22/67222

ほぼ上記のコードをコピペしたら動きます。

が、少し修正点が必要だったりしたので。

fromのドメインをきちんと設定する

fromで送られるメールの送信元は、sendgridの方できちんと設定しておく必要があります。 ドメインの問題ですね。

sendgridのサイトで登録しましょう。

mail.body.raw_source

この部分ですが、Railsのメールの設定によっては、空白で返されてしまいます。

APIからのレスポンスを見ると、content部分は空白では飛ばせないようです。

f:id:Saku-Saku:20200428202101p:plain

そのため、raw_sourceをうまくとれるようにしてあげます。

    content = SendGrid::Content.new(type: 'text/plain', value: mail.body.parts[0].body.raw_source)

plainのtext.haml(.erb)と htmlのメールのテンプレートがあった場合、選択できるようになっているため、 .parts[0] が必要になるようです。

Rails6のwarningがでる

lib/配下においたりすることで、RspecでエラーがでたりRails6でのエラーが生じてました。

以下の記事で対応しました。

lib配下において、requireすると警告は消えてうまく動作してくれます。

一応、 models配下や mailers配下でも動くのは動くみたいです。 ただ、initializeのメソッドが呼ばれていたりすると警告がでるみたい。

https://qiita.com/jnchito/items/b8f40e7fe82b07bc3de8

また、ファイル名によって読み込みがうまくされない、ということもあったので、そこも注意しましょう。

meilの送信に関する独自のメソッドを適用することについて

Action Mailerのdelivery_methodに独自の配信方法を追加する場合、なぜそのように書くのかの理解が深まりました。

https://qiita.com/sheepland/items/0bbf5c6f9fba08caf0a6

【Chrome拡張】DOMの表示を待ってからクリックさせたい

【Chrome拡張】編です。

今回はタブが新しく開けたりした場合にDOMの表示を待ってからjsでクリックさせたい時のノウハウを書きます。

結論から書くと以下です。

const jsInitCheckTimer = setInterval(jsLoaded, 1000);


function jsLoaded() {
      if (document.querySelector('.xxx') != null) {
          clearInterval(jsInitCheckTimer);
          $(".xxx").click();

...
    

setIntervalによって、その時間毎に実行させます。 loadがされていればif文の分岐から処理がされます。 この時にintervalが終了するコードを差し込んでいますね。

色々settimeoutなども試しましたが、これがうまく動作してそうなので。

参考にさせてもらった記事

コードはこちらから書かせてもらいました。 https://qiita.com/3mc/items/c3c580ca5de4a2d3990d

【Chrome拡張】新規タブの読み込み完了をフックさせる方法

【Chrome拡張】の開発についての記事です。

タブが作成された時に、読み込み完了をさせてから処理を書きたい時の方法を書きます。

結論のコードから先にのせておきます。

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab){
  console.log("created tabs and update");
  if (changeInfo.status === 'complete') {
    console.log("status is complete");

    // 処理
  }
}

どうも、chrome.tabsには、読み込み時の loadingというステータスと、completeというスタータスが存在するようです。

なので、タブが作られたときには処理が2回走ります。

で、onUpdatedの時の、changeInfo.statusの中身をみてやればよいみたいです。

上記のコードでは console.logで確かめられるようにしてます。

実際にタブを開いてみたら、わかると思います。

consoleの吐き出しの見方はこの記事をみてください。

https://sakurawi.hateblo.jp/entry/check-background

参考

https://groups.google.com/forum/#!topic/chrome-api-developers-jp/LxMOHwhIl98

http://kenzauros.com/blog/event-listener-templates-of-tabs-in-chrome-extension-api/

【Chrome拡張】background.jsの発火の確認方法

background.jsのconsole.log などが出力されているのか、発火しているのか気になった時は、

chrome://extensions/に接続して、ここのビューを検証をクリックして、そこのブラウザでのconsoleをチェックしましょう!

f:id:Saku-Saku:20200427000806j:plain

ビューを検証バックグラウンド ページ

ここでconsoleに文字が流れていれば、無事発火しています。

もしくは、background.jsに

alert("test")

などを仕込んでみても動くと思います。

例のコードを以下にのせておきます。

background.js

// タブ切り替えた時
chrome.tabs.onActivated.addListener(function(tabId) {
  console.log("change tabs");
});

docker + Rails + posgre の設定でハマった

docker上にposgreのDBサーバを立ててRailsするぞの知見。

出ていたエラーとか

psql: FATAL:  password authentication failed for user "posgre"
$ docker exec -it 942a697dd914 bash

$ su - postgres


postgres=# ALTER USER postgres with encrypted password 'vV2kTqnc';
ALTER ROLE

ALTER ROLEが返ってくるかしっかりチェックしましょう。 ; 忘れに注意

http://www.utsushiiro.jp/blog/archives/327

最後は接続できたら

rails db:create
rails db:migrate

このへんも?

pg_hba.conf ここの設定も怪しそうだったりした。 trustにする、md5の認証を変える、とか。 localからの接続をうんぬん。

参考にした記事

psglの中でALTERするのとかの知見ここから http://www.utsushiiro.jp/blog/archives/327

https://stackoverflow.com/questions/29580798/docker-compose-environment-variables

https://github.com/docker-library/postgres/issues/203

https://www.lancard.com/blog/2016/08/16/docker%E5%85%AC%E5%BC%8F%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%A7%E9%96%8B%E7%99%BA%E7%94%A8rdb%E3%82%92%E3%82%B2%E3%83%83%E3%83%88%E3%81%A0%E3%81%9Cpostgresql%E7%B7%A8/