AWS lambdaのlayerにRubyのGemfileとchromedriverをアップして利用する方法のまとめです。
続きを読む【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部分は空白では飛ばせないようです。
そのため、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に独自の配信方法を追加する場合、なぜそのように書くのかの理解が深まりました。
【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をチェックしましょう!
ビューを検証バックグラウンド ページ
ここで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