最近、認証機能の実装をするためにRodauthを使っています。多機能で便利ですね、Rodauth。
しかし、Rodauthでメールを使う機能(パスワードリセット等)を有効化して、メール本文に日本語を使った場合に以下のようなwarningが出ていました。
Non US-ASCII detected and no charset defined. Defaulting to UTF-8, set your own if this is incorrect.
Rodauthのメールを使う機能はgem mailに依存しているので、mailの設定でcharsetをUTF-8にしなければなりません。
とりあえずググる…。
うーん、どちらも Mail::Message でcharsetやcontent_typeを設定しているっぽいけれど、Rodauthは自動でメールが送られているので途中で処理を差し込むことができるのかどうか?というところから調査。
結論から言うと、Email Base FeatureのAuth Methodsに send_email(email) がありました。
これをオーバーライドすればよさそう。 auth_class_eval ブロック内で上記のメソッドをオーバーライドして、そこでcharsetをUTF-8に設定します。
class SampleApp < Roda plugin :rodauth do # 有効にする機能は適当に… enable :login, :logout, :change_password, :reset_password auth_class_eval do # メールを送信する際に呼ばれるメソッドをオーバーライドする # charsetをUTF-8に設定する。これを行わないと、warningが発生するため # @param [Mail::Message] email メールオブジェクト def send_email(email) email.charset = "UTF-8" email.deliver! end end route do |r| # roduthのルーティングを定義 r.rodauth end end end
これで、Rodauth経由で送信されるメールでのwarningは消えました👍めでたしめでたし。